我有一个关于析构函数实现类的问题。我理解正确的方法是使用〜运算符,但请看下面的代码:
class foo
{
private:
int* abc;
public:
foo()
{
abc = new int(2);
}
~foo()
{
delete abc;
}
void func()
{
delete abc;
}
}
现在让我们说主要功能定义如下:
int main(int argc, char** argv)
{
foo a;
a.func();
}
在main中调用func()函数时,它是否与析构函数完全相同?在任何类似的设置中,析构函数和此函数之间有什么区别?
答案 0 :(得分:5)
func()
和~foo()
做同样的事情。这就是问题所在。当a
超出范围时,系统会自动调用其析构函数~foo()
,导致abc
被删除两次。解决问题的一种方法是在abc
之后的NULL
末尾将func()
设置为delete
,以便在析构函数被调用时{{1} sa delete
指针,这是C ++中的一个特例,其中没有任何实际操作并且是有效的操作。
或者,当然,代码可以用实际有意义的方式重写并完成某些事情。
而且要非常清楚,NULL
和func()
之间的“差异”是他们被调用的方式/时间,而不是他们所做的事情。用户手动调用~foo()
,而当变量超出范围时自动调用func()
。 ~foo()
可能被调用零次或多次(由程序员决定),但编译器将在此代码中调用func()
一次(不多也不少)。
答案 1 :(得分:1)
除了定义上的明显差异之外,几乎没有差异。
析构
在范围结束时或delete
来电时自动调用,可以手动调用,很少是个好主意
调用成员变量和基类的析构函数。
运行磨机方法
在这种特殊情况下,没有基类和只有成员字段是没有析构函数的int *
ptr,因此在这种情况下除了调用方法之外它们是相同的。