我想创建一个指向自定义对象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
?还是我只是没有删除正确的内容?
答案 0 :(得分:0)
在析构函数中不需要for循环,因为您要删除使用new []
创建的指针数组。
仅此一个就足够了:
Album::~Album() {
delete[] imgar;
}
答案 1 :(得分:0)
根据您的问题,我了解到您更喜欢一些指导/良好做法,而不是直接的答案。
一些好的做法:
所以您的代码可能是这样的:
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[]
删除所有数组。
您必须非常小心删除的内容,例如,数组的第一个元素(在您的问题代码中)不是堆分配的对象,因此尝试删除它将具有未定义的行为(通常是崩溃)