【问题标题】:C++ - Proper way to cleanup class on heap with vectorsC++ - 使用向量清理堆上的类的正确方法
【发布时间】:2012-04-20 06:34:44
【问题描述】:

我有这门课:

class GameData
{
public:
    GameData();
    ~GameData();
    vector<Bullet> bullets;
}

在主程序中,我创建了一个 GameData 指针并使用 new 为其分配内存。我知道新的,你也应该删除数据。我上面的向量不是指向子弹的指针向量,只是子弹本身(它们应该是指针吗?)在〜GameData()函数中,我需要什么来清理子弹?我应该确保它是空的,如果不清除它?为了良好的内存管理,正确“删除”它的具体方法是什么。如果我的设计有误,请告诉我应该如何处理。

谢谢

【问题讨论】:

  • @Als 当然。 vector 与标准库中的所有容器一样,具有值语义。向量中的对象的行为就好像它们是向量的成员一样,并且任何时候对象不再在向量中,它都会被正确地破坏。
  • @JamesKanze:是的。但是任何标准库容器都不拥有指针成员(原始或智能)的所有权,即。释放动态内存的责任在于用户或内置的 RAII 语义(在智能指针的情况下)。从容器的角度来看,这是有道理的,因为容器不知道指针元素的所有权。它没有甚至不知道分配是否在 freestore 上。
  • @Als 那是因为“所有权”是一个人为的概念,很少与任何事物相关。容器中的对象不是容器“拥有”的,它们在逻辑上是容器的一部分。相对于任何其他类,容器的唯一特殊性是作为它一部分的对象的数量可以动态变化。如果对象有指针类型,当然是指针是容器的一部分,而不是它们指向的任何东西。

标签: c++ pointers vector


【解决方案1】:

在 ~GameData() 函数中,我需要什么来清理子弹?

没有。由向量的析构函数自动调用完成。

-

我创建了一个 GameData 指针并用 new 为它分配内存。我知道新的,你也应该删除数据

如果您使用某种形式的智能指针,例如std::unique_ptrstd::shared_ptr,则不必这样做。使用智能指针,您不必删除它,因为这是智能指针本身的责任。

从这里阅读智能指针部分:

【讨论】:

  • 感谢您的建议,boost 有这样的东西,我已经研究过了。作为一个明显的新手 C++ 程序员,我想在学习可以让我的生活更轻松的东西之前先学习裸机的东西 :) 谢谢
  • @will: 我认为应该反过来:首先学习如何使用那些让程序员生活更轻松的东西,然后你应该去学习细节,包括手动内存管理@987654324 @ 和 delete.
  • touche :) 一个问题,向量是否到处都在复制 Bullet?它应该是一个指针吗?如果它是一个子弹指针向量,那么我需要自己处理删除吗?
  • 推测,如果他对GameData使用动态分配,那是因为对象的生命周期是由设计决定的。在这种情况下,智能指针,至少是通常的智能指针,弊大于利。当然,我们不知道类的实际语义应该是什么,所以很难说。从名字上看,我预计几乎是一个单例,但我无法想象任何游戏会有一个包含Bullets 的单例。)
  • @will 这取决于游戏中Bullet 的滚动。如果它是一个简单的值,它支持复制,并且无论您拥有哪个实例,只要它的值正确,那么复制就是要走的路。如果它具有特定的行为、定义的生命周期,或者修改(如果它支持)必须被其他人看到,那么你需要一个指向它的指针。
【解决方案2】:

您无需担心GamaData 成员,只需确保删除您的GamaData 实例,因为您使用new 创建它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-23
    • 2018-06-19
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多