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

Do I have to manually delete object even after destructor?

本文关键字:删除 对象 之后 析构函数 是否      更新时间:2023-10-16

这个问题与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类中的按钮,或者文本的析构函数会自动被调用并删除按钮。

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类的析构函数感到困惑。如果你认为我错了,请告诉我。

每个 new必须与delete平衡,否则您泄漏内存。(你可以使用像std::unique_ptr这样的类,它将为你管理删除,但它们仍然在引擎盖下调用delete)。

目前,mainTextInitilization函数的末尾超出了作用域,所以你失去了一个成功的delete所需的指针。

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


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

当你调用delete mainText

  • 如果mainText不是null,它的析构函数将被调用
  • 如果mainText不是空的,它的内存将被释放
无需提及,析构函数已经调用了agk::DeleteText

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

希望有帮助!!