2012-04-18 10 views
0

以下のコードは、私が動的メモリ管理で書いたゲームのものです。私はゲーム内のすべてのガジェットへのポインタを含む 'all_gadgets'という静的なベクトルを持っています。 実行時にガジェットが削除されると、対応するポインタを静的ベクトルから削除します。 ヌルへのポインタを設定する要素自身のデストラクタ内の静的ベクトル内の要素へのポインタを消去

はオプションではありません任意の提案理由:(上記のコードで

Gadget::~Gadget(){ 
    int i = Gadget::all_gadgets.size(); 
    for (std::vector<Gadget *>::iterator it = Gadget::all_gadgets.begin(); it!=all_gadgets.end(); ++it){ 

     if ((*it)==this){ 
      Gadget::all_gadgets.erase(it); 

      break; 
     } 
    } 


    int j = (i - Gadget::all_gadgets.size()); 
    if(j!=1) 
     std::cout << j << " ooops! Gadget not deleted!!" << std::endl; 
} 

、jがゼロであることが判明するだろう私が使用しています:。?私はこれを試してみましたVC10。このため、侵襲性の二重リンクリストを使用し

+0

'erase'は実際に呼び出されていますか? –

+0

ifの中に勘定書を入れるのはどうですか?そうすれば、実際に内部に到達しているかどうかを確認できます。また、このガジェットが実際にall_gadgetsリスト内にあることは確実ですか? all_gadgets.size()を印刷しようとしましたか? – Agentlien

+0

複数のスレッドが 'vector'にアクセスできますか? 'j'の値は? – hmjd

答えて

2

、それは挿入、削除、およびインオーダーの繰り返しのため、より効率的になります。

通常、リンクされたリストは、貧しい地域に苦しんでいます。しかし、あなたのベクトルを持ちますポインタのうち、ポインタ自体偉大な地方に格納されている、コンテンツは間接的なレベルの余分なレベルと地域の損失を必要とします。

侵略的なリンクリストでは、ローカリティはコンテンツのローカリティとまったく同じです。したがって、局所的な理論上の上限と安価な挿入と削除を実現できます。


おそらく実際の問題は、すべてのコンストラクタごとに挿入を行わないことに起因します。コンパイラはデフォルトでコピーコンストラクタを生成し(C++ 11ではコンストラクタを生成します)、独自のものを用意しない限り、all_gadgetsのリストは更新されません。

+0

事は、progはif文を入力します。 – Nolf

+0

@ Nolf: 'j 'が0になる同じオブジェクトにif文を入力しますか?または、いくつかのオブジェクトが正常に削除されているのでしょうか? –

+0

それは同じオブジェクトにあり、問題はすべてのオブジェクトで同じです。問題はコンストラクタではないと確信しています。なぜなら、同じベクトルを使用してファイルからロード/保存した後、すべてのオブジェクトが正常に保存されているからです。 – Nolf

関連する問題