在复杂数组的memcpy期间,“检测到glibc - 双重释放或损坏”

时间:2013-08-16 15:40:12

标签: c++ arrays dynamic memcpy complex-numbers

我有一个复数的二维数组/矩阵。我想将这个2D数组的一行复制到一维数组。我在x86_64-suse-linux上使用了复杂的库和gcc版本4.5.1。我使用new动态分配数组。使用memcpy我将2D矩阵的数组传输到1D数组。它工作得很好。问题是,当我删除数组时,它会崩溃。我不知道为什么或什么。当我使用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时遇到了与复杂数组动态分配有关的问题。但我认为我设法通过静态分配来克服它。我应该改变动态分配复杂数组的方式吗?

2 个答案:

答案 0 :(得分:4)

问题的直接原因是

memcpy(&b,&array[2],sizeof(array));

这会将指针array[2]复制到b(相当于b=array[2]),以便delete[] bdelete[] array[2]稍后尝试删除相同的数组。也许你打算复制数组:

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

潜在的问题是你正在搞乱手动分配,原始指针和无类型的C库函数。使用std::vector,自动内存管理和分配,更简单,更不容易出错。

答案 1 :(得分:3)

您对memcpy的来电错误 - 应该是:

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

请注意,您正在编写C ++代码,就像它是C一样 - 您不应该使用memcpy和其他C库,并且您应该尝试使用正确的C ++惯用语,例如std::vector而不是原始的C风格的数组,否则您将无法享受C ++带来的好处,并且会遇到所有常见的C陷阱,例如您刚遇到的内存损坏错误。