首页 > 解决方案 > 调用对象的析构函数是否等同于在对象上调用 delete?

问题描述

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 (itr->second);通过在我遇到分段错误之后调用(itr->second)->~TrieTree();,所以我猜测该对象可能在其析构函数后被删除?

标签: c++classmemorydestructor

解决方案


调用对象的析构函数是否等同于在对象上调用 delete?

不,它不等同。

调用对象的析构函数会破坏它。

调用delete指针会破坏指向的对象并释放内存。行为是未定义的,除非指向是从分配返回的new

如果你分配内存new并且只调用析构函数而不解除分配,那么你将泄漏内存。如果您销毁该对象并在指向的对象被销毁时尝试使用delete,那么您的程序的行为将是未定义的。


PS 避免使用拥有裸指针。


推荐阅读