2016-10-09 2 views
0

私は2つのクラス:spotframeを持っています。ポインタは、クラスへのポインタのベクトルの正しい場所を指していません

spotは、いくつかの画像処理により検出されたスポットに関するデータを保持している:それだけid一意である(INT)、及びxy -coordinates(両方とも二重)を有しています。私はspotsと呼ぶベクターにすべてのスポットを保存します。

frameは、とりわけ、それに属するすべてのスポットへのポインタのベクトルを保持している:

class frame 
{ 
    int num ; 
    vector <spot *> spots_list ; 
    // other members and functions 
} 

私は、ファイルからのデータ読み込み:とても基本的に

while (//goes through a lot of rows) 
    { 
     spot* S = new spot (ID, X, Y) ; 
     spots.push_back (*S) ; 
     frames[i].spot_list.push_back (&spots.back()) ; 
     delete S ; 
    } 

を、私は新しいインスタンスSを作成し、そのデータをベクトルspotsに追加し、そのアドレスへのポインタをフレームのspot_listに追加します。 (少なくとも、これは私がやりたいことです)

フレーム内のすべてのポイントを印刷しようとすると、その中にはガベージデータがあります。 id = 423784237、id = -9431101 - 残りのデータは有効です。

しかし、ベクトルspotsと直接照合すると、正しい場所を指していません。 例えば、ID = 37は、細胞内フレームのspot_listで0x20f8288が、ベクターspots0x210d080です。

ランダムなガベージデータがあり、アドレスが同じではないので、私はこれを正しく実行していないと確信していますが、どうやってやるべきか分かりません。助けていただければ幸いです。

+0

[mcve]を入力してください。 – Barry

+0

なぜ最初にヒープに割り当ててから、コピーを作成して保存した後、元のファイルを削除するのですか? – stijn

+0

要素を追加したためにベクトルを再配置する必要がある場合は、ベクトルの背要素 '&spots.back()'のアドレスを取りますが、そのアドレス**は変更されます**。あなたが 'push_back'を呼び出すとすぐに、その要素に持ってきたすべてのポインタは無効になります*。 – Galik

答えて

0
spots.push_back(*S); 

この呼び出しでは、spotsの内部でストレージを再割り当てする必要があります。その場合、以前に格納されたアドレスは無効になるので、spots_listのエントリは偽になります。

ベクトルの大きさを知っていれば、spotsの内部をspots.reserve(size)であらかじめ割り当てるか、それ以外の場合は、ポインタではなくベクトルにインデックスを格納できます。

関連する問題