0

我有一个关于类的析构函数实现的问题。我了解正确的方法是使用 ~ 运算符,但请查看以下代码:

class foo
{
private:
int* abc;

public:
foo()
{
abc = new int(2);
}

~foo()
{
delete abc;
}

void func()
{
delete abc;
}
}

现在让我们说 main 函数定义如下:

int main(int argc, char** argv)
{
foo a;
a.func();
}

在 main 函数调用 func() 时,它的工作方式与析构函数完全相同吗?在任何类似的设置中,析构函数和这个函数有什么区别?

4

2 回答 2

5

func()~foo()做同样的事情。这就是问题所在。当a超出范围时,~foo()会自动调用其析构函数,导致abc被删除两次。解决它的一种方法是在之后的末尾设置abc为,这样当析构函数被调用时,它是一个指针,这是 C++ 中的一种特殊情况,实际上什么都没有做,并且是一个有效的操作。NULLfunc()deletedeleteNULL

或者,当然,可以以一种真正有意义并完成某些事情的方式重写代码。

并且要非常清楚,func()和之间的“区别”~foo()是如何/何时调用它们,而不是它们的作用。func()由用户手动调用,而~foo()在变量超出范围时自动调用。func()可能会被调用零次或多次(取决于程序员),但编译器将~foo()在此代码中只调用一次(不多也不少)。

于 2013-01-12T08:33:45.040 回答
1

除了定义上的明显差异之外,几乎没有差异。

析构函数

  • 在作用域结束或调用时自动delete调用,可以手动调用,很少是一个好主意

  • 调用成员变量和基类的析构函数。

磨坊法

  • 手动调用

在这种特殊情况下,没有基类,只有成员字段是int *没有析构函数的 ptr,所以在这种情况下,除了调用方法之外,它们是相同的。

于 2013-01-12T08:31:49.597 回答