動的に割り当てられた配列の削除に問題があり、その理由が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;
プログラム完了時のsegfault後の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)
私はこれをしばらく見つめていましたが、すぐにアイデアがなくなりました。私は集合精神に目を向けると思いました。さらに詳しい情報が必要な場合はお知らせください。ありがとう!
編集:私はすべてをベクターおよびベクター*ベースのアプローチに更新しました。
segfaultsはありません:)。
しかし、これからある種の「得られた知識」を生み出すために、私は別のクラスで次のようなものを呼んでいました。
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;