お前か!!

他の誰かがexe用に作ったソースコードを加工してDLLを作ってそれを使ってたんですけどね、たまにLoadLibraryで「メモリが足りません」というエラーが出ることがあったんですよ。
出たり出なかったりはまちまちだし、出なかったとき(ちゃんと読み込めたとき)にタスクマネージャーで確認してみてもメモリ使用量は数十Mのオーダーなので、いったい何のトラップだよ、と思っていたわけですよ。
その現象が出始めてから半年、ついに原因が判明。わかってみると超アホらしい不具合だったというのはよくある話で、今回もそんな話。

誰かがexe用のソースにいつのまにか「グローバル変数として1GByteのメモリを確保」するコードを埋め込んでいたのでした。

んで、なんでこんなことに半年も気づかなかったのかといえば・・・

  1. タスクマネージャーで見ていた「メモリ使用量」はデフォルト表示の「ワーキングセット」のみ
    • これは「今現在物理メモリにロードされているメモリの量」
  2. 埋め込まれた巨大変数は最初「未初期化」で存在
    • これはどうやら初期化されるまで「コミットチャージ」に存在する模様

上記二つの複合で、「見た目のメモリ使用量がまったく増えない」かつ「必要とするメモリは(キャッシュを含めた)メモリ空き容量より多い」という状態になってしまっていたからなのでした。
とりあえず、1Gのメモリをいきなり確保するコードはばっさり捨ててそこの部分をリライトしたらエラーが出なくなったので一安心です。