C++ 为C+;中的数组分配新内存时出现问题+;

C++ 为C+;中的数组分配新内存时出现问题+;,c++,memory-management,C++,Memory Management,好吧,我很难理解我做错了什么。在头文件中,我有一个指向图像指针数组的指针: Image **images; int maximum; //size 这是名为scene的类的一部分。现在,场景有一个名为changemax的成员函数,它可以更改图像数组的大小。你可以减少或增加 因此,我所做的是建立一个名为newArray的临时数组,从this->images复制所有值,删除this->images,然后为images分配新内存,从newArray复制到images,然后删除newArray Val

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

Image **images;
int maximum; //size
这是名为scene的类的一部分。现在,场景有一个名为changemax的成员函数,它可以更改图像数组的大小。你可以减少或增加

因此,我所做的是建立一个名为
newArray
的临时数组,从
this->images
复制所有值,删除
this->images
,然后为
images
分配新内存,从
newArray
复制到
images
,然后删除
newArray


Valgrind的错误超过100000个,尽管代码确实可以编译。具体来说,我不认为Valgrind喜欢说
images=newimage*[newmax]

这里肯定有内存泄漏:

newArray[i]=new Image;
if(images[i] !=NULL) {
    // ...
}
else {
    newArray[i]=NULL;
}
为什么要创建两个新阵列?您只需创建一个新数组,将旧数组的内容复制到新数组中,销毁旧数组,然后分配
图像
以指向新数组

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


正如我在评论中所说的,你绝对应该使用C++的标准代码:STD::vector < /COD>或者其他一些来自C++标准库的序列容器,例如A<代码> STD::vector < /代码>。要求很低,我强烈建议进行设计更改。

这里肯定有内存泄漏:

newArray[i]=new Image;
if(images[i] !=NULL) {
    // ...
}
else {
    newArray[i]=NULL;
}
为什么要创建两个新阵列?您只需创建一个新数组,将旧数组的内容复制到新数组中,销毁旧数组,然后分配
图像
以指向新数组

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


正如我在评论中所说的,你绝对应该使用C++的标准代码:STD::vector < /COD>或者其他一些来自C++标准库的序列容器,例如A<代码> STD::vector < /代码>。要求很差,我强烈建议进行设计更改。

这一整段代码完全错误,可以用正确的一行代码替换:

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;
images=newimage*[newmax];

对于(int i=0;i这段代码完全错误,可以用正确的一行代码替换:

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;
images=newimage*[newmax];


对于(int i=0;i您不使用容器类的具体原因是什么?@Jim您所说的容器类是什么意思?
std::vector
,例如..嗯,我不知道那是什么。但这是我们应该做的。很明显,您对自己正在做的事情非常困惑。您的函数有一半甚至是不必要的。有具体原因吗你没有使用容器类?@Jim你所说的容器类是什么意思?例如,
std::vector
。嗯,我不知道那是什么。但这是我们应该使用的方法。很明显,你对你正在做的事情非常困惑。你的函数有一半甚至是不必要的。通过两个新数组,你的意思是
newArray
是不必要的吗?让我困惑的是,如果我没有使用
newArray
,那么如果图像具有相同的名称,我将如何从图像复制到图像?@mohabitar:您创建了两个新数组:
Image**newArray=newimage*[newmax];
images=newimage*[newmax];
您只需要分配
images=newimages;
。好的,我把它改为images=newArray;然后我做了一个for循环并复制了所有的指针(即使没有for循环步骤,我也会得到相同的错误)。但是我仍然从Valgrind那里得到无限的错误。函数完成后,指向newArray的指针是否超出范围?也许我应该用粗体字写下这句话:要求很差,我强烈建议进行设计更改。两个新数组,你的意思是
newArray
是不必要的?让我困惑的是,如果我没有
newArray
,那么如果图像具有相同的名称,我将如何从图像复制到图像?@mohabitar:您创建两个新数组:
Image**newArray=new Image*[newmax];
images=new Image*[newmax];
您只需要分配
images=newimages;
。好的,我把它改为images=newArray;然后我做了一个for循环并复制了所有的指针(即使没有for循环步骤,我也会得到相同的错误).但我仍然从Valgrind那里得到无限的错误。函数完成后,指向newArray的指针是否超出范围?也许我应该用粗体字写下这句话:要求很差,我强烈建议进行设计更改。所以我猜你是在暗示James的上述内容?@mohabitar-是的,我是。我不想确切地说因为这是家庭作业,你应该自己解决。而且,顺便说一句,每个人都告诉你,这是一种非常愚蠢的方式,你应该使用
::std::vector
是正确的。我真的很讨厌学校教“错误”的方式做某事,因为他们想不出更好的方式来教这些材料。给你应该是在学习内存分配、数组和指针。所以我猜你是在暗示詹姆斯在上面做了什么?@mohabitar-是的,我是。我不想确切地说,因为这是家庭作业,你应该自己解决。而且,顺便说一句,每个人都告诉你,这是一种非常愚蠢的方式,你应该使用
 ::std::vector
是正确的。我真的很讨厌学校用“错误”的方法来做某事,因为他们想不出更好的方法来教这些材料。