-3

在应用程序中,资源是应用程序使用的任何虚拟组件,例如纹理和声音。我们可以用析构函数清理资源吗?如果可以,请提供一个演示示例。谢谢。

我尝试使用析构函数进行清理,但值仍然存在。为什么调用析构函数后对象没有被删除?

#include <iostream>
using namespace std;

class Demo
{   
public:
Demo();       // Constructor prototype
~Demo();      // Destructor prototype

int a;
};

Demo::Demo()        // Constructor function definition
{   
cout << "An object has just been defined, so the constructor"
    << " is running.\n";
a = 1;
}

Demo::~Demo()       // Destructor function definition
{  
cout << "Now the destructor is running.\n";         
}

int main()
{   
cout << "This is displayed before the objects are created.\n";
Demo demoObjA, demoObjB;   // Define two Demo objects

cout << demoObjA.a << endl;
cout << "The objects now exist, but are about to be destroyed.\n";
demoObjA.~Demo();
cout << endl;

cout << demoObjA.a << endl;

cin.get();
return 0;   
}
4

2 回答 2

2
Demo demoObjA;
demoObjA.~Demo();

你这样做是错的。

demoObjA是一个自动变量。您不会像这样手动销毁自动变量。自动变量超出范围时将自动销毁。

您编写的调用析构函数的代码在 C++ 中是合法的,但非常不寻常。你永远不会直接调用析构函数,除非你确切地知道你在做什么以及为什么,并且永远不会调用自动变量(至少不是我能想到的任何情况)。[注意:您通常会直接调用析构函数的唯一一次是在已使用placement-new 实例化的对象上——这本身就是一个非常不寻常的操作。]

还,

demoObjA.~Demo();
cout << demoObjA.a << endl;

您似乎在问为什么在调用析构函数后demoObjA.a仍然有一个值(或任何值)。1问题是,你已经进入了未定义行为的领域。一旦你调用了析构函数demoObjA,对象就会被销毁。然后,您无法访问demoObjA. 如果你这样做,它会导致Undefined Behavior。未定义的行为意味着“任何事情都可能发生”,其中包括读取您先前存储在对象中的值。看起来您的代码正在运行,但事实并非如此。

于 2013-07-01T15:04:52.540 回答
0

您不会通过直接调用析构函数来删除对象。如果静态声明的对象超出范围(就像现在一样,作为局部变量),或者如果delete它们是动态声明的变量(使用new),则直接调用析构函数时会自动调用析构函数。

于 2013-07-01T15:01:48.300 回答