【问题标题】:Can I free memory depending on if there is something to free? [duplicate]我可以根据是否有要释放的东西来释放内存吗? [复制]
【发布时间】:2017-03-11 16:59:54
【问题描述】:

我正在尝试从一些杂乱的代码中消除所有内存泄漏。我有一个类 Employee 和成员 name_ 在运行时使用 new *char 在堆上分配。现在有些情况下name_Employee的析构函数被调用之前被手动删除。我知道这是不好的做法。但是,在某些情况下,我仍然需要通过析构函数删除 name_。我试过像

Employee::~Employee(){
  if (this->name_)
  {
    delete[] this->name_;
  }
}

if (this->name_ != NULL)
{
  delete[] this->name_;
}

if (this->name_[0] != '\0')
{
  delete[] this->name_;
}

但这些选项没有意识到 name_ 已经在其他地方删除并试图删除不再存在的内容。

所以我需要类似的东西

if (char* name_ not deleted yet)
{
  delte name_
}

有没有办法检查 if 天气成员是否已被删除?

编辑: 感谢您提供已回答我的问题的链接,确实如此!

【问题讨论】:

  • 使用std::string,让标准库实现为您处理内存管理。
  • @NathanOliver 不幸的是,这是不可能的,因为这是一个分配,并且有些东西我不允许更改,例如 name_ 的类型是 char*

标签: c++ memory-leaks


【解决方案1】:

如果您坚持手动管理name_ 的内存(而不是使用std::string),您可以简单地将其封装到您的类中,并通过一些将name_ 设置为@ 的reset() 函数手动将其封装到delete 987654326@删除后。然后在你的析构函数中,你只需检查name_ 是否不是nullptrdelete 它。

【讨论】:

  • 在空指针上调用delete是安全的,因此在调用delete之前不需要检查空值。
  • @RemyLebeau 是的,很好!不知道为什么我决定重新检查它。感谢您的编辑!
猜你喜欢
  • 2015-06-26
  • 2011-01-12
  • 2019-04-21
  • 2010-11-02
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
相关资源
最近更新 更多