Joh*_*Liu 4 c++ memory destructor class
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();
}
}
};
Run Code Online (Sandbox Code Playgroud)
我担心上面的析构函数是否会造成内存泄漏,因为我不确定调用对象的析构函数是否等同于调用对象的 delete。我不能直接在对象上调用 delete ,因为目的是递归删除对象的子对象。通过delete (itr->second);在(itr->second)->~TrieTree();我遇到分段错误之后调用,所以我猜测对象可能在其析构函数之后被删除了?
调用对象的析构函数是否等同于在对象上调用 delete?
不,它不是等价的。
调用对象的析构函数会破坏它。
调用delete指针会破坏指向的对象并释放内存。行为是未定义的,除非从分配中返回了指向的对象new。
如果你分配内存new并且只调用析构函数而不释放内存,那么你会泄漏内存。如果您销毁对象并delete在指向的对象被销毁时尝试使用,那么您的程序的行为将是未定义的。
PS 避免使用拥有裸指针。