Является ли вызов деструктора объекта эквивалентным вызову удаления объекта? - PullRequest
4 голосов
/ 13 января 2020
class TrieTree{
private:
    string ch;
    unordered_map<string, TrieTree*> child;
public:
    TrieTree(string val): ch(val){}
    ~TrieTree(){
        for(unordered_map<string, TrieTree*>::iterator itr = this->child.begin();
            itr != this->child.end();
            itr++){

            (itr->second)->~TrieTree();
        }
    }
};

Я обеспокоен, если вышеупомянутый деструктор создаст утечку памяти, так как я не уверен, эквивалентен ли вызов деструктора объекта вызову delete для объекта. Я не могу напрямую вызвать delete для объекта, поскольку намерение состоит в том, чтобы рекурсивно удалить дочерний объект. При вызове delete (itr->second); после (itr->second)->~TrieTree(); я получаю ошибки сегментации, поэтому я предполагаю, что объект мог быть удален после его деструктора?

1 Ответ

7 голосов
/ 13 января 2020

Является ли вызов деструктора объекта эквивалентным вызову удаления объекта?

Нет, это не эквивалентно.

Вызов деструктора объекта уничтожает его.

Вызов delete по указателю уничтожает указанный объект и освобождает память. Поведение не определено, если только указатель не был возвращен при выделении new.

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


PS Избегайте использования голых указателей.

...