销毁指向数组中对象的指针
Destroy pointers to objects in array
假设我想声明一个指向特定对象的指针数组,例如
Object *objects = new Object[size];
,然后添加一些新对象到动态分配的数组
for (int i = 0; i < size; i++){
Object* obj = new obj;
objects[i] = *obj;
}
是否足以通过在数组上调用delete[]
来释放所有内存,或者我是否必须首先循环遍历数组并在每个对象上调用delete
?还是说在实践中这么做很愚蠢?
你总是必须以某种方式delete
你的new
。这意味着,您需要在每次迭代中使用delete obj
来避免泄漏。注意,您从来没有真正存储obj
所指向的Object
,而是它的一个副本。
正确的方法是非常不寻常的,而且不太方便:您所展示的循环没有任何用处,因为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
可以做什么以及如何使用它,请阅读文档。可能对您来说最重要的是:您可以像索引数组一样对它进行索引。
首先,您必须遵循与分配相反的分配顺序。
所以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 ;
- 你存储的是一个对象数组,而不是对象指针。这意味着当您删除数组时,它们不会被删除,并且内存会泄漏。
- 如果你想在数组中存储指向对象的指针,那么你需要将其声明为
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.
相关文章:
- 对象指针在c++中是如何工作的
- C++ 对象指针数组的复制构造函数
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 正确初始化和销毁对象指针的C++数组?
- 如何深度复制链表对象指针
- 对象指针 c++ 的全局向量错误
- 如何将 c++ 类包装到 python 中,以便我可以使用 pybind11 访问其成员的公共方法(成员是一个对象指针)
- 静态对象指针
- 正在将对象指针数组初始化为NULL
- 如何使用条件表达式返回对象指针?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 使用C对象指针构建PyObject*
- 如何在使用对象指针时访问成员函数
- 静态强制转换允许转换对象指针,但不允许转换整数
- C++ abort() 在函数内的抽象类对象指针调用上
- 指向函数的对象指针
- 访问指向对象指针向量的指针的第一个元素?
- 如何将对象/指针正确存储到 Qlist 中
- 对象指针打印结果以相反的顺序进行