C++ 在复杂阵列的memcpy过程中检测到“glibc-双重自由或损坏”

C++ 在复杂阵列的memcpy过程中检测到“glibc-双重自由或损坏”,c++,arrays,dynamic,memcpy,complex-numbers,C++,Arrays,Dynamic,Memcpy,Complex Numbers,我有一个二维数组/复数矩阵。我要将此二维数组的一行复制到一维数组。我在x86_64-suse-linux上使用复杂库和gcc版本4.5.1。我使用new动态分配数组。我使用memcpy将二维矩阵的数组转换为一维数组。它很好用。问题是,当我删除阵列时,它会崩溃。我不知道为什么。当我使用valgrind进行调试时,我不是这方面的专家,得到以下消息 ==20516== Invalid free() / delete / delete[] ==20516== at 0x4C24F6E: opera

我有一个二维数组/复数矩阵。我要将此二维数组的一行复制到一维数组。我在x86_64-suse-linux上使用复杂库和gcc版本4.5.1。我使用new动态分配数组。我使用memcpy将二维矩阵的数组转换为一维数组。它很好用。问题是,当我删除阵列时,它会崩溃。我不知道为什么。当我使用valgrind进行调试时,我不是这方面的专家,得到以下消息

==20516== Invalid free() / delete / delete[]
==20516==    at 0x4C24F6E: operator delete[](void*) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==20516==    by 0x400BBC: main (complex.cpp:29)
==20516==  Address 0x590f290 is 0 bytes inside a block of size 160 free'd
==20516==    at 0x4C24F6E: operator delete[](void*) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==20516==    by 0x400B86: main (complex.cpp:27)
我把全部代码贴在下面

#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<complex>
using namespace std;

int main(){
complex<double> **array = new complex<double>*[10];
for (int i=0; i<10; i++) array[i]=new complex<double>[10];

for (int i=0; i<10; i++){
        for (int j=0; j<10; j++){
                array[i][j]=complex<double> (i,j+1); abs(array[i][j]) << "]" << endl;
        }
}

complex<double>* b = new complex<double>[10];
memcpy(&b,&array[2],sizeof(array));
for (int i=0; i<10; i++){
        cout << array[2][i] << "\t" << b[i] << endl;
}

delete[] b;
for (int i = 0 ; i < 10 ; i++){
        delete[] array[i];
}
delete[] array;

}
那么,是否有其他快速方法将数组复制到b以避免此错误?当我只使用双数组而不是复杂数组时。没有观察到这个问题。此外,复杂阵列的动态分配是否存在问题?因为我似乎记得,在过去使用new/delete时,我遇到了一些与复杂数组的动态分配相关的问题。但我认为我通过静态分配成功地克服了它。我应该改变动态分配复杂数组的方式吗?

您对memcpy的调用是错误的-应该是:

memcpy(b, array[2], 10 * sizeof(*b));

注意,你写C++代码就像是C—你不应该使用MeMcPy和其他C库,你应该尝试使用适当的C++习惯,比如STD::vector,而不是原始的C风格数组,否则,您将无法享受C++的好处,并且会遇到所有常见的C陷阱,例如您刚才遇到的内存损坏错误。

< P>问题的直接原因是

memcpy(&b,&array[2],sizeof(array));
这会将指针数组[2]复制到相当于b=array[2]的b上,以便delete[]b和delete[]array[2]稍后尝试删除相同的数组。也许您想复制阵列:

memcpy(b,array[2],10*sizeof(*b));

潜在的问题是,您正在处理手动分配、原始指针和非类型化的C库函数。使用STD::具有自动内存管理和赋值的向量,要简单得多,而且容易出错。

你应该考虑使用向量。我正在慢慢地向那个方向移动。很快就会出现:+1,解释错误如何/为什么会导致内存损坏。工作非常完美。谢谢如果这就是问题所在,为什么仅仅使用double没有出现这样的错误?@PopulationXplosive:如果使用double而不是complex,同样是错误的,我从Valgrind得到了完全相同的诊断。当然,未定义的行为不一定会导致有用的错误,这就是为什么最好避免所有这些容易出错的恶作剧。