即使在析构函数之后,我是否必须手动删除对象?
Do I have to manually delete object even after destructor?
这个问题与 C++ 游戏引擎有关,称为 AppGameKit (AGK)。
我已经为 Text 创建了一个单独的 class,这样我在创建 Text 时就不必调用 AGK 函数了。这是简单的 class:
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 中调用此 class 时,比如 MainMenu,我是否必须删除 class MainMenu 中的按钮m 使用此 class 创建或将自动调用 Text 的析构函数并删除按钮。
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 class 中的按钮应该是不必要的,但我对是否调用了 Text class 的析构函数感到困惑。如果您认为我错了,请告诉我。
Do I have to manually delete object even after destructor?
没有
您在 Initialization
中调用了 Text * mainText = new Text(1);
,因此在 Destroy
中调用了 delete mainText
当你打电话时delete mainText
- 如果
mainText
不为空,将调用其析构函数
- 如果
mainText
不为空,它的内存将被释放
不用说了,析构函数已经调用了agk::DeleteText
Every new
必须与 delete
平衡,否则你 将 泄漏内存。 (您可以使用 类 之类的 std::unique_ptr
来为您管理删除,但他们仍然会在后台调用 delete
。
目前,mainText
在 Initilization
函数的末尾超出范围,因此您丢失了成功 delete
所需的指针。
C++ 中的基本经验法则是每个 new() 都必须有一个 delete()。这确保不会有内存泄漏。
在大多数现代 OS 中,从来没有内存泄漏。一旦您的程序退出,OS 会收回内存并将其放回堆中。
但是当你的程序长时间 运行 时会发生什么。这意味着您将一直泄漏内存,直到您的程序退出。
所以最好删除分配的内存并遵守经验法则。
希望对您有所帮助!!
这个问题与 C++ 游戏引擎有关,称为 AppGameKit (AGK)。
我已经为 Text 创建了一个单独的 class,这样我在创建 Text 时就不必调用 AGK 函数了。这是简单的 class:
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 中调用此 class 时,比如 MainMenu,我是否必须删除 class MainMenu 中的按钮m 使用此 class 创建或将自动调用 Text 的析构函数并删除按钮。
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 class 中的按钮应该是不必要的,但我对是否调用了 Text class 的析构函数感到困惑。如果您认为我错了,请告诉我。
Do I have to manually delete object even after destructor?
没有
您在 Initialization
中调用了 Text * mainText = new Text(1);
,因此在 Destroy
delete mainText
当你打电话时delete mainText
- 如果
mainText
不为空,将调用其析构函数 - 如果
mainText
不为空,它的内存将被释放
不用说了,析构函数已经调用了agk::DeleteText
Every new
必须与 delete
平衡,否则你 将 泄漏内存。 (您可以使用 类 之类的 std::unique_ptr
来为您管理删除,但他们仍然会在后台调用 delete
。
目前,mainText
在 Initilization
函数的末尾超出范围,因此您丢失了成功 delete
所需的指针。
C++ 中的基本经验法则是每个 new() 都必须有一个 delete()。这确保不会有内存泄漏。 在大多数现代 OS 中,从来没有内存泄漏。一旦您的程序退出,OS 会收回内存并将其放回堆中。 但是当你的程序长时间 运行 时会发生什么。这意味着您将一直泄漏内存,直到您的程序退出。 所以最好删除分配的内存并遵守经验法则。
希望对您有所帮助!!