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

标签 c++ class memory destructor

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。我无法直接对对象调用删除,因为目的是递归删除对象的子对象。通过在 (itr->second)->~TrieTree(); 之后调用 delete (itr->second); 我遇到了段错误,所以我猜测该对象可能在其析构函数之后被删除?

最佳答案

Is calling an object's destructor equivalent to calling delete on the object?

不,它不等同。

调用对象的析构函数会销毁它。

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

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

<小时/>

附注避免使用拥有裸指针。

关于c++ - 调用对象的析构函数是否等同于在对象上调用delete?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59709266/

相关文章:

c++ - 如何从指向指针数组的指针中删除对象?

c++ - 在C++中初始化结构的成员变量

ios - swift iOS : Memory leaks with the following code (video player)

php - php 读取 1Gb 文件的内存限制应该是多少?

linux - 如何限制 Linux 上的进程内存利用率(例如使用 BSD::Resource)

c++ - 如何使用来自 std::string 的 rapidjson 进行解析?

c++ - Eigen 类取矩阵每一行的平均值(计算列 vector 的质心)

java - 使用 .equals() 和 == 运算符比较两个对象

c++ - 重载流插入和提取操作符

python - 自修改Python类