堆栈
栈(stack):存在于某个作用域的一块内存空间。
堆(heap):由操作系统提供的一块global内存空间,程序可动态获取若干块。
{
Complex c1(1, 1);
Complex *c2 = new Complex(1, 1);
}
c1内存空间在栈上,c2内存空间在堆上。
new:
Complex *p = new Complex(1,1); //编译器转换new为3个步骤:
(1). void *vp = operate new (sizeof(Complex)); //分配内存
(2). Complex *p = static_cast(Complex*)vp; //转型
(3). p->Complex::Complex(1,1); //构造函数
delete:
delete p; //编译器会转换为2个步骤:
(1). p->Complex::~Complex(); //对象的析构函数
(2). operate delete(p); //释放p指向的内存
数据在动态分配内存中的占用方式:
debug版本的对象在内存中的调试字节占用36bytes
每个对象占用的内存空间16bytes对齐
上下各一个字节都存放该对象的大小和写入信息。
new [], delete [] 搭配使用
String* p = new String[3]; String* p = new String[3];
delete [] p; delete p;
右侧的写法就可能造成内存泄漏,原因:有部分类成员的析构函数没有调用。
可能而不是一定的原因,如类的析构函数没有内存释放的调用,则不会诱发内存泄漏。