Как правильно определить деструктор - PullRequest
4 голосов
/ 18 августа 2011

Я относительно новичок в C ++ (и программировании в целом), поэтому, пожалуйста, прости меня, если вопрос не совсем понятен сразу.

У меня есть программа, в которой создано определенное количество объектов внутренне определенного класса [назовем это "class1"]. Программа отлично работает, и объекты делают то, что должны.

Проблема, которую я сейчас пытаюсь решить, заключается в следующем: эти объекты не уничтожаются (и, следовательно, память не выделяется) до завершения программы, но эта память мне нужна раньше.

Среди других членов класса есть объекты других внутренне определенных классов (у которых также есть члены, которые являются объектами третьего класса).

Мой вопрос заключается в следующем: как правильно определить деструктор для объектов «class1», чтобы все данные были отменены и память была освобождена?

Я обнаружил (возможно, это уже было очевидно для вас), что деструктор типа

class1::~class1(void) {

}

не будет работать (я определил похожие деструкторы для всех внутренних классов).

Читая вокруг, я понял, что моя ошибка может быть в том, что это деструктор, который ничего не делает. Как мне это решить?

Спасибо всем, кто ответит / поможет / прокомментирует.

Federico

Ответы [ 4 ]

12 голосов
/ 18 августа 2011

В C ++ вам нужно освободить память вручную. Там нет сборщика мусора. Очевидно, вам нужно освободить память вручную внутри деструктора. Если вы выделили память с помощью new , вам необходимо использовать delete для каждого ресурса, выделенного с помощью new внутри деконструктора, например:

class1::~class1(void)
{
    delete resource1;
    delete resource2;
    etc...
}
3 голосов
/ 18 августа 2011

Если вы выделяете память динамически, вам нужно освободить ее в деструкторе, но лучшим решением будет использование некоторого интеллектуального указателя для хранения динамических данных - std::auto_ptr или std::shared_ptr.Тогда вам не нужно будет явно освобождать память - это будет сделано автоматически в умном деструкторе указателя.

2 голосов
/ 18 августа 2011

Сначала вы должны попытаться разместить ваши объекты в стеке:

Object obj;

, чтобы вам не пришлось беспокоиться о распределении памяти.Недостатком является то, что срок службы объекта ограничен текущей областью действия.

Если это не подходит для вас, вам следует рассмотреть возможность использования интеллектуальных указателей.Если это не вариант, используйте new / delete для создания / уничтожения ваших объектов.Но вы должны быть осторожны, каждый new должен привести к delete в определенный момент времени.

2 голосов
/ 18 августа 2011

Память в стеке

Если внутри вашего класса нет выделенного кучи объекта, вам нет необходимости явно определять деструктор вашего класса. Генерируемый компилятором должен хорошо справляться с задачей, то есть вызывать деструкторы для объектов базового класса и объектов-членов и т. Д.

Память в куче - ручное управление памятью

Если внутри вашего класса есть какие-либо объекты, выделенные в куче, вам нужно вручную освободить их в деструкторе. Убедитесь, что они правильно освобождены на всех возможных точках выхода , например, обработайте исключения и освободите ресурсы.

Память на куче - RAII

В качестве альтернативы вы можете использовать некоторый четко определенный класс RAII для автоматической обработки управления ресурсами, например, scoped_ptr, scoped_array в Boost, shared_ptr в STL и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...