草庐IT

都说 C++ 没有 GC,RAII: 那么我算个啥?(赠书福利)

*以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/7A9-tGZxf4w_7eZl3OUQ4A学过Java、C#或者其他托管语言(managedlanguages)的同学,回过头来看C++的时候,第一反应就是C++没有自动垃圾回收器(GC),而不能充分利用的资源被称为垃圾。那么C++真的不能自动回收垃圾吗?带着这个疑问我们来看看一般C++程序都是怎样回收资源的。内存在计算机系统中是有限的资源,通常申请内存和释放内存是这样子的,假设有个被调用的函数function():voidfunction(){int*p=ne

java - Java 是否支持 RAII/确定性破坏?

我使用Java已经至少5年了,那时,任何时候你想分配一个需要清理的对象(例如套接字、数据库句柄),你必须记住最后添加一个阻塞并调用其中的清理方法。相比之下,在C++(或其他对象生命周期是确定性的语言,例如Perl)中,类实现者将定义一个析构函数,该函数在该类的对象超出范围时执行清理。这种方法的优点是对象的用户不会忘记清理它——析构函数会自动调用,即使抛出异常也是如此。这种方法采用了相当糟糕的RAII名称——“资源获取即初始化”。根据我的经验,“以RAII方式”做事为我节省了大量的精神开销,因为我不必担心是否以及何时会发生资源释放。我们正在考虑将Java用于一个中型项目,我想知道自从我上

java - Java 是否支持 RAII/确定性破坏?

我使用Java已经至少5年了,那时,任何时候你想分配一个需要清理的对象(例如套接字、数据库句柄),你必须记住最后添加一个阻塞并调用其中的清理方法。相比之下,在C++(或其他对象生命周期是确定性的语言,例如Perl)中,类实现者将定义一个析构函数,该函数在该类的对象超出范围时执行清理。这种方法的优点是对象的用户不会忘记清理它——析构函数会自动调用,即使抛出异常也是如此。这种方法采用了相当糟糕的RAII名称——“资源获取即初始化”。根据我的经验,“以RAII方式”做事为我节省了大量的精神开销,因为我不必担心是否以及何时会发生资源释放。我们正在考虑将Java用于一个中型项目,我想知道自从我上

c++ - 使用可变参数模板获取/发布的 RAII 模式

我正在尝试用一个模板化类替换我所有的“获取/释放”RAII类(目前每种资源都有一个)。acquire的一般形式是,有的类型是Acquire(),有的是Acquire(p1),有的是Acquire(p1,p2)等,Release也是一样。但是,如果资源是使用参数获取的,那么它需要使用相同的参数释放。我想我可以使用可变参数模板来做到这一点,将参数存储在一个元组中。我当然不喜欢语法。有人可以帮忙吗?#includetemplateclassRaii{public:Raii(T*s,Args&&...a):subect(s),arguments(a){subject->Acquire(argu

c++ - C++ 的 RAII 教程

已结束。此问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是无关紧要的,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,describetheproblem以及到目前为止为解决这个问题所做的工作。关闭9年前。Improvethisquestion我想学习如何在c++中使用RAII。我想我知道它是什么,但不知道如何在我的程序中实现它。快速谷歌搜索没有显示任何好的教程。有没有人有好的链接可以教我RAII? 最佳答案 这没什么

c++ - 这是糟糕的 RAII 设计吗?

我有Java背景,但后来我学习了C++,现在已经用它编程了几年(主要是调试和编写修复程序,而不是从头开始设计程序)。然而,我今天遇到了一个问题,坦率地说,我有点惊讶花了这么长时间才发现它。假设我有一个名为Class1的类,其头文件包含(以及其他代码):classClass1{private:Class2object;}Class2类没有指定默认构造函数。现在,在Class1构造函数中,我正在读取文件的二进制头并使用我从中解析的信息来初始化Class2,如下面的伪代码所示:Class1::Class1(std::string){//Readsomebinaryinfofromafileh

c++ - 哪个先执行,RAII还是函数返回值

MyClass有一个成员函数需要返回它的成员变量,并且该函数必须是线程安全的,因此我使用互斥锁来保护数据。我有两个实现如下:版本1:stringMyClass::name(){m_mutex.lock();stringtemp=m_name;m_mutex.unlock();returntemp;}版本2:stringMyClass::name(){MutexLockerlock(mutex);returnm_name;}我知道版本1没有问题,但我需要敲更多的代码。问题是,我不确定版本2是否正确。是否会在线程访问m_name之前释放互斥锁? 最佳答案

c++ - RAII状态管理

我需要改变一个状态。然后做事。然后将状态重置为原来的状态-例如:autooldActivationOrder=mdiArea->activationOrder();mdiArea->setActivationOrder(QMdiArea::StackingOrder);mdiArea->cascadeSubWindows();mdiArea->setActivationOrder(oldActivationOrder);我如何以RAII方式执行此操作?(C++11和/或14)编辑:感谢您的所有回答。有几个创建自定义类来处理状态更改的建议(BoBTFish、mindriot、Mattia

c++ - 当仿函数不是一个选项时,我如何在 C++ 中编写带有自定义函数调用的模板化 RAII 包装器?

我目前正在使用标准¹C++17为OpenGl开发RAII系统,同时大量使用模板。现在,我正在处理的系统部分是通过一个通用模板绑定(bind)和取消绑定(bind)各种OpenGl对象,然后使用声明为每种类型创建简单的别名。以下是我的头文件的相关摘录,演示了一般技术:templateclassRaiiGlBinding{public:explicitRaiiGlBinding(constT&t,Args...args):m_unbindArgs(std::make_tuple(t,args...)){bind(t,args...);}~RaiiGlBinding(){if(m_isDes

iphone - 类似于 RAII 的惯用短生命周期本地对象

我遇到了Objective-C的这个片段:NSNumber*theBalance=[[[NSNumberFormatteralloc]init]numberFromString:[textFieldtext]];这似乎泄露了NSNumberFormatter。在C++中,我会做以下两件事之一:为NSNumberFormatter使用auto(即堆栈)存储使用RAII(例如shared_ptr)来管理NSNumberFormatter的生命周期在Objective-C中,这些选项似乎都不可行。我在堆栈上试过:NSNumberFormatterfmt;但这不能编译。据我所知,Objecti