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

Do I have to manually delete object even after destructor?

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

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

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();
}

现在我的问题是,当我在任何其他 class 中调用此 class 时,比如 MainMenu,我是否必须删除 class MainMenu 中的按钮m 使用此 class 创建或将自动调用 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 class 中的按钮应该是不必要的,但我对是否调用了 Text class 的析构函数感到困惑。如果您认为我错了,请告诉我。

Do I have to manually delete object even after destructor?

没有


您在 Initialization 中调用了 Text * mainText = new Text(1);,因此在 Destroy

中调用了 delete mainText

当你打电话时delete mainText

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

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

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

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

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

希望对您有所帮助!!