调用对象的析构函数是否等同于在对象上调用 delete?
Is calling an object's destructor equivalent to calling delete on the object?
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)->~TrieTree();
之后调用 delete (itr->second);
我遇到了分段错误,所以我猜这个对象可能在它的析构函数之后被删除了?
Is calling an object's destructor equivalent to calling delete on the object?
不,这不等价。
调用对象的析构函数将其销毁。
在指针上调用 delete
会破坏指向的对象并释放内存。除非从分配 new
.
返回指向,否则行为是未定义的
如果你用new
分配内存,只调用析构函数而不释放,那么你会泄漏内存。如果您销毁该对象并尝试在销毁指向的对象时使用 delete
,那么您的程序的行为将是未定义的。
P.S。避免使用拥有裸指针。
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)->~TrieTree();
之后调用 delete (itr->second);
我遇到了分段错误,所以我猜这个对象可能在它的析构函数之后被删除了?
Is calling an object's destructor equivalent to calling delete on the object?
不,这不等价。
调用对象的析构函数将其销毁。
在指针上调用 delete
会破坏指向的对象并释放内存。除非从分配 new
.
如果你用new
分配内存,只调用析构函数而不释放,那么你会泄漏内存。如果您销毁该对象并尝试在销毁指向的对象时使用 delete
,那么您的程序的行为将是未定义的。
P.S。避免使用拥有裸指针。