0

删除动态分配的数组时遇到一些麻烦,我不是 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;

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

frameGet = NULL;
delete frameGet;
4

1 回答 1

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

您只需将一个指针直接分配给另一个指针或通过函数结果或参数传递来执行此操作这一事实不会改变任何事情。

于 2013-03-01T05:35:11.740 回答