В приложении ресурс — это любые виртуальные компоненты, используемые приложением, такие как текстура и звук. Можем ли мы очистить ресурс с помощью деструктора? Если можете, приведите демонстрационный пример. Благодарю.
Я пытаюсь использовать деструктор для очистки, но значение все еще там. Почему объект не был удален после вызова деструктора?
#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 ++, но очень необычно. Вы никогда бы не вызвали деструктор напрямую, если бы вы не знали точно, что вы делаете и почему, и никогда не использовали автоматические переменные (по крайней мере, ни один случай, о котором я могу подумать). [Примечание: единственный раз, когда вы обычно вызываете деструктор напрямую, это объект, который был создан с использованием размещения-нового — сама по себе весьма необычная операция.]
Также,
demoObjA.~Demo();
cout << demoObjA.a << endl;
Вы, кажется, спрашиваете, почему demoObjA.a
по-прежнему имеет значение 1
(или любое значение вообще) после вызова деструктора. Проблема в том, что вы вошли в страну неопределенного поведения. Как только вы вызываете деструктор для demoObjA
Объект уничтожен. Вы не можете получить доступ к членам demoObjA
, Если вы делаете, это приводит к Неопределенное поведение. Неопределенное поведение означает «все может случиться», и это включает чтение значения, которое вы ранее сохранили в объекте. Может показаться, что ваш код работает, но это не так.
Вы не удаляете объект, вызывая деструктор напрямую. Деструктор вызывается автоматически, когда объект выходит из области видимости, если объявлен статически (как сейчас, как локальные переменные) или если вы delete
их непосредственно, если они являются динамически объявленными переменными (используя new
).