c++ - 即使在析构函数之后,我是否必须手动删除对象?

标签 c++ 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 中的按钮,或者 Text 的析构函数将自动获取调用并删除按钮。

主菜单.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)。

目前,mainTextInitilization 函数结束时超出范围,因此您丢失了成功 delete 所需的指针>.

关于c++ - 即使在析构函数之后,我是否必须手动删除对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30660662/

相关文章:

c++ - 内存未释放 std::list<std::shared_ptr<std::string>> C++

c++ - 使用节点将实例添加到链表

C++ 指针对象位置

c++ - 显式调用 `int` 析构函数 - 为什么需要类型别名?

c# - 析构函数 (c#) 中的异常?

delphi - 为什么我应该在析构函数中使用 Free 而不是 FreeAndNil ?

c++ - 删除指向不完整类型的指针 'Point' ;没有调用析构函数

c++ - std::vector 上的 tbb::parallel_reduce

c++ - 旋转矩阵的奇怪行为

c++ - 如何强制执行析构函数的调用顺序