raii相关内容

为什么C++标准文件流不能更严格地遵循RAII约定?

为什么C++标准库流使用与对象生存期分离的open()/close()语义?从技术上讲,关闭销毁可能仍然会使类成为RAII类,但获取/释放独立性会在作用域中留下漏洞,其中句柄可以什么都不指向,但仍然需要运行时检查才能捕获。 为什么库设计者选择他们的方法,而不是只在引发失败的构造函数中打开? void foo() { std::ofstream ofs; ofs ..
发布时间:2022-09-05 16:52:06 C/C++开发

C# - 超出范围时对象是否立即销毁?

我可以相信一个对象在 C# 中超出范围时会被销毁并立即调用其析构函数吗? 我认为应该这样做,因为许多常见的编码实践(例如事务对象)都依赖于这种行为,但我不太习惯使用垃圾收集,并且对这些语言通常的行为方式知之甚少. 谢谢. 解决方案 不,.Net 因此 C# 依赖于垃圾回收内存管理.因此,在 GC 发现可以销毁对象之前,不会调用析构函数(在 .Net 中称为终结器). 另外 ..
发布时间:2022-01-16 10:03:14 C#/.NET

理解术语和概念的含义 - RAII (Resource Acquisition is Initialization)

C++ 开发人员能否向我们详细描述一下 RAII 是什么,为什么它很重要,以及它是否可能与其他语言有任何关联? 我确实知道一点.我相信它代表“资源获取就是初始化".然而,这个名字与我(可能不正确)对 RAII 的理解不符:我的印象是 RAII 是一种在堆栈上初始化对象的方式,这样,当这些变量超出范围时,析构函数将自动被调用导致资源被清理. 那为什么不称为“使用堆栈触发清理"(UTSTT ..
发布时间:2022-01-16 09:25:32 C/C++开发

CUDA:在 C++ 中包装设备内存分配

我现在开始使用 CUDA,不得不承认我对 C API 有点失望.我理解选择 C ​​的原因,但是如果该语言是基于 C++ 的,那么几个方面会简单得多,例如设备内存分配(通过 cudaMalloc). 我的计划是自己做这个,使用重载的 operator new 和放置 new 和 RAII(两种选择).我想知道到目前为止是否有任何我没有注意到的警告.代码似乎可以工作,但我仍然想知道潜在的内存泄 ..
发布时间:2022-01-10 16:14:35 C/C++开发

使用 IDisposable 和“使用"是否滥用?作为获得“范围行为"的一种手段为了异常安全?

我经常在 C++ 中使用的东西是让一个类 A 通过 A 处理另一个类 B 的状态进入和退出条件> 构造函数和析构函数,以确保如果该范围内的某些内容引发异常,则 B 在退出范围时将具有已知状态.就首字母缩略词而言,这并不是纯粹的 RAII,但它仍然是一种既定模式. 在C#中,我经常想做的事 类 FrobbleManager{...私人无效小提琴TheFrobble(){this.Frobbl ..
发布时间:2022-01-08 11:43:05 C#/.NET

C++ 是否支持“最终"块?(我一直听到的这个“RAII"是什么?)

C++ 是否支持'finally'块? 什么是 RAII 习语? C++的RAII习语和C#的'有什么区别使用'语句? 解决方案 不,C++ 不支持“finally"块.原因是 C++ 支持 RAII:“Resource Acquisition Is Initialization"——一个真正有用的概念糟糕的名字†. 这个想法是对象的析构函数负责释放资源.当对象具有自动存 ..
发布时间:2022-01-08 11:34:22 C/C++开发

为什么使用 std::auto_ptr<> 是错误的?使用标准容器?

为什么在标准容器中使用 std::auto_ptr 是错误的? 解决方案 C++ 标准规定 STL 元素必须是“可复制构造的"和“可分配的".换句话说,一个元素必须能够被分配或复制,并且这两个元素在逻辑上是独立的.std::auto_ptr 不满足此要求. 以这段代码为例: class X{};std::vector>vecX;vecX.push_back(新X);std::a ..
发布时间:2022-01-07 10:48:35 C/C++开发

局部变量作用域问题

为什么下面的代码打印“xxY"?局部变量不应该存在于整个函数的范围内吗?我可以使用这样的行为,还是会在未来的 C++ 标准中改变? 我认为根据 C++ 标准 3.3.2“在块中声明的名称对该块来说是局部的.它的潜在范围从它的声明点开始,并在其声明区域的末尾结束." #include 使用命名空间标准;我的课堂{上市:MyClass( int ) { cout ..
发布时间:2022-01-04 11:48:13 C/C++开发

为什么.NET 中没有RAII?

主要是 C++ 开发人员,Java 中缺少 RAII(资源获取即初始化),并且.NET 一直困扰着我.清理的责任从类编写者转移到其使用者(通过 try finally 或 .NET 的 using 构造) 似乎明显较差. 我明白了为什么在 Java 中不支持 RAII,因为所有对象都位于堆上并且垃圾收集器本质上不支持确定性销毁,但在 .NET 中引入了值类型(struct) 我们有(看似)完 ..
发布时间:2021-12-23 17:10:38 C#/.NET

如何使用异步等待模式初始化对象

我试图在我的服务类中遵循 RAII 模式,这意味着当一个对象被构造时,它被完全初始化.但是,我在使用异步 API 时遇到了困难.有问题的类的结构如下 class ServiceProvider : IServiceProvider//只能通过这个接口使用{公共 int 重要值 { 获取;放;}公共事件 EventHandler ImportantValueUpdated;公共服务提供者(IDep ..
发布时间:2021-12-22 09:12:39 C#/.NET

Java 中的 RAII ......资源处理总是那么丑陋吗?

我刚玩过Java文件系统API,得到了以下函数,用于复制二进制文件.原始来源来自 Web,但我添加了 try/catch/finally 子句以确保如果发生错误,缓冲流将在退出函数之前关闭(从而释放我的操作系统资源). 我修剪了函数以显示模式: public static void copyFile(FileOutputStream oDStream, FileInputStream oS ..
发布时间:2021-12-22 09:03:20 Java开发

在 C++ 中避免内存泄漏的一般准则

有哪些一般技巧可以确保我不会在 C++ 程序中泄漏内存?如何确定谁应该释放动态分配的内存? 解决方案 与其手动管理内存,不如尝试在适用的情况下使用智能指针. 看看 Boost lib、TR1 和 智能指针. 此外,智能指针现在是 C++ 标准的一部分,称为 C++11. ..
发布时间:2021-12-21 09:52:01 C/C++开发

OpenGL 对象的 RAII 包装器

我想为我注意到的 OpenGL 对象(纹理、帧缓冲区等)编写一个简单的 RAII 包装器,所有 glGen* 和 glDelete* 函数共享相同的签名,所以我的第一次尝试是这样的: typedef void (__stdcall *GLGenFunction)(GLsizei, GLuint *);typedef void (__stdcall *GLDelFunction)(GLsizei, ..
发布时间:2021-12-19 17:58:58 C/C++开发

使用 IDisposable 和“使用"是否滥用?作为获得“范围行为"的手段;为了异常安全?

我在 C++ 中经常使用的东西是让类 A 通过 A 处理另一个类 B 的状态进入和退出条件> 构造函数和析构函数,以确保如果该范围内的某些内容抛出异常,则 B 在退出该范围时将具有已知状态.就首字母缩略词而言,这不是纯粹的 RAII,但它仍然是一种既定的模式. 在C#中,我经常想做 class FrobbleManager{...私有无效 FiddleTheFrobble(){this.F ..
发布时间:2021-12-17 16:50:28 C#/.NET

C++ 是否支持“finally"块?(我一直听到的这个“RAII"是什么?)

C++ 是否支持“终于' 块? 什么是RAII 惯用语? C++'s RAII idiom 和 C#'s '有什么区别using'语句? 解决方案 不,C++ 不支持“finally"块.原因是 C++ 转而支持 RAII:“资源获取即初始化"——一个糟糕的名字† 一个真正有用的概念. 这个想法是一个对象的析构函数负责释放资源.当对象具有自动存储持续时间时,对象的析构函数 ..
发布时间:2021-12-17 16:42:23 C/C++开发

如果你不应该在析构函数中抛出异常,你如何处理其中的错误?

大多数人说从不从析构函数中抛出异常 - 这样做会导致未定义的行为.Stroustrup 指出 “向量析构函数为每个元素显式调用析构函数.这意味着如果元素析构函数抛出,向量析构失败......实际上没有好的方法来防止从析构函数抛出的异常,所以库不保证元素析构函数是否抛出“(来自附录 E3.2). 这篇文章 似乎另有说法 - 抛出析构函数或多或少没问题. 所以我的问题是 - 如果从析构函数 ..
发布时间:2021-12-17 16:36:07 C/C++开发

C++ 中的 RAII 和智能指针

在 C++ 实践中,什么是 RAII,什么是 智能指针,这些是如何在程序中实现的,使用带有智能指针的 RAII 有什么好处? 解决方案 RAII 的一个简单(可能被过度使用)示例是 File 类.如果没有 RAII,代码可能如下所示: 文件文件("/path/to/file");//对文件做一些事情file.close(); 换句话说,我们必须确保在完成文件后将其关闭.这有两个缺点 - ..
发布时间:2021-12-01 15:09:51 C/C++开发

资源获取即初始化(RAII)是什么意思?

资源获取即初始化 (RAII) 是什么意思? 解决方案 对于一个非常强大的概念来说,这是一个非常糟糕的名字,也许是 C++ 开发人员在切换到其他语言时错过的第一件事.有一些运动试图将这个概念重新命名为范围绑定资源管理,尽管它似乎还没有流行起来. 当我们说“资源"时,我们不仅仅指内存——它可以是文件句柄、网络套接字、数据库句柄、GDI 对象……简而言之,我们供应有限的东西,因此我们需要 ..
发布时间:2021-12-01 14:45:05 C/C++开发

如何将 C API 封装到 RAII C++ 类中?

为控制拥有项目的会话的库提供 C API,将 C API 封装到 RAII C++ 类的最佳设计是什么? C API 看起来像: HANDLE OpenSession(STRING sessionID);无效关闭会话(处理 hSession);HANDLE OpenItem(HANDLE hSession, STRING itemID);void CloseItem(HANDLE hIte ..
发布时间:2021-11-15 02:06:55 C/C++开发