在数组中自由记忆的适当方法,该数组将指针固定在对象上
The proper way to free memory in an array that holds pointers to objects
假设我有数组:
Geometry* shapes[MAX_SIZE];
然后我像这样填充数组:
for (int i = 0; i < MAX_SIZE; ++i)
{
shapes[i] = new Geometry;
}
将 delete [] shapes;
做这项工作,否则我必须通过数组循环并逐一删除:
for (int i = 0; i < MAX_SIZE; ++i)
{
delete shapes[i];
}
我认为我必须循环并单独删除每个指针,因为删除[]调用数组中对象的破坏者,这并不意味着内存将被释放。但是我需要经验丰富的人的确认。
您有一系列普通的指针。每个指针都指向动态分配的个体Geometry
。因此,您需要在每个指针中调用delete
。delete []
用于动态分配的数组。
在现实生活中,您将使用自动管理资源的类型,以免手动删除指针。选项包括std::unique_ptr<Geometry>
的数组,或旨在管理动态分配的对象的容器,例如boost::pointer_container
库中可用的对象。
通过数组循环循环,然后一一删除项目。
数组本身似乎是静态分配的,因此您无需删除它。
实际上,如果您尝试使用delete[] shapes
,则可能会得到运行时例外。
juanchopanza所说...
取一系列托管指针或boost :: pointer_container。我为自己做的测试,表明pointer_container更快
time elapsed for 1000 adds:
0 ms 364 us when using std::vector<boost::shared_ptr<Foo> >
0 ms 205 us when using boost::ptr_vector<Foo>
time elapsed for 10000 adds:
3 ms 3979 us when using std::vector<boost::shared_ptr<Foo> >
2 ms 2195 us when using boost::ptr_vector<Foo>
time elapsed for 100000 adds:
39 ms 39514 us when using std::vector<boost::shared_ptr<Foo> >
21 ms 21365 us when using boost::ptr_vector<Foo>
time elapsed for 1000000 adds:
363 ms 363687 us when using std::vector<boost::shared_ptr<Foo> >
206 ms 206395 us when using boost::ptr_vector<Foo>
time elapsed for 10000000 adds:
3887 ms 3887172 us when using std::vector<boost::shared_ptr<Foo> >
2084 ms 2084816 us when using boost::ptr_vector<Foo>
至少对于向量变体。它认为对于数组也值得一试
如果您可以使用C++11
查看新内存库。
您可以将标准C++
指针更改为:
- unique_ptr
- shared_ptr
- feek_ptr
或从那里的其他。那么,您无需记住动态声明的释放对象
四个答案,没有人提到
std::unique_ptr<Geometry[]> shapes(new Geometry[MAX_SIZE]);
数组专业std::unique_ptr<T[]>
是您想要的。
编辑:糟糕,我误读了这个问题,只是意识到您需要一系列指针,而不仅仅是一个数组。我将在这里留下这个答案,以防有人可以使用。
相关文章:
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”