假设我想声明一个指向特定对象的指针数组,例如
Object *objects = new Object[size];
然后向动态分配的数组中添加一些新对象
for (int i = 0; i < size; i++){
Object* obj = new obj;
objects[i] = *obj;
}
仅通过在数组上调用 delete[]
来释放所有内存就足够了吗,还是我必须先遍历数组并在每个对象上调用 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
可以做什么以及如何使用它,请阅读 the documentation .可能对您来说最重要的是:您可以像对数组一样对其进行索引。
关于c++ - 销毁指向数组中对象的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30562859/