用于清理资源的析构函数

Destructor to clean up resource

本文关键字:析构函数 资源 用于      更新时间:2023-10-16

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

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

#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;   
}
Demo demoObjA;
demoObjA.~Demo();

你做错了。

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

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

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

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

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