草庐IT

c++ - 为 RAII 包装 C 分配

我有这些来自库的纯C函数:structSAlloc;SAlloc*new_salloc();voidfree_salloc(SAlloc*s);有什么方法可以用C++将其包装到智能指针(std::unique_ptr)或RAII包装器中?我主要对标准库的可能性感到好奇,而无需创建自己的包装器/类。 最佳答案 是的,您可以为此重用unique_ptr。只需制作一个自定义删除器即可。structsalloc_deleter{voidoperator()(SAlloc*s)const{free_salloc(s);//whatthehec

c++ - 在具有 move 语义的 RAII 类中,默认构造函数应该做什么?

move语义非常适合RAII类。它们允许人们像拥有值(value)语义一样进行编程,而无需付出大量复制的代价。一个很好的例子是returningstd::vectorfromafunction.然而,使用值语义编程意味着,人们会期望类型表现得像原始数据类型。这两个方面有时似乎是矛盾的。一方面,在RAII中,人们会期望默认构造函数返回一个完全初始化的对象,或者如果资源获取失败则抛出异常。这保证了任何构造的对象都将处于有效且一致的状态(即可以安全使用)。另一方面,对于move语义,当对象位于validbutunspecifiedstate中时存在一个点.同样,原始数据类型可以处于未初始化状

c# - 为什么 C# 中的 Dispose 模式不像 C++ 中的 RAII 那样工作

所以我只是在阅读RAII非垃圾收集语言的模式,以及这个section引起了我的注意:Thislimitationistypicallyencounteredwheneverdevelopingcustomclasses.CustomclassesinC#andJavahavetoexplicitlyimplementthedisposemethodinordertobedispose-compatiblefortheclientcode.Thedisposemethodhastocontainexplicitclosingofallchildresourcesbelongingtoth

c++ - RAII 的有用性无一异常(exception)

我最近在c++中发现了RAII,大多数RAII的例子都在谈论异常安全。如何在抛出异常时始终释放资源。我的问题是,如果您没有打开异常,RAII是否值得。在我们公司,我们从事arm的嵌入式项目,默认情况下异常是关闭的,我们认为没有任何必要。谢谢大家的回答! 最佳答案 有异常(exception)的RAII基本上是一项要求。无异常(exception)的RAII意味着您可以将资源分配与代码结合起来以处置资源。这让您拥有具有多个导出点的函数,简化了析构函数的编写(RAII繁重环境中的析构函数通常为空或默认),可以简化对象分配和移动(再一次,

c++ - RAII 捕获构造函数异常的方法

我有一个类可以在其构造函数中抛出异常。如何在try/catchblock中声明该类的实例,同时仍使其在正确的范围内可用?try{MyClasslMyObject;}catch(conststd::exception&e){/*Handleconstructorexception*/}lMyObject.DoSomething();//lMyObjectnotinscope!在尊重RAII的同时,是否有其他方法可以实现这一点?成语?我不希望将init()方法用于两阶段构造。我唯一能想到的另一件事是:MyClass*lMyObject;try{lMyObject=newMyClass();

c++ - 关于RAII、STL pop、PIMPL的基本问题

今天阅读proggit时,我在post中看到了这条评论关于C++如何在GoogleAi挑战赛中名列前茅。用户reventlov声明ThebiggestproblemIhavewithC++isthatit'swaaaytooeasytothinkthatyou'rea"C++programmer"withoutreallyunderstandingallthethingsyouneedtounderstandtouseC++acceptablywell.You'vegottoknowRAII,andknowtousenamespaces,andunderstandproperexcep

c++ - 关于 RAII : How to prevent errors caused by accidentally creating a temporary?

有一段时间,一位同事告诉我他花了很多时间调试竞争条件。罪魁祸首原来是这样的:voidfoo(){ScopedLock(this->mutex);//Oops,shouldhavebeenanamedobject.//Edit:addedthe"this->"tofixcompilationissue.//....}为了防止这种情况再次发生,他在ScopedLock类的定义之后创建了以下宏:#defineScopedLock(...)Error_You_should_create_a_named_object;这个补丁工作正常。有没有人知道任何其他有趣的技术来防止这个问题?

c++ - 在 C++11(或更新版本)中创建 RAII 包装器而无需编写新类的最短路径是什么?

我经常遇到这样一种情况,我需要一个简单的RAII包装器,但由于时间限制和组织问题等多种原因,我不想为此创建一个全新的类。我的快速解决方案如下。假设我想确保在范围结束时,我想要一个bool值切换回其原始状态:boolprevState=currState;currState=newState;std::unique_ptr>txEnder(newint(0),[&prevState](int*p){currState=prevState;deletep;});这个解决方案工作正常,但肮脏的部分是分配和释放整数的必要性只是为了使unique_ptr工作并在销毁时调用自定义析构函数。有没有更

c++ - 使用带有自定义删除器的 shared_ptr 使 HANDLE RAII 兼容

我最近在SO上发布了一个关于RAII的一般性问题.但是,我的HANDLE示例仍然存在一些实现问题。HANDLE在windows.h中被定义为void*。因此,正确的shared_ptr定义需要是std::tr1::shared_ptrmyHandle(INVALID_HANDLE_VALUE,CloseHandle);示例1CreateToolhelp32Snapshot:返回HANDLE并运行。conststd::tr1::shared_ptrh(CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL),CloseHandle);当我在定义中

C++ RAII 问题

据我所知,为了正确实现RAII,如果我在哪里调用CreateFont,我会在构造函数中使用CreateFont将其包装在一个类中,并且DeleteObject在析构函数中,因此它会在超出范围时将其清除。第一个问题是,我不会用很多类来做这件事吗?特别是因为该类只有构造函数和析构函数。第二个问题是,如果我在WndProc中调用CreateFont类,它会不断超出范围怎么办。那么我是否应该在WndMain中完成对CreateFont或LoadBitmap的所有调用?我习惯于在WM_CREATE中调用这些函数并在WM_DESTROY中清理它们。 最佳答案