销毁指向数组中对象的指针

Destroy pointers to objects in array

本文关键字:对象 指针 数组      更新时间:2023-10-16

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

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 ;

  1. 你存储的是一个对象数组,而不是对象指针。这意味着当您删除数组时,它们不会被删除,并且内存会泄漏。
  2. 如果你想在数组中存储指向对象的指针,那么你需要将其声明为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.