raii 相关问题

资源获取初始化(RAII)是C ++中用于管理资源生命周期的常用习惯,包括内存分配,文件句柄或数据库连接。简而言之,每个资源都应该包含在一个拥有类中,其生命周期控制着资源的生命周期。

RAII 有条件锁定

我有一段代码,仅当某些条件为真时才需要用锁保护。 如果(条件){ std::lock_guard 守卫(some_mutex); // 做很多事情 } ...

回答 2 投票 0

延迟加载可以被视为 RAII 的一个例子吗?

在 iOS 上独占 Objective-C 几年之后,我最近一直在追赶我的 C++,而“新风格”C++ 中出现最多的主题是 RAII 确保我理解 RAII 概念

回答 4 投票 0

如何在不短暂拥有两个 RAII 对象的情况下重新创建 RAII 对象?

类 MyObject { 民众: MyObject(size_t 大小) : m_bytes(大小) {} 私人的: std::vector m_bytes; }; int main() { 我的对象 我的对象(1 << 30); // Actually I want

回答 1 投票 0

如何确保在离开功能之前恢复给定的操作?

这是上下文。我正在开发一个可以绘制内容的 Qt 应用程序。在某些时候,逻辑可能需要执行场景的旋转或平移,以便绘制特定的对象,给定

回答 1 投票 0

如果在每次 write() 操作后调用 `flush()`,那么对使用 `open()` 打开的文件调用 `close()` 是否很重要?

我读到,对使用 open(filename, 'w'|'a') 打开的文件调用 close() 非常重要,否则对打开的文件所做的更改可能不会保留。我相信这一点...

回答 1 投票 0

白色方块而不是实际图像

我最近通过一本书开始学习 SFML,并提出了一个问题,当您加载图像时,您会得到一个大的白色方块。 我有用于管理游戏资源的 TextureHolder 类,...

回答 1 投票 0

使用RAII来管理文件聪明吗?

我想创建一个 Channel 类,以特殊的方式促进文件写入。一开始我很清楚,我在构造函数中对文件调用 open() ,在......中对文件描述符调用 close() 。

回答 1 投票 0

如何在函数出口处运行清理代码?

C++ 类提供 RAII 惯用法。因此你不必关心异常: 无效函数() { // 函数退出时会自动释放内存 std::vector vecto...

回答 3 投票 0

资源获取就是初始化,Python中

我是Python新手。我来自C++。 在一些代码审查中,我有几个同行希望我将内容从 __init__ 和 __del__ 移至启动和停止方法。大多数时候,这违背了......

回答 3 投票 0

我需要手动关闭 ifstream 吗?

使用 std::ifstream 时是否需要手动调用 close() ? 例如,在代码中: std::string readContentsOfFile(std::string 文件名) { std::ifstream 文件(fileName.c_str()); 如果(菲尔...

回答 4 投票 0

Qt 与 RAII 设计模式不兼容吗?

良好编码实践的一个重要经验法则是 每个新的都必须与删除相匹配 在上一个问题中讨论过。通常,我们将此规则封装在 RAII 类中,例如 std::

回答 1 投票 0

Qt 中的 RAII(标题必须至少 15 个字符。)

良好编码实践的一个重要经验法则是 每个新的都必须与删除相匹配 在上一个问题中讨论过。通常,我们将此规则封装在 RAII 类中,例如 std::

回答 1 投票 0

是否已实现任何 RAII 文件句柄?

RAII 文件句柄看起来很基本,所以我猜它已经被实现了?但我找不到任何实现。我在 boost::iostreams 中找到了 file_descriptor 但我不知道这是否是我的

回答 3 投票 0

如何使用#pragma 实现 RAII?

目前,我有以下代码: 枚举类字母 { A, 乙, C }; #pragma GCC 诊断推送 #pragma GCC 诊断错误“-Wswitch” 字母 e(字母:...

回答 2 投票 0

如何在 C++ 中使用 #pragma 实现 RAII

目前我有以下代码: 枚举类字母 { A, 乙, C }; #pragma GCC 诊断推送 #pragma GCC 诊断错误“-Wswitch” 字母 e(字母...

回答 1 投票 0

Vulkan-hpp m_dispatcher->getVkHeaderVersion() != VK_HEADER_VERSION

我正在尝试使用 vulkan raii 并创建一个实例(实际上是实例化 vk::raii::Context) 我收到这个错误 /usr/include/vulkan/vulkan_raii.hpp:2660: const vk::raii::ContextDispatcher* vk...

回答 1 投票 0

为什么添加默认的移动赋值运算符会破坏标准交换函数的编译?

在下面的代码中,如果移动赋值未注释,则交换函数将停止程序的编译。我在所有 3 个主要编译器(GCC、Clang、MSVC)上观察到了这种行为。 #包括 在以下代码中,如果未注释移动分配,则交换函数将停止程序的编译。我在所有 3 个主要编译器(GCC、Clang、MSVC)上都观察到了这种行为。 #include <utility> #include <memory> struct test { test() = default; test(test&& other) noexcept = default; //test& operator=(test&& other) noexcept = default; test(const test& other) : ptr(std::make_unique<int>(*other.ptr)) {} test& operator=(test other) noexcept { std::swap(*this, other); return *this; } std::unique_ptr<int> ptr; }; Godbolt 测试:https://godbolt.org/z/v1hGzzEaz 研究标准库实现,他们使用 SFINAE 或概念来启用/禁用 std::swap 重载,并且当特殊函数未注释时,由于某种原因,某些特征会失败(libstdc++ 上的 is_move_constructible 和/或 is_move_assignable)。 我的问题是:为什么添加默认的特殊成员函数会阻止标准库将类型视为可移动? std::move的主要实现在内部使用移动分配,类似于。 template <typename T> void swap(T& a, T& b) { T c = std::move(a); a = std::move(b); b = std::move(c); } 这意味着移动分配需要对您的类型有效,但事实并非如此。 如果你调用移动赋值运算符,你会得到一个错误: <source>:18:15: error: use of overloaded operator '=' is ambiguous [...] [...] | <source>:9:11: note: candidate function 9 | test& operator=(test&& other) noexcept = default; | ^ <source>:15:11: note: candidate function 15 | test& operator=(test other); | ^ 这两个运算符都可以使用 xvalue 进行调用,并且两者都不是更好的匹配。 std::swap 受到限制,因此只有 MoveAssignable 类型可以交换,而你的类型则不能。 即使你可以打电话std::swap,你也不能同时打电话 依赖 std::swap 的默认实现,它使用 operator= 用 operator= 定义 std::swap 这将是无限递归,因为 = 和 std::swap 的定义是循环的。 解决方案 您可以为您的类型定义自定义 swap,这样您就不再依赖 std::swap。 只保留 operator=(test),看起来像: test& operator=(test other) noexcept { swap(*this, other); // custom function, not std::swap return *this; } 您还可以手动定义单独的 operator=(const test&) 和 operator=(test&&) ,以便 std::swap 将使用移动赋值运算符,并且重载决策中不会有歧义。

回答 1 投票 0

带有 Rust 的 RAII 风格防护会给出无效的生命周期错误

我正在编写一个词法分析器,想要使用 RAII 帮助器前进/备份游标。我有一个由充当光标的 CharStreamGuard 类型索引的字符串。它是在顶层创建的...

回答 1 投票 0

为什么 Alexandrescu 不能在 ScopeGuard11 中使用 std::uncaught_exception() 实现 SCOPE_FAIL ? [重复]

很多人无疑都熟悉 Alexandrescus 先生的 ScopeGuard 模板(现在是 Loki 的一部分)和这里介绍的新版本 ScopeGuard11: http://channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-

回答 1 投票 0

使用 ascyc c 库时的 RAII

我在 cnats 库周围有一个 RAII 包装器。我们不需要了解cnats的细节。只有两个重要的部分。 cnats 是用于与 NATS 消息通信的 C 客户端

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.