C++复杂类型数组调用delete[]的内存释放规则咨询
问题解答
这两种数组的内存释放逻辑完全不同,分场景说明:
- 场景1:数组存储的是类A的实例,且数组是通过
new A[数组长度]的方式在堆上分配的
这种情况下直接调用delete[]即可,不需要额外操作。delete[]会自动遍历数组的每个元素,依次调用类A的析构函数释放每个实例内部的资源,最后再释放整块数组的内存空间。 - 场景2:数组存储的是类A的指针,且数组是通过
new A*[数组长度]的方式在堆上分配的
这种情况下必须先手动遍历数组,对每个通过new单独分配的类A实例指针执行delete arr[i]释放对应实例的资源,之后才能调用delete[]释放数组本身的内存。如果直接调用delete[],只会释放存储指针的数组的内存,每个指针指向的堆上的类A实例会完全泄漏,不会被回收。
注意:如果数组里的指针指向栈上实例、静态存储区实例或者其他非
new分配的内存,不要执行delete arr[i],否则会触发未定义行为。
内容的提问来源于stack exchange,提问作者CS2000
相关产品推荐
相关产品推荐

