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

时间:2015-05-31 21:23:35

标签: c++ arrays

假设我想声明一个指向特定对象(如

)的指针数组
Object *objects = new Object[size];

然后将一些新对象添加到我动态分配的数组

for (int i = 0; i < size; i++){

    Object* obj = new obj;
    objects[i] = *obj;

}

仅通过调用数组上的delete[]来释放所有内存就足够了,或者我是否必须首先遍历数组并在每个对象上调用delete?或者这在实践中是愚蠢的吗?

3 个答案:

答案 0 :(得分:5)

您总是必须delete new以某种方式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

,但我觉得这不太可能是这样的。要详细了解{{1}}可以做什么以及如何使用它,请阅读the documentation。可能对你来说最重要的是:你可以像数组一样索引它。

答案 1 :(得分:3)

首先,你必须遵循解除分配的相反顺序。

多次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 ;

答案 2 :(得分:1)

  1. 您正在存储一个对象数组,而不是指向Object的指针。这意味着当您删除阵列时它们将被删除,并且内存将泄漏。
  2. 如果要存储指向数组中对象的指针,则需要将其声明为Object **objects = new Object *[size];,然后必须删除数组中的所有指针。
  3. 所以更好的代码看起来像:

    //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.