raii 相关问题

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

我需要手动关闭 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

用户定义的结构删除是否也在 Rust 中隐式删除其字段?

假设我有一个结构 结构 Foo { 一个:盒子, b: 盒子, } 我想在删除这样的 Foo 实例时对 a 和 b 做一些事情 impl Drop for Foo {

回答 1 投票 0

RAII 模式的 Rust 解决方案,用于在 new() 和 drop() 上修改另一个对象

在 C++ 中有这样的安排是非常标准的: // 一些你想操作的对象 类数据类型 { 民众: 富(){} 酒吧() {} }; // 一些操作数据的类...

回答 2 投票 0

如何管理捕获的 lambda 输入的内存?

所以在现代 C++ 中,我们使用智能指针来确保共享资源在我们使用它之前不会被删除。 对于 lambda 回调,是否有 std::function<> 的等价物? 你在哪里...

回答 2 投票 0

std::unique_ptr 自定义删除器似乎需要一个指针参数——有没有可以采用非指针变量的替代方法?

我最近被介绍了这种使用 std::unique_ptr 来实现“通用”RAII 机制的机制: // 主.cpp #包括 #包括 #include ...

回答 0 投票 0

RAII与std::函数

std::function是否像std::shared_ptr和std::unique_ptr一样具有智能性质?我想不是吧?我有一个std::function,它是一个类成员,如下所示。 class MyClass { typedef std::function

回答 1 投票 0

相当于FIFO释放顺序的RAII

RAII非常舒适,我很难为必须以与获取时相同的顺序释放它们的资源(FIFO)进行释放提供等效设计,而不是相反...

回答 1 投票 1

构造函数内存泄漏引发的异常(句柄包装c ++)

我正在尝试编写DriverIterator类来遍历计算机中的所有卷。我了解下一个类会导致内存泄漏,因为:current_ = std :: make_unique ((paths); ...

回答 2 投票 0

使用RAII简化将对象传递给其他没有复制的对象

外部类objx; class Someclass {public:void bar(objx); objx om; }; void foo(){Someclass c; c.objx(o); bar(o); } void Someclass :: bar(objx&op){//将op保存在某些位置...

回答 1 投票 -1

使用C ++ lock_guard时如何缩小范围?

在C ++中,使用锁时,lock_guard允许您符合RAII的要求。构造lock_guard时,它将调用lock();一旦超出范围,则销毁时将调用unlock()。是否可以...

回答 2 投票 1

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