草庐IT

c++ - 当我们结合 RAII 和 GOTO 时会发生什么?

我想知道,除了纯粹出于好奇(因为没有人应该编写这样的代码!)之外,我想知道RAII的行为如何与goto(不是很可爱)。classTwo{public:~Two(){printf("2,");}};classGhost{public:~Ghost(){printf("BOO!");}};voidfoo(){{Twot;printf("1,");gotoJUMP;}Ghostg;JUMP:printf("3");}intmain(){foo();}在VisualStudio2005中运行以下代码时,我得到以下输出。1,2,3BOO!然而我想象、猜测、希望'BOO!'实际上不会出现,因为Gh

c++ - 用于 OpenGL 对象的 RAII 包装器

我想为OpenGL对象(纹理、帧缓冲区等)编写一个简单的RAII包装器,我注意到所有glGen*和glDelete*函数共享相同的签名,所以我的第一次尝试是这样的:typedefvoid(__stdcall*GLGenFunction)(GLsizei,GLuint*);typedefvoid(__stdcall*GLDelFunction)(GLsizei,constGLuint*);templateclassGLObject{GLuintm_name;public:GLObject(){glGenFunction(1,&m_name);}~GLObject(){glDelFunct

c++ - boost 或 C++0x 中的任何 RAII 模板

RAII的boost中是否有可用的模板。有像scoped_ptr、shared_ptr这样的类,它们基本上都在指针上工作。这些类可以用于指针以外的任何其他资源。是否有任何模板可以与通用资源一起使用。以某个在作用域开始时获取的资源为例,必须在作用域结束时以某种方式释放。获取和释放都需要一些步骤。我们可以编写一个模板,它需要两个(或者可能是一个对象)仿函数来完成这项任务。我还没有想过如何实现这一点,我只是想知道是否有任何现有的方法可以做到这一点编辑:一个支持lambda函数的C++0x怎么样 最佳答案 shared_ptr提供了指定cu

c++ - 当构造函数抛出异常时,RAII 是如何工作的?

我正在学习C++中的RAII习语,以及如何使用智能指针。在我的阅读中,我遇到了两件在我看来似乎相互矛盾的事情。引自http://www.hackcraft.net/raii/:...ifamemberobjectwithRAIIsemanticshasbeencreatedandanexceptionhappensbeforetheconstructorhascompletedthenitsdestructorwillbecalledaspartofthestackunwinding.Henceanobjectwhichcontrolsmultipleresourcescanguarn

c++ - C++ RAII 类中的 OpenGL 对象不再有效

我在C++类中有一个OpenGL对象。由于我使用的是RAII,我想让析构函数删除它。所以我的课看起来像:classBufferObject{private:GLuintbuff_;public:BufferObject(){glGenBuffers(1,&buff_);}~BufferObject(){glDeleteBuffers(1,&buff_);}//Othermembers.};这似乎有效。但是每当我执行以下任何操作时,我都会在使用它时遇到各种OpenGL错误:vectorbufVec;{BufferObjectsome_buffer;//Initializesome_buf

c++ - Stroustrup 的 RAII 和强制转换运算符 FILE*() = 矛盾?

我正在阅读Stroustrup的C++(1997年第3版)以了解他是如何实现RAII的,在第365页上我发现了这一点:classFile_ptr{FILE*p;public:File_ptr(constchar*n,constchar*a){p=fopen(n,a);}File_ptr(FILE*pp){p=pp;}~File_ptr(){fclose(p);}operatorFILE*(){returnp;}};构造函数和析构函数的实现很明显,符合RAII习语,但我不明白他为什么使用operatorFILE*(){returnp;}。这将导致以下列方式使用File_ptr:FILE*

python - Python 中的 RAII - 离开作用域时自动销毁

我一直在寻找RAII在Python中。资源分配是初始化是C++中的一种模式,由此对象在创建时被初始化。如果失败,则抛出一个异常(exception)。这样,程序员就知道对象永远不会处于半构建状态。Python可以做这么多。但RAII也适用于C++的范围规则以确保对象的及时销毁。只要变量从堆栈中弹出它被销毁。这可能发生在Python中,但仅限于如果没有外部或循环引用。更重要的是,一个对象的名字仍然存在,直到它被调用在导出(有时更长)。模块级别的变量将坚持模块的生命周期。如果我做这样的事情,我想得到一个错误:forxinsome_list:......100lineslater...for

c++ - 为什么 C++ 标准文件流不更紧密地遵循 RAII 约定?

为什么C++标准库流使用与对象生命周期分离的open()/close()语义?在销毁时关闭可能在技术上仍会使类成为RAII,但获取/释放独立性会在句柄可以指向任何内容但仍需要运行时检查才能捕获的范围中留下漏洞。为什么库设计者选择他们的方法而不是只在引发失败的构造函数中打开?voidfoo(){std::ofstreamofs;ofs这个问题的更好措辞可能是为什么访问未打开的fstream是值得的。通过句柄生命周期控制打开文件的持续时间在我看来根本不是负担,实际上是一种安全优势。 最佳答案 虽然其他答案都是有效且有用的,但我认为真正的

c++ - 为什么在 RAII 可用时进行垃圾收集?

我听说C++14在C++标准库本身中引入了垃圾收集器。此功能背后的基本原理是什么?这不是RAII存在于C++中的原因吗?标准库垃圾收集器的存在将如何影响RAII语义?这对我(程序员)或我编写C++程序的方式有什么影响? 最佳答案 垃圾收集和RAII在不同的上下文中很有用。GC的存在不应影响您对RAII的使用。由于RAII是众所周知的,所以我举两个GC很方便的例子。垃圾收集对实现无锁数据结构有很大帮助。[...]itturnsoutthatdeterministicmemoryfreeingisquiteafundamentalpro

c++ - RAII 与垃圾收集器

我最近在CppCon2016上观看了HerbSutter关于“LeakFreeC++...”的精彩演讲,他谈到了使用智能指针来实现RAII(资源获取即初始化)-概念以及它们如何解决大部分内存问题泄漏问题。现在我想知道。如果我严格遵守RAII规则,这似乎是一件好事,那为什么与在C++中使用垃圾收集器有什么不同呢?我知道使用RAII,程序员可以完全控制何时再次释放资源,但是在任何情况下,这对仅仅拥有一个垃圾收集器有好处吗?效率真的会低吗?我什至听说有一个垃圾收集器可以更有效,因为它可以一次释放更大的内存块,而不是在整个代码中释放小块内存。 最佳答案