raii相关内容

是否有 C++ 标准类在作用域退出时将变量设置为值

在成员函数的作用域内,我想临时将成员变量设置为某个值. 然后,当这个函数返回时,我想把这个成员变量重置为一个给定的已知值. 为了防止异常和多次返回,我已经用一个简单的 RAII 类来完成它.它是在成员函数的范围内定义的. void MyClass::MyMemberFunction() {struct SetBackToFalse {SetBackToFalse(bool* p): ..
发布时间:2021-07-09 20:45:18 C/C++开发

RAII 和系统资源清理

RAII 是一个很好的资源清理解决方案.但是,RAII 基于堆栈展开.如果进程异常终止,堆栈将不会展开.这意味着 RAII 在这种情况下不起作用.对于进程生命周期的资源,没什么好担心的,但是对于文件系统生命周期或者内核生命周期资源,比如文件、消息队列、信号量、共享内存等,就会有问题. 如何以可靠的方式清理系统(fs 和内核)资源? 示例:共享文件将由“主"进程创建,并由“从"进程使用. ..
发布时间:2021-07-09 18:45:32 其他开发

与 Python 的“with"语句(资源的自动释放)对应的 OCaml 是什么?

与 Python 的“with"语句对应的 OCaml 是什么? with open('test.txt', 'r') as f:# 用 f 做事#此时f会一直关闭,即使有异常 即:什么是OCaml中的首选方式来安全地确保某个资源(打开的文件、数据库连接、HTTP连接等)总是在某个时间点被释放?等待垃圾收集器在这里是没有选择的,异常不应该阻止资源被释放. 当然,在 OCaml 中,您始 ..
发布时间:2021-06-12 18:34:18 Python

不是完整表达式的语句

经常听到在C ++中,临时对象在 full-expression 的末尾被解构. full-expression 被定义为不是某些其他表达式的子表达式的表达式.这听起来与我的声明的概念非常相似. 所以我的问题是:如果我在 full-expression 后面加上分号,它将始终是声明吗?可以通过在结尾加上分号的陈述并删除该分号来得出每个 full-expression .我可以假设每个临时文件 ..
发布时间:2021-05-06 19:47:20 C/C++开发

是否保证C ++析构函数直到块结束才被调用?

在下面的C ++代码中,我是否保证在执行//更多代码之后,在之后会调用〜obj()析构函数?还是如果编译器检测到未使用obj对象,便可以允许它更早地对其进行销毁? {SomeObject obj;...//更多代码} 我想使用这种技术来省去记住在块的末尾重置标志的麻烦,但是我需要为整个块保持该标志的设置. 解决方案 您可以接受-这是C ++编程中非常常用的模式.在C ++ Stan ..
发布时间:2021-04-19 18:48:53 C/C++开发

控制反转和RAII可以一起玩吗?

我刚刚阅读了控制反转(IOC),这使我感到困扰,似乎这使内存管理很痛苦.当然,似乎ioc主要用于垃圾收集环境(Net,Java,脚本),而我担心的是非gc设置. 我在这里担心的是,IOC在某种程度上与RAII背道而驰,因为我们将资源生存期与对象生存期脱钩了.这样增加的复杂性难道不会困扰其他任何人吗?真正的问题是,可以使用哪些技术使事情顺利进行? 解决方案 由于这个原因,我制作了自己的 ..
发布时间:2020-11-30 05:15:37 其他开发

可以使资源无效的RAII

我是一个业余爱好者 C ++ 和 DirectX 程序员,所以我所拥有的大部分知识都来自于旧游戏开发书籍,其中的代码设计只是为了进行演示和运行,因此即使是最简单的程序,也给我带来了许多设计注意事项。在开发这样一个程序的过程中,我最近了解到 RAII ,所以我决定尝试一下这种设计模式,因为据我了解,一个对象应该在构造,这大大简化了程序可以使用对象的方式。以前,我一直在使用 create()&我的某些 ..
发布时间:2020-10-22 03:57:12 C/C++开发

堆栈分配的RAII对象与DI原理

在C ++中,我经常使用RAII样式的对象来使代码更可靠,并在堆栈上分配它们,以使代码更具性能(并避免bad_alloc)。 但是在堆栈上创建具体类的对象会违反依赖关系反转(DI)原理,并会阻止对此对象进行模拟。 考虑以下代码: struct IInputStream { virtual vector read(size_t n)= 0; }; 类连 ..
发布时间:2020-10-20 20:06:52 C/C++开发

是否可以在不取消调用堆栈的情况下终止Windows XP上的C ++应用程序?

我的理解是,当您通过Windows XP中的任务管理器杀死C ++应用程序时,该应用程序仍然被“干净”地破坏了-即,调用堆栈将展开并且所有相关的对象析构函数将被调用。不确定我的理解是否是错误的。 是否有可能在不取消堆栈的情况下立即杀死此类应用程序? 例如,应用程序可以使用RAII模式,该模式将在对象被破坏时破坏或释放资源。如果通过任务管理器进行的传统“杀死过程”很正常,那么提供一种立即 ..
发布时间:2020-09-29 00:51:54 C/C++开发

防止用户创建类的未命名实例

对于许多 RAII“后卫” 类,将其实例化为匿名变量根本没有任何意义: { std :: lock_guard {some_mutex}; //不保护作用域! //未命名实例立即被销毁。 } { scope_guard {[] {cleanup(); }}; //`cleanup()`立即执行! //未命名 ..
发布时间:2020-09-28 01:54:43 C/C++开发

离开范围时调用函数

离开范围时自动调用函数的最优雅的解决方案是什么? 我目前的方法(见下文)有效,但我想写一个自定义脚本应该有一些更一般的方法 #include&iostream>。 #include 使用命名空间std; class DoInDtor { public: typedef function F; DoInDtor(F ..
发布时间:2020-09-27 19:52:55 C/C++开发

移动构造函数和const成员变量

我喜欢const成员变量的概念,尤其是当我将C函数包装到类中时。构造函数采用资源句柄(例如文件描述符),该句柄在整个对象生命周期内保持有效,而析构函数最后将其关闭。 (那是RAII背后的想法,对吗?) 但是使用C ++ 0x move构造函数时,我遇到了问题。由于析构函数也在“卸载”对象上调用,因此我需要防止清理资源句柄。由于成员变量是const,因此我无法分配值-1或INVALID_HAN ..
发布时间:2020-09-27 18:50:19 其他开发

C ++读取缓冲区中的整个文件

什么是读取C ++缓冲区中整个文件内容的好方法? 在普通CI中,可以使用 fopen() ,fseek(),fread()函数组合并将整个文件读取到缓冲区中,对于C ++使用相同的文件还是个好主意吗?如果是,那么我如何在打开时使用RAII方法,为缓冲区分配内存,将文件内容读取和读取到缓冲区中。 我应该为缓冲区创建一些包装器类,该类在其析构函数中分配内存(为缓冲区分配),以及用于文件处理 ..
发布时间:2020-09-27 00:47:04 C/C++开发

C ++数组和make_unique

作为这篇文章的后续文章,我想知道它如何实现可以分配功能临时缓冲区数组,例如下面的代码. f() { auto buf = new int[n]; // temporary buffer // use buf ... delete [] buf; } 可以将其替换为对make_unique的调用,然后将使用[]版本的delete吗? 解决方案 这是另一种解决方案(除了M ..
发布时间:2020-07-18 02:33:25 C/C++开发

使非对象资源符合RAII

在我的代码中,我使用了windows.h中的HANDLE.它们的用法就像 HANDLE h; if (!openHandleToSomething(arg1, arg2, &h)) { throw std::exception("openHandleToSomething error"); } /* Use the handle in other functions which ca ..
发布时间:2020-06-21 19:52:50 C/C++开发

在某些情况下,“最终"构造将在C ++中有用吗?

Bjarne Stroustrup在他的 C ++样式和技术常见问题解答中写道,重点是我的: 因为C ++支持 几乎总是更好的 :“资源获取是初始化"技术(TC ++ PL3第14.4节).基本思想是用本地对象表示资源,以便本地对象的析构函数将释放该资源.这样,程序员就不会忘记释放资源.例如: class File_handle { FILE* p; public: F ..
发布时间:2020-06-15 18:36:21 C/C++开发

C ++最快的“最终"

不幸的是,到目前为止, C ++不支持finally子句用于try语句.这导致对如何释放资源的猜测.在互联网上研究了这个问题之后,尽管我找到了一些解决方案,但是我对它们的性能并不清楚(如果性能没那么重要,我会使用Java).所以我必须进行基准测试. 这些选项是: 在 CodeProject上提出的 基于Functor的finally类.它功能强大,但速度较慢.反汇编表明,捕获外部函 ..
发布时间:2020-06-15 18:36:00 C/C++开发