C++ auto_ptr中的CRITICAL_段,无DeleteCriticalSection调用
我面前有一些代码,我不太确定我认为是否可以。 关键部分被放入C++ auto_ptr中的CRITICAL_段,无DeleteCriticalSection调用,c++,windows,multithreading,c++builder,critical-section,C++,Windows,Multithreading,C++builder,Critical Section,我面前有一些代码,我不太确定我认为是否可以。 关键部分被放入auto_ptr中,并且从不在其上调用DeleteCriticalSection。但我似乎记得,CRITICAL\u SECTION的实例应该只使用CRITICAL SECTION函数进行修改。我试着通过内存泄漏检查来运行它,它抱怨道 当然,这是多线程系统的一部分,访问关键部分是在几个地方完成的。但是如果我把它删减,这就是现在处理CRTITCAL\u部分的基本方式 void test() { auto_ptr<CRITICAL
auto_ptr
中,并且从不在其上调用DeleteCriticalSection
。但我似乎记得,CRITICAL\u SECTION
的实例应该只使用CRITICAL SECTION函数进行修改。我试着通过内存泄漏检查来运行它,它抱怨道
当然,这是多线程系统的一部分,访问关键部分是在几个地方完成的。但是如果我把它删减,这就是现在处理CRTITCAL\u部分的基本方式
void test() {
auto_ptr<CRITICAL_SECTION> foo;
foo.reset(new CRITICAL_SECTION());
InitializeCriticalSection(foo.get());
}
而且内存泄漏检测变得更加愉快。
在应用程序关闭之前,关键部分一直存在。因此,我应该花时间更新代码以使用DeleteCriticalSection
实际删除关键部分,还是接受应用程序关闭并释放所有内存的事实
更新
对WhozCraig的回答:是的,看看它,包含一个关键部分的对象的多个实例在任何给定的时间都可能是活动的,并且不能共享一个全局关键部分。为什么critical\u部分
首先是new
ed?通常,它只是一个全局变量或某个类的成员,负责多线程的工作。我同意,我只是想写下他们是如何完成的,而不是如何清理它。我同意Praetorian的观点。没有提出动态分配的理由。在特定类的每个对象中是否有一个这样的对象,并且每个对象都负责在每个对象的基础上锁定对对象的并发访问?为什么您希望auto_ptr
了解关键部分清理规则?已知Auto_ptr调用存储指针上的delete
,该指针调用存储对象上的析构函数;CRITICAL_SECTION是一个与C兼容的结构,没有析构函数。@inquam这是我在演示文稿的基础上得出的结论。在这种情况下,封装在构造初始值设定项(或仅在对象构造函数中)中的单个crtiic_部分就足够了。我认为没有必要动态分配CS。您持有它的对象可能已经动态分配。
void test() {
auto_ptr<CRITICAL_SECTION> foo;
foo.reset(new CRITICAL_SECTION());
InitializeCriticalSection(foo.get());
DeleteCriticalSection(foo.get());
}