jjzjj

c++ - 在逗号运算符的 LHS 中初始化匿名互斥锁持有类实例

假设我有这样的代码:#include"boost/thread/mutex.hpp"usingboost::mutex;typedefmutex::scoped_locklock;mutexmut1,mut2;voidFunc(){//...}voidtest_raiicomma_1(){lockmut1_lock(mut1);Func();}voidtest_raiicomma_2(){(lock(mut1)),Func();}voidtest_raiicomma_3(){(lock(mut1)),(lock(mut2)),Func();//Warning!}intmain(){te

c++ - 将 RAII 与字符指针一起使用

我看到很多RAII示例类环绕文件句柄。我曾尝试将这些示例改编为字符指针,但运气不佳。我正在使用的库具有获取字符指针地址的函数(声明为get_me_a_string(char**x))。这些函数为该字符指针分配内存,并留给库的最终用户在他们自己的代码中清理它。所以,我的代码看起来像这样......char*a=NULL;char*b=NULL;char*c=NULL;get_me_a_string(&a);if(a==NULL){return;}get_me_a_beer(&b);if(b==NULL){if(a!=NULL){free(a);}return;}get_me_someth

c++ - 使用 C++ 的编译时 RAII 行为类型

我知道这听起来有点奇怪,但这是我想做的:假设我有一个函数voidf()并且我想为此方法添加跟踪。我想通过跟踪消息(例如“输入函数f”和“退出函数f”)来跟踪此函数的输入和函数的退出。我不想为入口和导出添加手动跟踪条目,因为我可能会错过一些返回路径。因此可以在编译时使用模板魔术并自动生成这些字符串。即我想要实现的是voidf(){some_template("f");}这应该在构造函数中添加跟踪消息“Enteredfunctionf”,在析构函数中添加“Exitedfunctionf”。我希望它在编译时不创建任何运行时对象。在C++中可能吗?如果可以实现,我可以在哪里找到更多信息的任何指

c++ - 不可复制类型的整数可索引 RAII 容器

是否有一个标准容器具有与vector相同的通用API?但这会通过直接默认构造填充新位置吗?背景:我有一个不允许复制但有默认构造函数的类型,我真正想做的是:vectorbag(some_size);//usebag[i]'sreturn;//bag&contentsgetcorrectlycleanedup.但是,这不起作用,因为vector(int)是根据默认构造一个对象然后将其复制到每个新位置来实现的。编辑:不是C++0xB(又名C++11) 最佳答案 一种选择是升级到符合C++11标准的标准库实现。在C++11中,vector(

c++ - 术语的含义 - Resource Acquisition Is Initialization

我知道RAII的作用。当/如果代码抛出异常时,这都是为了防止内存泄漏等。现在,我想了解那个智能术语的含义。http://en.wikipedia.org/wiki/AcquisitionAcquisition意味着获得某物。那么,当我们说资源获取就是初始化时,这是什么意思?我只是在这里谈论这个术语的含义,而不是一般的概念。 最佳答案 之前有人说过(可能是ScottMeyers说的,我记不清了),RAII应该被称为“Destructionisresourcerelease”,或者类似的词。“资源获取即初始化”字面上的意思是,当一个对象

c++ - 关于 RAII,C++ `try`/`catch` block 是否与其他 block 相同?

好吧,如果我使用RAII习惯用法来管理某些上下文属性*,如果我在tryblock的开头直接使用它,它会像我预期的那样工作吗?换句话说,如果我有这个:structraii{raii(){std::cout……我成功地使用了它:{raiido_the_raii_thing;stuff_expecting_raii_context();/*…*/}...如果我这样做,RAII实例会以同样的方式工作吗:try{raiido_the_raii_thing;stuff_expecting_raii_context_that_might_throw();/*…*/}catch(std::except

c++ - 私有(private)新运营商是否有任何意想不到的副作用?

我读入了this博客,将新运算符设为私有(private)是在堆栈上强制实例化的好方法。我正在实现一个使用RAII习惯用法的类。这个类显然应该只在堆栈上实例化,所以我正在寻找一种方法来强制执行。我的问题是,这是否有任何不能直接看到的副作用?在堆栈上强制实例化是一种好方法吗?是否存在任何可移植性问题?感谢您的帮助!编辑我的RAII类只是实例化了我正在处理的框架的各个部分,因此除了在堆栈上创建一个实例之外,对该类做任何其他事情都没有意义。目标只是提供一种简单的可能性来配置框架并将其置于可用状态,而无需在客户端代码中实例化10个对象。 最佳答案

c++ - 尝试使用 RAII 捕获?

我有一个类,其中有一些方法如下(以及更多):templateLogpp&operator我想将函数体包含在以下形式的trycatchblock中:Logpp&operatorQ1:是否建议使用这样的异常?(在每个函数中)。我不熟悉使用异常,所以我不确定。问题2:如果问题1的答案是肯定的,我可以做这样的事情来消除冗余吗?Logpp&operatortc();try{*p_Stream 最佳答案 Q1:Isitadvisabletouseexceptionslikethis?(Ineachfunction).Iamnotfamiliar

c++ - RAII如何应用于需要扩展初始化的类成员?

据我所知,当RAII惯用语应用于类所需的资源时(如果我错了请纠正我),需要资源的类应该定义适当类型的成员,并且它的析构函数将当using类实例被销毁时自动调用,如下所示:classSkybox{public:Skybox():tex_(...){}private:Texturetex_;};除了使用智能指针在堆上分配资源之外,如果资源成员需要在Skybox构造函数中执行一些代码,那么在初始化资源?例如:classSkybox{public:Skybox(conststd::string&fileName);private:Texturetex_;}Skybox::Skybox(cons

c++ - 段错误和 RAII

这更像是一种哲学类型的问题。在C++中,我们有漂亮Shiny的习惯用法-RAII。但我常常认为它是不完整的。它与我的应用程序可以被SIGSEGV杀死的事实不太吻合。我知道,我知道,你说这样的程序格式错误。但令人遗憾的是,在POSIX(特别是Linux)上,您可以分配超出物理内存限制并在执行过程中遇到SIGSEGV,使用正确分配的内存。你可能会说:“应用程序死了,你为什么要关心那些没有被调用的可怜的析构函数?”。不幸的是,有些资源在应用程序终止时不会自动释放,例如文件系统实体。我现在厌倦了设计hack,破坏良好的应用程序设计来应对这种情况。所以,我所要求的是为此类问题提供一个漂亮、优雅的