C ++ - 删除动态数组的段错误

时间:2013-03-01 05:27:11

标签: c++ arrays dynamic delete-operator

在删除动态分配的数组时遇到一些麻烦,我不能100%确定原因。我对这个数组做的唯一一件事就是单独复制一些值(在for循环中),在另一个例程中复制,验证它是否正常工作。

这是课堂上的宣言:

std::complex<float> * frameData;

构造函数中的实例化:

this->frameData = new std::complex<float>[n];
srand( time(NULL) );
std::complex<float> randUnityRoot;

for( int i = 0; i < this->n; i++){
    randUnityRoot = std::polar(1.0, 2*M_PI * (rand() % 1000000)/1e06);
    this->frameData[i] = randUnityRoot;
}
在析构函数中删除

(这是回溯中提到的第70行):

delete[] this->frameData;

程序完成后段错误后gdb回溯:

(gdb) f 4
#4  0x00007ffff7bc579c in Frame::~Frame (this=0x602940, 
__in_chrg=<optimized out>) at Frame.cpp:70 
70      delete[] this->frameData;
(gdb) f 3
#3  0x00007ffff7669b96 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) f 2
#2  0x00007ffff765f39e in ?? () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) f 1
#1  0x00007ffff7624b8b in abort () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) f 0
#0  0x00007ffff7621425 in raise () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) 

我已经盯着这一段时间而且我的想法是正确的。我想我会转向蜂巢头脑。如果您想了解更多信息,请与我们联系。谢谢!

编辑:我将所有内容更新为基于矢量和矢量*的方法。

没有段错误:)。

为了从这里产生某种“获得的知识”,在另一个课程中我称之为:

std::complex<float> * frameGet;
frameGet = this->Frame->getFrame();
// Do stuff with frameGet
//THIS NEXT LINE IS THE BAD PART
delete[] frameGet;

半问题,半断言:删除[] frameGet调用删除原始数组内容?如果需要删除frameGet,请执行以下操作:

frameGet = NULL;
delete frameGet;

1 个答案:

答案 0 :(得分:0)

您很可能没有在类中明确定义copy-ctor或赋值运算符。因此,在课堂的私人部分描述它们(然后无法访问):

class Frame {
//...
private:
   Frame( const Frame & );
   Frame &operator=( const Frame & );
// ...
};

您甚至不必实现它们,编译器将通过编译错误显示问题所在的确切位置。

关于你问题的后半部分。出于某种原因,您认为如果将一个原始指针分配给另一个,则复制该内存并需要单独删除它们。不是这样,原始指针只是一个数字 - 内存中的地址。所以:

int *pi = new int[N]; // now pi has address of memory reserved by new, lets say 0x1234
int *api = pi;  // now api has the same address 0x1234 as pi
delete[] api; // you tell environment that you do not need memory at address 0x1234 anymore
delete[] pi; // you tell environment that you do not need memory at address 0x1234 again, which is error

你直接将一个指针指向另一个指针,或者通过函数结果或参数传递指向这个指针的事实不会改变任何东西。