Деструктор для очистки ресурса

В приложении ресурс — это любые виртуальные компоненты, используемые приложением, такие как текстура и звук. Можем ли мы очистить ресурс с помощью деструктора? Если можете, приведите демонстрационный пример. Благодарю.

Я пытаюсь использовать деструктор для очистки, но значение все еще там. Почему объект не был удален после вызова деструктора?

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

-3

Решение

Demo demoObjA;
demoObjA.~Demo();

Ты делаешь это неправильно.

demoObjA является автоматическая переменная. Вы не уничтожаете вручную автоматическую переменную, подобную этой. Автоматические переменные будут автоматически уничтожены, когда они выпадают из области видимости.

Код, который вы написали для вызова деструктора, допустим в C ++, но очень необычно. Вы никогда бы не вызвали деструктор напрямую, если бы вы не знали точно, что вы делаете и почему, и никогда не использовали автоматические переменные (по крайней мере, ни один случай, о котором я могу подумать). [Примечание: единственный раз, когда вы обычно вызываете деструктор напрямую, это объект, который был создан с использованием размещения-нового — сама по себе весьма необычная операция.]

Также,

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

Вы, кажется, спрашиваете, почему demoObjA.a по-прежнему имеет значение 1 (или любое значение вообще) после вызова деструктора. Проблема в том, что вы вошли в страну неопределенного поведения. Как только вы вызываете деструктор для demoObjAОбъект уничтожен. Вы не можете получить доступ к членам demoObjA, Если вы делаете, это приводит к Неопределенное поведение. Неопределенное поведение означает «все может случиться», и это включает чтение значения, которое вы ранее сохранили в объекте. Может показаться, что ваш код работает, но это не так.

2

Другие решения

Вы не удаляете объект, вызывая деструктор напрямую. Деструктор вызывается автоматически, когда объект выходит из области видимости, если объявлен статически (как сейчас, как локальные переменные) или если вы delete их непосредственно, если они являются динамически объявленными переменными (используя new).

0

По вопросам рекламы [email protected]