【发布时间】:2017-10-02 01:44:14
【问题描述】:
我知道当我用 new 初始化一个指针时,我需要删除指针,否则会发生内存泄漏。我有一个这样设置的课程:
class foobar
{
private:
//! Pointer to the global nodal list
int *p_test1;
//! Pointer to the global block label list
int *p_test2;
public:
foobar(int *test1, int *test2)
{
p_test1 = test1;
p_test2 = test2;
}
~foobar()
{
delete p_test1;
delete p_test2;
}
};
现在,当调用析构函数时,程序崩溃并且控制台显示 Program exited with return code -6。
调试窗口指出:
程序接收信号SIGABRT
当我通过调用堆栈时,最后一项是析构函数。堆栈似乎试图释放内存但失败了。
我想知道为什么会这样?使用此类设置释放内存的首选方法是什么。
附带说明,如果我在析构函数中注释掉代码,那么当 foobar 类的实例完成时,指针当然不会被释放。但是,当我调用该类的另一个实例时(假设该实例的创建是由用户按下 GUI 上的按钮决定的),程序就会崩溃。再次,这是为什么?我感觉这与没有正确销毁指针有关。
【问题讨论】:
-
你真的分配内存了吗?您在代码中哪里使用了 new 运算符?
-
在析构函数中使用指针的
delete意味着所有权属于该对象。现在我们只看到您正在传递一个指向对象的指针并存储它,谁分配了它?相关的new在哪里? -
在代码中,我正在调用一个函数,该函数返回指向对象的指针。对象本身不是指针。该对象由另一个类拥有。当这个析构函数发生时,我不想删除该对象。我只想将这些指针重置回“零”或删除它们
-
不要用散文描述你的代码。显示minimal reproducible example。
-
这是一种非常奇怪的 C++ 代码设计,与现代 C++11 之后的源代码应有的样子相去甚远。考虑根本不使用
new/delete,如果你不能避免它(通常你应该能够轻松地使用良好的整体架构),那么我宁愿将new + delete对应的对保留在同一源中,彼此靠近。此时您有newwho-knows-where 和delete这里,这将使阅读+审查此类源变得困难,不得不使用大量推理来查看每个new是否与@987654330 配对@ 正确(显然它已经不是,因为你会崩溃)。