指针重赋值前使用delete[]是否冗余?代码示例及疑问求解
关于代码中
delete[]语句的正确性分析 必须保留delete[] pointer;这行代码,ChatGPT给出的结论完全错误,原因如下:
- C++堆内存不会自动释放:通过
new T[4]分配的是堆内存,C++没有自动垃圾回收机制,若不显式调用delete[]释放,这块内存会一直被占用,直到程序结束才会被操作系统回收,属于明确的内存泄漏。 - 指针重赋值会丢失堆内存地址:如果去掉
delete[]语句,直接将pointer赋值为&object(栈上对象的地址),原本指向堆数组的指针会被覆盖,后续再也无法定位到这块堆内存,导致内存永久泄漏。 - 当前
delete[]的调用完全合法:这行代码是在指针被重赋值之前执行的,此时pointer仍然指向new[]分配的堆数组起始地址,调用delete[]是符合C++标准的正确操作,不会产生未定义行为。只有当指针指向非new[]分配的内存(比如后续的&object)时,调用delete[]才会触发未定义行为,但当前代码的顺序完全没问题。
正确的代码就是保留delete[]语句,避免内存泄漏:
int main(){ T object; T* pointer = new T[4]; delete[] pointer; // 正确释放堆内存,无冗余、无错误 pointer = &object; }
内容的提问来源于stack exchange,提问作者LiDa Cute
相关产品推荐
相关产品推荐

