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

3/8/2017来源:ASP.NET技巧人气:408

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;