Releaseビルドでの挙動違い

C++の話になりますが、VisualStudioを使っていて、Releaseビルドしているのに挙動が変わる、ということに何度か出遭ったことがあります。
その挙動が変わるというのが、デバッガ接続している状態でReleaseビルド実行体を実行しているときには正常に動くのに、実行体を単体で実行させたときには不正アクセス等で異常終了する、という感じです。Releaseビルドではデバッグ版のようにメモリを初期値で塗りつぶしたりという余計な操作を行わないことは知られています。あくまでこれはビルドでの挙動なので、今回のようなデバッガの有無では挙動が変わりません。となると、今回のこの挙動の差はいったいどこから来ているのだろうかと、ちょっと考え込んでしまいました。

調べてみると、デバッガの有無で変わるポイントとして、使用するヒープの性質が異なることがわかりました。デバッガが接続されていると、Low-Fragmentation Heap,(通称LFHというもの)が有効にならない、とあります。
参考: http://support.microsoft.com/kb/929136

妙な翻訳ですが、デバッグ時でもLFHを使いたい場合には、_NO_DEBUG_HEAPを有効にすればよいようです。そもそもLFHが使えない原因が他のヒープに関するデバッグフラグが設定されることのようで・・・。

さて、このような訳でデバッガの有無で使用されるヒープの種類が異なるということがわかりました。このヒープの差がおそらくReleaseビルドのアプリケーションの動作の差異となって現れたのではないかと考えます。ただし、たまたま使用されるメモリの中身が何かしらの残骸値であったために不正終了を引き起こしたという単純なケースもあると思います。

結局のところは、メモリの未初期化が影響してこのような差異に繋がっていることが可能性として高いので、この場合には1度そのようなクラスメンバの未初期化が残っていないか確認してみた方が良さそうです。