2

目の前に、問題ないと思うコードがいくつかあります。クリティカル セクションは に配置され、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への回答: はい、クリティカル セクションを含むオブジェクトの複数のインスタンスがいつでも有効であり、単一のグローバル クリティカル セクションを共有することはできません。

4

0 に答える 0