即使在析构函数之后,我也必须手动删除对象吗? 这个问题与C++游戏引擎有关,称为AppGAMKIT(AGK)。
我为文本创建了一个单独的类,这样在创建文本时就不必调用AGK函数。下面是一个简单的类: Text.h即使在析构函数之后,我也必须手动删除对象吗? 这个问题与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(); }
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:请仔细阅读我答案的最后一部分。你不认为我说了完全相同的话。阅读并决定!!!我很抱歉,这个答案完全错了。当然,当进程终止时,操作系统将回收内存,但是