用于清理资源的析构函数
Destructor to clean up resource
在应用程序中,资源是应用程序使用的任何虚拟组件,例如纹理和声音。我们可以使用析构函数清理资源吗?如果可以,请提供一个演示示例。谢谢。
我尝试使用析构函数进行清理,但值仍然存在。为什么调用析构函数后对象没有删除?
#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
它们,则会自动调用析构函数。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 析构函数提供删除资源的"may be used uninitialized"
- 锁定构造函数和析构函数中的共享资源
- 指向"raw"资源的指针是否应该在析构函数中归零?
- 用于清理资源的析构函数
- 多态性=资源泄漏中基类缺少虚拟析构函数
- 只能在析构函数中释放一次的资源的惯用移动构造器