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

Nat*_*822 0 c++ oop destructor

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

class foo
{
private:
int* abc;

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

~foo()
{
delete abc;
}

void func()
{
delete abc;
}
}
Run Code Online (Sandbox Code Playgroud)

现在让我们说主要功能定义如下:

int main(int argc, char** argv)
{
foo a;
a.func();
}
Run Code Online (Sandbox Code Playgroud)

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

Cor*_*lks 5

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

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

而只是要真正明确,"差异化"之间func()~foo()如何/他们是所谓的时候,而不是在他们做什么.func()由用户手动调用,而~foo()在变量超出范围时自动调用.func()可能被调用零次或多次(由程序员决定),但编译器将~foo()在此代码中调用一次(不多,不少).