目の前に、問題ないと思うコードがいくつかあります。クリティカル セクションは に配置され、auto_ptr
呼び出さDeleteCriticalSection
れることはありません。CRITICAL_SECTION
しかし、のインスタンスはクリティカル セクション関数でのみ変更する必要があることを覚えているようです。これをメモリリークチェックで実行しようとしましたが、不平を言いました。
もちろん、これはマルチスレッド システムの一部であり、クリティカル セクションへのアクセスはいくつかの場所で行われます。しかし、私がそれを縮小すると、これは基本的にCRTITCAL_SECTION
が現在どのように扱われるかです.
void test() {
auto_ptr<CRITICAL_SECTION> foo;
foo.reset(new CRITICAL_SECTION());
InitializeCriticalSection(foo.get());
}
auto_ptr
スコープ外に出るとクリティカルセクションが正しく削除されるとは思わないので、これをすばやく変更しようとしました
void test() {
auto_ptr<CRITICAL_SECTION> foo;
foo.reset(new CRITICAL_SECTION());
InitializeCriticalSection(foo.get());
DeleteCriticalSection(foo.get());
}
メモリリークの検出がより快適になりました。クリティカル セクションは、アプリケーションがシャットダウンするまで存在します。それでは、クリティカル セクションを実際に削除するために使用するコードを更新するために時間をかける必要がありますDeleteCriticalSection
か、それとも、アプリケーションがシャットダウンしてすべてのメモリを解放するという事実を受け入れる必要がありますか
アップデート
WhozCraigへの回答: はい、クリティカル セクションを含むオブジェクトの複数のインスタンスがいつでも有効であり、単一のグローバル クリティカル セクションを共有することはできません。