c++ - 调用对象的析构函数是否等同于在对象上调用 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();
,所以我猜测该对象可能在其析构函数后被删除?
解决方案
调用对象的析构函数是否等同于在对象上调用 delete?
不,它不等同。
调用对象的析构函数会破坏它。
调用delete
指针会破坏指向的对象并释放内存。行为是未定义的,除非指向是从分配返回的new
。
如果你分配内存new
并且只调用析构函数而不解除分配,那么你将泄漏内存。如果您销毁该对象并在指向的对象被销毁时尝试使用delete
,那么您的程序的行为将是未定义的。
PS 避免使用拥有裸指针。
推荐阅读
- intellij-idea - 为什么 Intellij IDEA 说已使用的属性未使用?
- php - 使用 PHP 和 MySQLi 循环数组
- objective-c - 从Objective-C中的类类型实例化对象
- macos - 如何在mac终端中创建一个循环以相反的顺序触摸文件
- regex - Oracle 18c - REGEXP_REPLACE 的替代品
- javascript - 如何从 Javascript 中的 vuetify 多选 v-autocomplete 中选择(复选框)一个值?
- algorithm - 将循环分成更小的部分
- html - 如何延迟 Angular doCheck 执行,直到用户的值完全输入到输入中?
- python - 如何在树形图上添加 % 信息?
- r - How to create a binary variable for logistic regression by using key words in text variable