【发布时间】:2012-04-20 06:34:44
【问题描述】:
我有这门课:
class GameData
{
public:
GameData();
~GameData();
vector<Bullet> bullets;
}
在主程序中,我创建了一个 GameData 指针并使用 new 为其分配内存。我知道新的,你也应该删除数据。我上面的向量不是指向子弹的指针向量,只是子弹本身(它们应该是指针吗?)在〜GameData()函数中,我需要什么来清理子弹?我应该确保它是空的,如果不清除它?为了良好的内存管理,正确“删除”它的具体方法是什么。如果我的设计有误,请告诉我应该如何处理。
谢谢
【问题讨论】:
-
@Als 当然。
vector与标准库中的所有容器一样,具有值语义。向量中的对象的行为就好像它们是向量的成员一样,并且任何时候对象不再在向量中,它都会被正确地破坏。 -
@JamesKanze:是的。但是任何标准库容器都不拥有指针成员(原始或智能)的所有权,即。释放动态内存的责任在于用户或内置的 RAII 语义(在智能指针的情况下)。从容器的角度来看,这是有道理的,因为容器不知道指针元素的所有权。它没有甚至不知道分配是否在 freestore 上。
-
@Als 那是因为“所有权”是一个人为的概念,很少与任何事物相关。容器中的对象不是容器“拥有”的,它们在逻辑上是容器的一部分。相对于任何其他类,容器的唯一特殊性是作为它一部分的对象的数量可以动态变化。如果对象有指针类型,当然是指针是容器的一部分,而不是它们指向的任何东西。