2011-02-11 53 views
0

好的我很难理解我在做什么错误。在我的头文件中,我有一个指向图像指针数组的指针:在C++中为数组分配新内存时遇到的问题

Image **images; 
int maximum; //size 

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

所以我做了什么是成立了一个名为newArray临时数组,复制所有的值从this->images,删除this->images,然后分配新的内存为images,从复制到newArrayimages,然后删除newArray

虽然代码没有编译,但Valgrind得到了超过100,000个错误。具体而言,我不认为Valgrind的喜欢,说images=new Image*[newmax];

+1

你没有使用容器类的具体原因是什么? – 2011-02-11 00:50:20

+0

这是一个功课问题吗? – templatetypedef 2011-02-11 00:51:02

+0

@Jim你指什么容器类?例如, – Snowman 2011-02-11 00:52:45

回答

2

你肯定有内存泄漏此行:

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

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

为什么你要创建新的Image对象?由于您只更改images阵列的大小,因此您可以将所有已存在的指针移动到新阵列中,而无需创建任何新的Image对象。

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

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; 

并没有什么类似甚至该行出现在代码。那么,好的,第一行是模糊的,但只是模糊不清。