cpp array new的底层实现相比较于new只是多了几次构造函数的调用,同时array delete相比较于delete只是多了几次析构函数的调用,对于内存的分配和释放,array版本和非array版本都只进行了一次。
array new的底层实现
1 | Complex* pc = new Complex[3]; |
1 | void* mem = operator new(sizeof(Complex)*3); |
new array的底层实现仅仅是多调用了几次构造和析构函数。
编程时要求array new和array delete必须配套使用,否则可能产生内存泄漏。也就是上述代码中必须要使用delete [] pc,不能漏掉[]。
不过上述代码即使漏掉了[]也不存在内存泄露问题,漏掉了就会只调用一次析构函数,但是Complex对象中不存在指针对象,没有指向其它的空间,仅仅只是实部和虚部的整形变量,因此,其析构函数是无意义的。
下面的代码如果没有使用array delete会造成内存泄漏,因为对于string对象其成员是指针,实际的字符串存放在另外的空间,因此,string的析构函数是有意义的,漏掉了[]会导致两个string的内存空间无法释放,造成内尺寸泄漏。
1 | string* ps = new string[3]; |
上述两种情形的内存布局如下图: