是否正确初始化和销毁​​了C ++对象指针数组?

时间:2018-09-25 20:08:57

标签: c++ arrays pointers constructor destructor

我想创建一个指向自定义对象Image的指针数组,但是我不确定自己是否做得正确(而且我对指针数组没有任何经验)。我有一个将一个图像作为第一个元素和数组大小的构造函数,但是我认为我没有正确创建一个图像指针数组。我知道它可能要容易得多,但我不想使用向量。

在头文件中,我有:

class Album {
public:
  unsigned arrmax;
  Image** imgar;
  Image basepic;

在cpp文件中,我有一个构造函数:

Album::Album(const Image & picture, unsigned max) {
arrmax = max;
basepic = picture; //operator overloaded
imgar = new Image*[arrmax]; //array of Image pointers 
for (unsigned i = 0; i < max; i++) {
   imgar[i] = NULL;
  }
 imgar[0] = &basepic;
}

我的析构函数如下:

Album::~Album() {
if (imgar != NULL) {
for (unsigned i = 0; i < this->arrmax; i++) {
  if (imgar[i] != NULL) {
    delete imgar[i]; // delete[] or delete??
   } 
  }
 }
}

对于析构函数,在遍历元素之后是否还需要做delete[] imgar?还是我只是没有删除正确的内容?

2 个答案:

答案 0 :(得分:0)

在析构函数中不需要for循环,因为您要删除使用new []创建的指针数组。 仅此一个就足够了:

Album::~Album() {
    delete[] imgar;
}

答案 1 :(得分:0)

根据您的问题,我了解到您更喜欢一些指导/良好做法,而不是直接的答案。

一些好的做法:

  • 请尝试避免直接进行内存管理,因为它容易出错。尽可能使用智能指针(唯一,共享,弱)
  • 您可以使用std :: array / std :: vector作为改进的数组,它可以控制大小并具有一些其他功能。
  • 对于数组大小,首选size_t而非“ unsigned int”
  • 大多数时候,容器范围循环更具可读性和更快性。

所以您的代码可能是这样的:

class Album{
public:
    std::vector<std::unique_ptr<Image>> _imgVect;
    Image basepic;
    ...
};

Album::Album(const Image & picture, unsigned max) {
    _imgVect.reserve(max);
    basepic = picture; //operator overloaded
    // default of unique_ptr is already nullptr

    // Not really a good practice, but without more information
    // of what you are trying, it is the best I could imagine.
    _imgVect[0] = std::unique_ptr<Image>(&basepic, [](Image*){});
}

// Use default destructor
  

但我不想使用向量

特别有原因吗?如果您不想使用容器,则可以:选择new / delete。您可能仍会使用智能指针。

  

对于析构函数,在遍历元素之后,我是否还必须做delete [] imgar?还是我只是没有删除正确的内容?

使用delete[]将删除数组,但不会删除为数组中每个指针保存的内容。必须先在每个元素上使用delete,然后才能使用delete[]删除所有数组。

您必须非常小心删除的内容,例如,数组的第一个元素(在您的问题代码中)不是堆分配的对象,因此尝试删除它将具有未定义的行为(通常是崩溃)