1、栈中内存被销毁是在整个main函数执行完后销毁; 而堆中由指针P所指向的内存是可手动控制何时销毁(利用delete )可通过此来显示析构函数的存在;
2、堆中对象数组销毁时用 delete []p;如果没有加中括号就只销毁第一个元素;
delete []p; p = NULL;
加上[]能销毁所有的元素,如果不加只销毁第一个元素
其实就是调用了p中的析构函数
栈中内存被销毁是在整个main函数执行完后销毁; 而堆中由指针P所指向的内存是可手动控制何时销毁(利用delete )可通过此来显示析构函数的存在;
delete []xxx 是析构数组所有对象
delete []p;执行了三次析构函数
若不加[],则只执行一次析构函数
delete p 打印可以看出,只执行了一次析构函数。
为什么需要使用delete []p来销毁?若delete p则只销毁当前指针的,无法释放所有的申请的内存数组。
堆实例化对象需要进行new ,申请内存,若是申请的内存是数组,释放时就需要delete []p。
Coordinate *p = new Coordinate[3] 每一个对象都调用了它的构造函数
delete []p 每一个对象都调用了它的析构函数
delete p 只有第一个对象调用了析构函数
实例化一个数组时,数组中每一个对象都执行了构造函数,因此销毁时每个对象都要执行析构函数:delete []p
如果没有"[]",则只销毁第一个对象(只执行一次析构函数)
(1)在栈中实例化对象数组
Coordinate coor[3];
调用3次构造函数,且程序结束时系统会自动调用3次析构函数,自动回收内存。
(2)在堆中实例化对象数组
Coordinate *p = new Coordinate[3]; p->m_iX = 11; p[0].m_iY = 13; p[1].m_iX = 15; p++; p->m_iY = 17; p--; delete []p; p = NULL;
调用3次构造函数,3次析构函数。要注意的是:
在堆中实例化对象,用完后需要手动释放内存,以免造成内存泄漏;
释放数组内存delete []p,指针p要回到数组第一个元素的位置,且要加中括号[],否则只会调用一次析构函数,释放数组最后一个元素的空间。
在堆区申请一个数组,delete时不加[]只会销毁数组的第一个元素
Coordinate* p = new Coordinate[3]; delete p; delete []p;
delete p 只执行一次析构函数。
delete []p 执行三次析构函数。
delete []p;如果销毁的时候没有加 [] 那么销毁的只是第一个元素
六次构造函数(三次栈+三次堆的实例化)---栈和堆的各三次输出(堆是从第三个元素到第一个元素的倒序)--三次堆的析构函数--结束后三次栈的析构函数