0

我有一个复数的二维数组/矩阵。我想将此二维数组的一行复制到一维数组中。我在 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;

}

那么,有没有其他快速的方法可以将数组“array”复制到“b”以避免这个错误?当我只使用双精度数组而不是复杂数组时。没有观察到这个问题。另外,复杂数组的动态分配有问题吗?因为我似乎记得我过去在使用 new/delete 时遇到了一些与复杂数组的动态分配有关的问题。但我想我设法通过静态分配克服了它。我应该改变动态分配复杂数组的方式吗?

4

2 回答 2

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带有自动内存管理和分配的 ,要简单得多且不易出错。

于 2013-08-16T15:47:31.483 回答
3

你的电话memcpy是错误的 - 它应该是:

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

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

于 2013-08-16T15:43:44.120 回答