即使在析构函数之后我还必须手动删除对象吗?

时间:2015-06-05 07:22:06

标签: c++ destructor

这个问题与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 ++删除关键字类似。

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

  

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

没有

您在Text * mainText = new Text(1);中致电Initialization,因此请致电delete mainText

中的Destroy

致电delete mainText

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

无需提及,析构函数已经调用agk::DeleteText

答案 2 :(得分:0)

C ++中的基本经验法则是每个new()必须有一个delete()。这确保了不会发生内存泄漏。 在大多数现代操作系统中,始终没有内存泄漏。程序退出后,操作系统会声明内存并将其放回堆中。 但是当你的程序运行很长时间后会发生什么。这意味着在程序退出之前,您将继续泄漏内存。 因此,最好删除已分配的内存并遵守经验法则。

希望它有所帮助!!