是否需要手动调用析构函数释放动态分配内存?(附C++数组ADT代码)
问题解答
1. 是否需要手动调用析构函数?
不需要。你在main里创建的Array arr(sz)是栈上的自动对象,当程序执行到main函数末尾(作用域结束)时,C++会自动调用它的析构函数~Array(),其中的delete []A;会正确释放动态分配的数组内存,不会出现内存泄漏。
手动调用析构函数(比如arr.~Array();)完全没必要,甚至会触发双重释放的未定义行为——因为对象在作用域结束时还会自动调用一次析构函数,同一块内存被释放两次会导致程序崩溃或异常。
2. 你的代码存在一个严重错误
看构造函数的实现:
Array::Array(int sz) { sz = size; // 这里写反了!正确写法是 size = sz; A = new int [sz]; }
你把参数sz赋值给了未初始化的成员变量size,导致sz变成垃圾值,后续用这个垃圾值分配数组内存,大概率会触发程序崩溃或内存错误。必须改成size = sz;,将传入的合法大小赋值给成员变量size。
补充说明
如果是用new创建的堆上对象(比如Array* arr = new Array(sz);),这时需要手动调用delete arr;来释放对象——delete操作会自动调用析构函数,再释放对象本身的内存。但你的代码里用的是栈对象,完全不需要手动干预。
内容的提问来源于stack exchange,提问作者Pranav Kumar Tripathi
相关产品推荐
相关产品推荐

