假设我想声明一个指向特定对象(如
)的指针数组Object *objects = new Object[size];
然后将一些新对象添加到我动态分配的数组
for (int i = 0; i < size; i++){
Object* obj = new obj;
objects[i] = *obj;
}
仅通过调用数组上的delete[]
来释放所有内存就足够了,或者我是否必须首先遍历数组并在每个对象上调用delete
?或者这在实践中是愚蠢的吗?
答案 0 :(得分:5)
您总是必须delete
new
以某种方式delete obj
。这意味着,您需要在每次迭代中Object
以避免泄漏。请注意,您永远不会真正存储obj
new Objects[size]
个点,而是它的副本。
你所知道的方式是非常不寻常的,而且不是很方便:你展示的循环没有任何用处,因为Objects
已经默认构建了你的for (int i = 0; i < size; i++){
objects[i] = newValue;
}
。特别是,它不添加任何元素,它们已经存在。你可以把它留下来。如果要更改数组的内容,例如做更多的初始化,你的循环通常看起来更像这个
Objects
请注意,new Objects[size]
之后std::vector<Object> objects(size);
已经存在!
在实践中,使用
可以更好地std::vector<std::unique_ptr<Object>> objects(size);
(或者,如果上述内容不适合您的用例,
std::vector
,但我觉得这不太可能是这样的。要详细了解{{1}}可以做什么以及如何使用它,请阅读the documentation。可能对你来说最重要的是:你可以像数组一样索引它。
答案 1 :(得分:3)
首先,你必须遵循解除分配的相反顺序。
多次new
的次数delete
,同样次数new []
很多次delete []
// Assuming objects as array of pointers [ Object **objects ]
for (int i = 0; i < size; i++)
{
delete objects[i] ;
}
delete [] objects;
您的正确的分配应该如下:
Object **objects= new Object*[size];
for (int i = 0; i < size; i++) {
objects[i] = new Object;
}
此外,您应该使用智能指针std::unique_ptr
进行轻松的内存管理
std::vector< std::unique_ptr<Object> > objects ;
答案 2 :(得分:1)
Object **objects = new Object *[size];
,然后必须删除数组中的所有指针。所以更好的代码看起来像:
//Allocation:
Object **objects = new Object *[size];
for (int i = 0; i < size; i++){
objects[i] = new Object;
}
//Deletion
for (int i = 0; i < size; i++){
delete objects[i];
}
delete [] objects;
更好的解决方案是使用向量和智能指针,然后根本不需要删除代码。
//Allocation:
vector<unique_ptr<Object>> objects;
for (int i = 0; i < size; i++){
objects.push_back(make_unique(new Object));
}
//Deletion
//Hey where did all the code go.