首页 > 编程 > C++ > 正文

C++开发中的栈、堆和内存分配

2019-11-06 06:34:23
字体:
来源:转载
供稿:网友

Output函数

Ostream& Operator <<(ostream& os, const String & str){   Os<<str.get_c_str();   return os; }

 创建对象

 Stack heap

当你调用函数,函数本身就会形成一个stack,用来放他所接收的参数,自动消失.

堆 则是由藏做系统提供的一块空间,程序可以动态分配 但是必须自己手动消灭

Class Cmoplex{...}   ... {   Complex c1 (1,2); // ①<-----这时候,析构函数会自动调用 ,来清理,他用的是 stack   Complex* p = new complex(3);}

如果在①前加个static,则其生命在作用域之后仍在存在,程序结束时才会出现析构函数。-------------------------------------------------------------------------------------------------------------------------------------------------------------

全局对象

Calss complex{.....}     ...Complex c3 (1,2);   Int main()          { ...}

c3便是所谓的 global object他的生命在整个程序结束之后才会结束,

当然,也可以将其看做 static object 其作用域是整个程序

Class complex{...}...{  Complex* p = new complex;         Delete p;    }  

 p所指的便是 heap object其生命在delete之后消失。

如果没有删掉,就会出现memory leak;p所指的heap object仍然存在,但是p已经没了  。

New 可以被分解为三个动作:

Complex * pc = new Complex(1,2);

①void *mem = operator new (sizeof(complex));//分配内存

②pc = static_cast<complex*>(mem);   //转型

③pc->complex::complex(1,2) //构造函数                         

Delete :先调用析构函数,在释放内存

①string::~String(ps);析构函数:将字符串指针指向的那块东西删掉。

②operator deldete(ps); 释放内存

 

动态分配所得的内存块

New一下得到8个字节,在调试模式下多得一些字节

Complex 是 8  字节  上下(粉色)作用是来记录内存块的大小

动态分配所得的array

Complex * p = new Complex[3];

String *p = new String[3] 第二个是用array new来分配空间的

array new 必须要搭配 array delete;


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选