析构函数来清理资源

时间:2013-07-01 14:44:29

标签: c++ directx direct3d directx-9 direct3d9

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

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

#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;   
}

2 个答案:

答案 0 :(得分:2)

Demo demoObjA;
demoObjA.~Demo();

你做错了。

demoObjAautomatic variable。您不要手动销毁这样的自动变量。当自动变量超出范围时,它们将被自动销毁。

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

此外,

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

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

答案 1 :(得分:0)

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