在应用程序中,资源是应用程序使用的任何虚拟组件,例如纹理和声音。我们可以用析构函数清理资源吗?如果可以的话,提供一个演示示例。谢谢。
我尝试使用析构函数进行清理,但值仍然存在。调用析构函数后为什么没有删除对象?
#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;
}
答案 0 :(得分:2)
Demo demoObjA;
demoObjA.~Demo();
你做错了。
demoObjA
是automatic variable。您不要手动销毁这样的自动变量。当自动变量超出范围时,它们将被自动销毁。
您编写的用于调用析构函数的代码在C ++中是合法的,但非常不寻常。你永远不会直接调用析构函数,除非你确切地知道你在做什么以及为什么,而且永远不会知道自动变量(至少在任何情况下我都不会想到)。 [注意:你通常直接调用析构函数的唯一一次是在使用placement-new实例化的对象上 - 这本身就是一种非常不寻常的操作。]
此外,
demoObjA.~Demo();
cout << demoObjA.a << endl;
您似乎在询问为什么demoObjA.a
在调用析构函数后仍然具有值1
(或任何值)。问题是,你已经进入了未定义行为之地。一旦调用demoObjA
的析构函数,该对象就会被销毁。然后,您无法访问demoObjA
的成员。如果这样做,则会产生Undefined Behavior。未定义的行为意味着“任何事情都可能发生”,包括读取先前存储在对象中的值。它可能看起来像你的代码正在运行,但事实并非如此。
答案 1 :(得分:0)
您不能通过直接调用析构函数来删除对象。如果对象超出范围(如果它们现在是作为局部变量),或者如果它们是动态声明的变量delete
,则会自动调用析构函数(使用new
)。