C++ Point类手动调用析构函数触发double free内存错误求助
问题原因
- 你手动调用了栈分配对象
pt1的析构函数,这是问题的直接诱因:栈对象在离开其作用域(此处就是main函数结束)时,编译器会自动插入析构函数的调用逻辑,你手动调用一次+系统自动调用一次,就会对同一个values指针执行两次delete[],触发double free错误。 - 只有用
new分配的堆对象,才需要你手动调用delete(此时delete会自动触发析构),任何场景下都不要主动调用栈对象的析构函数,这属于C++的常见错误用法。
修复方案
把main函数里的pt1.~Point();这行删掉即可,修改后的代码如下:
int main() { Point pt1(3); pt1.print(); std::cout << pt1[0] << std::endl; // 移除手动调用析构的代码,系统会在main结束时自动处理pt1的销毁 }
额外注意点
你当前的类声明了拷贝构造函数和拷贝赋值运算符,如果你还没实现这两个函数,后续如果发生对象拷贝的场景,也会触发double free:默认的浅拷贝会让两个对象的values指针指向同一块内存,两个对象销毁时各释放一次。更推荐的优化方案是用std::vector<double>代替裸指针double *values,由标准库自动管理内存,不需要自己写析构、拷贝构造、拷贝赋值的逻辑,从根源避免这类内存错误。
内容的提问来源于stack exchange,提问作者Lukas Lamm
相关产品推荐
相关产品推荐

