我有一个关于类的析构函数实现的问题。我知道正确的方法是使用 ~ 运算符,但请看下面的代码:
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() 时,它的工作方式是否与析构函数完全相同?在任何类似设置中,析构函数和此函数有什么区别?
func()
和 ~foo()
做完全相同的事情。这就是问题所在。当 a
超出范围时,它的析构函数 ~foo()
将自动被调用,导致 abc
被删除两次。解决它的一种方法是在 delete
之后的 func()
末尾将 abc
设置为 NULL
>,因此当析构函数被调用时,它 delete
是一个 NULL
指针,这是 C++ 中的一种特殊情况,实际上什么都不做,并且是一个有效的操作。
或者,当然,可以以实际有意义并完成某些事情的方式重写代码。
需要明确的是,func()
和 ~foo()
之间的“区别”在于它们被调用的方式/时间,而不是它们调用的内容做。 func()
由用户手动调用,而 ~foo()
在变量超出范围时自动调用。 func()
可能被调用零次或多次(由程序员决定),但编译器只会调用 ~foo()
一次(不多也不少)在此代码中。
我是一名优秀的程序员,十分优秀!