2007年5月29日火曜日

STLのstd::vector::clear()ではメモリが解放されない

※前のblogから記事を移動。元の公開日:2007/05/29(火) 22:40:21



---

vectorは、配列の伸長時に発生するnew、copyのコストをできるだけ避けるために、ある程度大きめのメモリを確保しておく実装になっているようです。
  • コンストラクタでは指定した長さ分のメモリが確保される

  • vectorが確保しているメモリ量(配列長)はcapacity()メソッドで確認できる

  • push_back()あるいはresize()等を行ったときにcapacityを超えた時、(多くの場合)それまでの2倍のメモリを確保する

    • 手元のVC++2005では1.5倍、gcc(g++) 4.1.2では2倍だった
  • clear()はデータ数を0にするだけでメモリは解放しない(capacityは変化しない)

  • resize(0)等としても同様

  • reserve()に現在のcapacityより小さい数字を与えた場合は何もしない

  • つまり、vectorが一度でも確保したメモリはオブジェクトが破壊されるまで解放されることはない(?)
stackのベースをvectorにしたりすると思わぬところでメモリオーバーしたりするので注意した方がいいようです。

0 件のコメント: