在C ++中为数组分配新内存的麻烦

时间:2011-02-11 00:48:06

标签: c++ memory-management

好的,我很难理解我做错了什么。在我的头文件中,我有一个指向图像指针数组的指针:

Image **images;
int maximum; //size

这是一个名为scene的类的一部分。现在,scene有一个名为changemax的成员函数,它改变了images数组的大小。你可以减少或增加。

所以我所做的就是设置一个名为newArray的临时数组,复制this->images中的所有值,删除this->images,然后为{{1}分配新内存},从images复制到newArray,然后删除images

我使用Valgrind会遇到100,000多个错误,尽管代码确实编译了。具体来说,我不认为Valgrind喜欢newArray

这一行

2 个答案:

答案 0 :(得分:2)

你肯定有内存泄漏:

newArray[i]=new Image;
if(images[i] !=NULL) {
    // ...
}
else {
    newArray[i]=NULL;
}

为什么要创建两个新阵列?您只需要创建一个新数组,将旧数组的内容复制到新数组中,销毁旧数组,然后指定images指向新数组。

为什么要创建新的Image个对象?由于您只是更改images数组的大小,因此您只需将所有指针移动到新数组中,而无需创建任何新的Image对象。

正如我在评论中所说,你绝对应该使用C ++标准库中的std::vector或其他一些序列容器,例如std::vector<Image>。要求很差,我强烈建议改变设计。

答案 1 :(得分:1)

这整段代码都是错误的,可以用正确的一行代替:

images=new Image*[newmax];
for (int i=0;i<newmax;i++){
    if (newArray[i]!=NULL) {
        images[i]=new Image;
        *images[i]=*newArray[i];
    }
    else {
        images[i]=NULL;
    }

    delete newArray[i];
}
delete [] newArray;

并且代码中没有出现类似于该行的内容。好吧,好吧,第一行模糊地相似,但只是含糊不清。