c++ - 销毁指向数组中对象的指针

标签 c++ arrays

假设我想声明一个指向特定对象的指针数组,例如

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/

相关文章:

c++ - 递归可变参数模板无法推导出参数

javascript - 在 C++ 中嵌入脚本引擎

c++ - 为什么不能在这个状态下执行 'ifstream'

arrays - perl 中的类 C 数组

c++ - 从对象或库文件中识别C++的版本(例如c++ 11,c++ 14)

c++ - 如何使用 C++ 与命令提示符 (CMD) 进行通信?

java - 如何使用 Spring Boot 摄取 Json 字符串数组

java - 什么是同时存储 Integer 和 array[String] 值的良好数据结构?

javascript - 为什么我的表单中有未定义/隐藏的元素?

ios - 如何从嵌套数组中的 NSmutablearray 获取对象值?