【问题标题】:Do I have to manually delete object even after destructor?即使在析构函数之后,我是否也必须手动删除对象?
【发布时间】:2015-06-05 16:29:03
【问题描述】:

这个问题与 C++ 游戏引擎有关,称为 AppGameKit (AGK)。

我为 Text 创建了一个单独的类,这样我在创建 Text 时就不必调用 AGK 函数。这是简单的类:

Text.h

class Text 
{
  private: int _ID;
  void Destory();

  public:
    void AddText();
  Text(int ID);
  ~Text();
};

Text::Destroy() 
{
  agk::DeleteText(_ID);
}

Text::~Text() 
{
  Text::Destroy();
}

现在我的问题是当我在任何其他类中调用这个类时,比如 MainMenu,我是否必须删除我正在使用这个类创建的 MainMenu 类中的按钮,或者 Text 的析构函数会自动获取调用并删除按钮。

MainMenu.cpp

MainMenu::Initilization()
{
        Text * mainText = new Text(1);
}

MainMenu::Destory()
{
       agk::DeleteText(1); // DO I HAVE TO DO THIS?
}

MainMenu::~MainMenu()
{
       MainMenu::Destory(); 
}

调用AGK 函数delete 来删除文本,从而释放内存。类似于 C++ delete 关键字。

就个人而言,我认为删除 MainMenu 类中的按钮应该是不必要的,但我对是否调用 Text 类的析构函数感到困惑。如果您认为我错了,请告诉我。

【问题讨论】:

  • 因为你没有 delete mainText 析构函数根本不会被调用。实际上,由于mainTextInitilization 函数内部的一个局部变量,如果你不将指针保存在其他地方以便delete 它会发生内存泄漏。
  • 如果您不想调用 delete,您应该使用 std::unique_ptr 或其他智能指针之一。永远记住 RAII。
  • 你真的不应该有一个名为Destroy().的方法,所有这些都应该在析构函数中,人们希望在其中找到它,并且不能意外调用它。
  • @HaukeS 这应该是目前所有这些问题的公认答案。

标签: c++ destructor


【解决方案1】:

每个 new 必须与delete 平衡,否则您泄漏内存。 (您可以使用像 std::unique_ptr 这样的类,它会为您管理删除,但他们仍然在后台调用 delete

目前,mainTextInitilization 函数末尾超出范围,因此您丢失了成功delete 所需的指针。

【讨论】:

    【解决方案2】:

    我是否必须在析构函数之后手动删除对象?

    没有。


    您在Initialization 中调用了Text * mainText = new Text(1);,所以在Destroy 中调用delete mainText

    当您致电delete mainText

    • 如果mainText 不为空,则将调用其析构函数
    • 如果mainText 不为空,则其内存将被释放

    不用说,析构函数已经调用了agk::DeleteText

    【讨论】:

      【解决方案3】:

      C++ 中的基本经验法则是每个 new() 都必须有一个 delete()。这确保不会有内存泄漏。 在大多数现代操作系统中,从来没有内存泄漏。程序退出后,操作系统会收回内存并将其放回堆中。 但是当你的程序运行很长时间时会发生什么。这意味着您将一直泄漏内存,直到您的程序退出。 所以最好删除分配的内存并遵守经验法则。

      希望对你有帮助!

      【讨论】:

      • 很抱歉,这个答案是完全错误的。当然,当进程终止时,操作系统会回收内存,但是在它运行时它仍然会泄漏内存,即无缘无故地“使用”内存,在指针的情况下用不可访问的数据填充它..
      • @crembo :请仔细阅读我回答的最后一部分。你认为我说的完全一样。阅读并决定!然后投反对票
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 2014-02-14
      • 2012-01-22
      • 2013-05-21
      • 2019-02-01
      • 1970-01-01
      相关资源
      最近更新 更多