这个问题与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类的析构函数感到困惑。如果您认为我错了,请告诉我。
答案 0 :(得分:3)
每个 new
必须与delete
平衡,否则将泄漏内存。 (您可以使用像std::unique_ptr
这样的类来管理删除操作,但他们仍然会调用delete
。
目前,mainText
在Initilization
函数末尾超出范围,因此您将丢失成功delete
所需的指针。
答案 1 :(得分:1)
我是否必须在析构函数后手动删除对象?
没有
您在Text * mainText = new Text(1);
中致电Initialization
,因此请致电delete mainText
Destroy
致电delete mainText
mainText
不为null,则将调用析构函数mainText
不为空,则将释放其内存无需提及,析构函数已经调用agk::DeleteText
答案 2 :(得分:0)
C ++中的基本经验法则是每个new()必须有一个delete()。这确保了不会发生内存泄漏。 在大多数现代操作系统中,始终没有内存泄漏。程序退出后,操作系统会声明内存并将其放回堆中。 但是当你的程序运行很长时间后会发生什么。这意味着在程序退出之前,您将继续泄漏内存。 因此,最好删除已分配的内存并遵守经验法则。
希望它有所帮助!!