2

我面前有一些我不太确定我认为没问题的代码。一个关键部分被放入 aauto_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