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;

プログラム完了時の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;
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 に答える