析构函数的实现作为一个函数?

时间:2013-01-12 08:27:12

标签: c++ oop destructor

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

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()函数时,它是否与析构函数完全相同?在任何类似的设置中,析构函数和此函数之间有什么区别?

2 个答案:

答案 0 :(得分:5)

func()~foo()做同样的事情。这就是问题所在。当a超出范围时,系统会自动调用其析构函数~foo(),导致abc被删除两次。解决问题的一种方法是在abc之后的NULL末尾将func()设置为delete,以便在析构函数被调用时{{1} sa delete指针,这是C ++中的一个特例,其中没有任何实际操作并且是有效的操作。

或者,当然,代码可以用实际有意义的方式重写并完成某些事情。

而且要非常清楚,NULLfunc()之间的“差异”是他们被调用的方式/时间,而不是他们所做的事情。用户手动调用~foo(),而当变量超出范围时自动调用func()~foo()可能被调用零次或多次(由程序员决定),但编译器将在此代码中调用func()一次(不多也不少)。

答案 1 :(得分:1)

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

析构

  • 在范围结束时或delete来电时自动调用,可以手动调用,很少是个好主意

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

运行磨机方法

  • 手动调用

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