即使在析构函数之后,我也必须手动删除对象吗? 这个问题与C++游戏引擎有关,称为AppGAMKIT(AGK)。

即使在析构函数之后,我也必须手动删除对象吗? 这个问题与C++游戏引擎有关,称为AppGAMKIT(AGK)。,c++,destructor,C++,Destructor,我为文本创建了一个单独的类,这样在创建文本时就不必调用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(); }

我为文本创建了一个单独的类,这样在创建文本时就不必调用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中的按钮,或者文本的析构函数是否会自动被调用并删除按钮

主菜单.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++删除关键字.< /P> 就我个人而言,我认为删除MainMenu类中的按钮应该是不必要的,但我对是否调用Text类的析构函数感到困惑。如果你认为我错了,请告诉我

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

没有


您调用了
Text*mainText=newtext(1)
初始化中
,因此在
销毁中调用
删除主文本

当您调用
delete mainText

  • 如果
    mainText
    不为null,将调用其析构函数
  • 如果
    mainText
    不为空,则其内存将被释放
不用说,析构函数已经调用了
agk::DeleteText

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

没有


您调用了
Text*mainText=newtext(1)
初始化中
,因此在
销毁中调用
删除主文本

当您调用
delete mainText

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

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

每个
新的
必须与
删除
平衡,否则会泄漏内存。(您可以使用诸如
std::unique_ptr
之类的类,这些类将为您管理删除操作,但它们仍然在引擎盖下调用
delete


目前,
mainText
Initilization
函数结束时超出了范围,因此您丢失了成功
delete
所需的指针每一个
新的
必须与
delete
平衡,否则您将泄漏内存。(您可以使用诸如
std::unique_ptr
之类的类,这些类将为您管理删除操作,但它们仍然在引擎盖下调用
delete


目前,主文本< /代码>在初始化> < /C>函数结束时超出了范围,因此,您丢失了一个成功的<代码>删除> />代码所需的指针。

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


希望能有帮助
希望能有帮助

由于不
delete
mainText
,因此根本不会调用析构函数。实际上,由于
mainText
Initilization
函数中的一个局部变量,如果您不将指针保存在其他位置,以便
delete
它将导致内存泄漏。如果您不想调用delete,则应使用std::unique\ptr或其他智能指针之一。永远记住RAII。你不应该真正拥有一个名为
Destroy()的方法。
应该在析构函数中的所有内容,人们希望在其中找到它,这应该是目前所有这些问题的公认答案。因为你没有
delete
mainText
,所以根本不会调用析构函数。实际上,由于
mainText
Initilization
函数中的一个局部变量,如果您不将指针保存在其他位置,以便
delete
它将导致内存泄漏。如果您不想调用delete,则应使用std::unique\ptr或其他智能指针之一。永远记住RAII。你不应该真正拥有一个名为
Destroy()的方法。
析构函数中应该包含的所有内容,人们希望在这里找到它,并且不能意外调用它。@HaukeS这应该是目前所有这些问题的公认答案。是的,正在对
mainText
调用析构函数。i、 e.
mainText
this
Yes,正在
mainText
上调用析构函数。i、 e.
mainText
this
对不起,这个答案完全错了。当然,当进程终止时,操作系统将回收内存,但在运行过程中,它仍然会泄漏内存,即“无故使用”内存,在指针出现时用无法访问的数据填充内存。@crembo:请仔细阅读我答案的最后一部分。你不认为我说了完全相同的话。阅读并决定!!!我很抱歉,这个答案完全错了。当然,当进程终止时,操作系统将回收内存,但是