是否必须在析构函数之后手动删除对象?
Do I have to manually delete object even after 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++的delete关键字
就我个人而言,我认为删除MainMenu类中的按钮应该是不必要的,但我对是否甚至调用Text类的析构函数感到困惑。如果你认为我错了,请告诉我。
每个 new
必须与delete
平衡,否则您将泄漏内存。(你可以使用像std::unique_ptr
这样的类,它将为你管理删除,但它们仍然在引擎盖下调用delete
)。
目前,mainText
在Initilization
函数的末尾超出了作用域,所以你失去了一个成功的delete
所需的指针。
号是否必须在析构函数之后手动删除对象?
在Initialization
中调用Text * mainText = new Text(1);
,因此在Destroy
中调用delete mainText
当你调用delete mainText
- 如果
mainText
不是null,它的析构函数将被调用 - 如果
mainText
不是空的,它的内存将被释放
agk::DeleteText
c++的基本经验法则是对于每个new()都必须有一个delete()。这确保不会有内存泄漏。在大多数现代操作系统中,从来没有内存泄漏。一旦程序退出,操作系统就会收回内存并将其放回堆中。但是当程序长时间运行时会发生什么呢?这意味着您将继续泄漏内存,直到您的程序退出。因此,最好删除分配的内存,并遵循经验法则。
希望有帮助!!
- 迭代时从向量和内存中删除对象
- C++从对象自己的类中删除对象
- 如何通过对象的类属性删除对象,并返回其对象值?
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 从列表C++中删除对象
- c++ 循环访问对象列表并删除对象
- 从对象本身的容器中删除对象
- 从尝试引用已删除函数的矢量 C++ 中删除对象
- 如何通过指向元组的共享指针删除对象
- 防止通过接口删除对象
- 在 c++ 中从内存中删除对象
- 当对象被删除时,复制被删除对象的对象如何
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- 从内存中删除对象
- 通过C++中的删除方法自行删除对象
- C++ - 析构函数只是释放内存还是实际删除对象
- 如何通过存储在 std::list 中的指针删除对象?
- 如何通过对象参数从指针矢量中删除对象和指针
- 我可以删除对象的右值版本的函数吗?
- 使用对象的索引从矢量中删除对象