[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...