[PR]大人気の無料恋愛コミュニティ:掲示板に写メにメールも0円使い放題


std::vector で詰まる

あーもう,HP更新 激 久しぶり!!


昨日 プログラミングしてて 詰まった.
最近STLをちょこっとかじった.std::vector 超便利!!
簡単に言うと vector は「自動で要素数を拡張してくれる配列」らしい.

んが!! どうも vector が原因でバグでまくり!!!
いや,正確には 自分の使い方がまずかったらしい.
昨日はこんな感じで使っていた.
struct SpriteData
{
  LPDIRECTDRAWSURFACE7    m_pSurface ;
  LPRECT                  m_pRect ;

  //---- コンストラクタ
  SpriteData ()
  {
    m_pSurface  = NULL ;
    m_pRect   = NULL ;
  }

  //---- デストラクタ
  ~SpriteData ()
  {
    Delete ();
  }

  //---- 消去用
  void  Delete ()
  {
    if ( m_pSurface ) { m_pSurface->Release(); m_pSurface = NULL; }
    if ( m_pRect    ) { delete [] m_pRect;     m_pRect    = NULL; }
  }
};


std::vector< SpriteData > SpriteVec ;   // ← vector に格納!

とまぁ,スプライト管理用の構造体を作って,それを vector に持たせた.
まぁ,解放は デストラクタに 任せればいいかにゃーとか 思ってたさ.

んで,スプライトを新しく読み込んだら,勝手に配列を拡張して データを追加してくれるようにした.
・・・ハズ だったのだが,もうエラーでまくり!!(ToT)

なんでだー!!! 煤i ̄ロ ̄;)


ていうか,vector ってどうやって配列拡張してるの?
resize() の内部では何が起きてるんだ!!
配列だからメモリは連続して確保しないとダメなはず.
っつーことは,コレまでよりも大きな領域が必要なときは,新しい配列を別に確保して,前の配列をコピーして, 古い配列を解放するのかな?

お゛・・・? ( ̄o ̄;)
コピーして解放されるのはまずいんじゃ!?
解放するときにデストラクタが呼ばれてしまうと 勝手にサーフェイスがリリースされてしまう!!
コピーするときは新しいサーフェイスを作るわけじゃなく,ポインタの値をコピーするだけだから(たぶん), 内部参照カウンタの値とか勝手に減るんじゃないの?
やばー!!
RECTのだって 勝手にメモリから消されたら 後で使えないジャン!!
ていうかハングする?

むふぅ・・・どうしましょ・・・

 1.デストラクタ では Delete() 呼ばなくする.→ 何もしない.
 2.コピーをちゃんと作る.

まぁ,どうせ消すときは必ず Delete() 呼ぶようにしてるんで 1.の方法でOKかも.
ためしにデストラクタで何もしないようにしたら エラーでなくなったし・・・


あ...あと,vector には全てのデータを無効にする clear() ってメソッドがある.
でも コレ 領域は解放してくれないらしい.
なんで? これじゃ 一度配列作成したら 2度と小さくできないよー (ToT)
「一度確保したんだから また同程度のサイズが必要になることが予測される」って理由の設計ですか?
むふぅ・・ でもせめて clear() のときくらいは,領域全解放して欲しいにゃ〜 (;ω;)



うーん,それにしても やっぱコピーをちゃんと作るべきだったか・・・
ちうか設計がまずいのか!?
それ以前に vector 勘違いしてるのかも・・・
だれか アドバイス 下さい!! m(_ _)m



<< Back to Diary...

[PR]≪無料≫サクラのいないSNS:※都道府県別、直メールが可能(18禁)