资源获取初始化(RAII)是C ++中用于管理资源生命周期的常用习惯,包括内存分配,文件句柄或数据库连接。简而言之,每个资源都应该包含在一个拥有类中,其生命周期控制着资源的生命周期。
使用 std::ifstream 时是否需要手动调用 close() ? 例如,在代码中: std::string readContentsOfFile(std::string 文件名) { std::ifstream 文件(fileName.c_str()); 如果(菲尔...
良好编码实践的一个重要经验法则是 每个新的都必须与删除相匹配 在上一个问题中讨论过。通常,我们将此规则封装在 RAII 类中,例如 std::
良好编码实践的一个重要经验法则是 每个新的都必须与删除相匹配 在上一个问题中讨论过。通常,我们将此规则封装在 RAII 类中,例如 std::
RAII 文件句柄看起来很基本,所以我猜它已经被实现了?但我找不到任何实现。我在 boost::iostreams 中找到了 file_descriptor 但我不知道这是否是我的
目前,我有以下代码: 枚举类字母 { A, 乙, C }; #pragma GCC 诊断推送 #pragma GCC 诊断错误“-Wswitch” 字母 e(字母:...
目前我有以下代码: 枚举类字母 { A, 乙, C }; #pragma GCC 诊断推送 #pragma GCC 诊断错误“-Wswitch” 字母 e(字母...
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...
在下面的代码中,如果移动赋值未注释,则交换函数将停止程序的编译。我在所有 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 将使用移动赋值运算符,并且重载决策中不会有歧义。
带有 Rust 的 RAII 风格防护会给出无效的生命周期错误
我正在编写一个词法分析器,想要使用 RAII 帮助器前进/备份游标。我有一个由充当光标的 CharStreamGuard 类型索引的字符串。它是在顶层创建的...
为什么 Alexandrescu 不能在 ScopeGuard11 中使用 std::uncaught_exception() 实现 SCOPE_FAIL ? [重复]
很多人无疑都熟悉 Alexandrescus 先生的 ScopeGuard 模板(现在是 Loki 的一部分)和这里介绍的新版本 ScopeGuard11: http://channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-
我在 cnats 库周围有一个 RAII 包装器。我们不需要了解cnats的细节。只有两个重要的部分。 cnats 是用于与 NATS 消息通信的 C 客户端
假设我有一个结构 结构 Foo { 一个:盒子, b: 盒子, } 我想在删除这样的 Foo 实例时对 a 和 b 做一些事情 impl Drop for Foo {
RAII 模式的 Rust 解决方案,用于在 new() 和 drop() 上修改另一个对象
在 C++ 中有这样的安排是非常标准的: // 一些你想操作的对象 类数据类型 { 民众: 富(){} 酒吧() {} }; // 一些操作数据的类...
所以在现代 C++ 中,我们使用智能指针来确保共享资源在我们使用它之前不会被删除。 对于 lambda 回调,是否有 std::function<> 的等价物? 你在哪里...
std::unique_ptr 自定义删除器似乎需要一个指针参数——有没有可以采用非指针变量的替代方法?
我最近被介绍了这种使用 std::unique_ptr 来实现“通用”RAII 机制的机制: // 主.cpp #包括 #包括 #include ...
std::function是否像std::shared_ptr和std::unique_ptr一样具有智能性质?我想不是吧?我有一个std::function,它是一个类成员,如下所示。 class MyClass { typedef std::function
我正在尝试编写DriverIterator类来遍历计算机中的所有卷。我了解下一个类会导致内存泄漏,因为:current_ = std :: make_unique ((paths); ...
外部类objx; class Someclass {public:void bar(objx); objx om; }; void foo(){Someclass c; c.objx(o); bar(o); } void Someclass :: bar(objx&op){//将op保存在某些位置...
在C ++中,使用锁时,lock_guard允许您符合RAII的要求。构造lock_guard时,它将调用lock();一旦超出范围,则销毁时将调用unlock()。是否可以...