私は C++ でベイジアン推論サンプラーを開発しています。これは多くのことをツリー上で中継します。このツリーはスマート ポインター (Boost の shared_ptr と weak_ptr) の助けを借りて実装されています。
推論中 (つまり、長い C++ 関数を 1 ~ 2 分間実行している間)、ツリーは大幅に変更され、多くのノードが作成および破棄されます。
推論プロセス全体 (100% の負荷) がプロセッサ (より正確には 1 つのスレッド) を占有します。何らかの理由で新しいメモリ (新しいノード用) が占有されていますが、古いメモリが完全に解放されていないため、1 ~ 2 分間の推論後にメモリ オーバーフローが発生します。
ただし、推論プロセスに一時停止を追加すると、プログラムが古いオブジェクトを完全に破棄し、すべて正常に動作するように見えます。
その理由は、何らかの理由でデストラクタ (または、より正確には、その後に何が起こるか、つまりメモリの解放) が遅れているためだと私には思えます。
教えてください: 1) 本当に問題があるように見えますか? 2) はいの場合、「十分なメモリ」が解放されるまで待つ方がよい方法はありますか? 標準戦略とは何ですか?
(プログラムは Unix で実行されています。)