smart-pointers 相关问题

一种抽象数据类型,它在提供附加功能时模拟指针,例如自动垃圾收集或边界检查

设计建议:`unique_ptr`和pybind11

我有一个设置,其中资源 R 可以通过同样源自 R 的各种过滤器 F。共享 R 的所有权是没有意义的,因为资源在检索时被消耗。有些我

回答 1 投票 0

std::make_unique_for_overwrite() 相对于 std::make_unique() 有什么作用?

看来在 C++20 中,我们为智能指针提供了一些额外的实用函数,包括: 模板 unique_ptr make_unique_for_overwrite(); 模板 看来在 C++20 中,我们为智能指针提供了一些额外的实用函数,包括: template<class T> unique_ptr<T> make_unique_for_overwrite(); template<class T> unique_ptr<T> make_unique_for_overwrite(size_t n); std::make_shared 与 std::shared_ptr 相同。为什么现有的功能没有: template<class T, class... Args> unique_ptr<T> make_unique(Args&&... args); // with empty Args template<class T> unique_ptr<T> make_unique(size_t n); 够了吗?现有的不是使用对象的默认构造函数吗? 注意:在这些函数的早期提案中,名称为 make_unique_default_init()。 这些新功能不同: 原始make_XYZ:始终初始化指向的值(“显式初始化”,请参阅标准中的§class.expl.init)。 新make_XYZ_for_overwrite:执行指向值的“默认初始化”(参见§dcl.init,标准中的第7段);在典型的机器上,这意味着对于非类、非数组类型“实际上没有初始化”。 (是的,这个术语有点令人困惑;请阅读链接中的段落。) 这是普通指针的一个功能,智能指针实用程序函数不提供该功能:使用常规指针,您可以直接分配而无需实际初始化指向的值: new int 对于唯一/共享指针,您只能通过包装现有指针来实现此目的,如下所示: std::unique_ptr<int[]>(new int[n]) 现在我们有一个包装函数。 注意:请参阅相关的 ISO C++ WG21 提案 以及 这个 SO 答案 allocate_shared、make_shared和make_unique都通过执行与new T(args...)等效的操作来初始化底层对象。在零参数的情况下,这会减少到 new T() - 也就是说,它执行 值初始化。在许多情况下,值初始化(包括像 int 和 char 这样的标量类型、它们的数组以及它们的聚合)执行 零初始化 - 也就是说,这是为了将 a 归零而进行的实际工作。一堆数据。 也许您想要这个并且这对您的申请很重要,也许您不需要。从 P1020R1 开始,论文介绍了最初名为 make_unique_default_init、make_shared_default_init 和 allocate_shared_default_init 的函数(在 C++20 的全国投票评论过程中,这些函数从 meow_default_init 重命名为 meow_for_overwrite): 内置类型的数组(例如 unsigned char 或 double)在分配后立即由用户整体初始化的情况并不罕见。在这些情况下,由 allocate_shared、make_shared 和 make_unique 执行的值初始化是多余的并且会损害性能,因此需要一种选择默认初始化的方法。 也就是说,如果您编写如下代码: auto buffer = std::make_unique<char[]>(100); read_data_into(buffer.get()); 由 make_unique 执行的值初始化会将这 100 个字节清零,这是完全没有必要的,因为无论如何你都会立即覆盖它。新的 meow_for_overwrite 函数改为执行 默认初始化,因为所使用的内存无论如何都会立即被覆盖(因此得名) - 这就是说相当于执行 new T (没有任何括号或大括号)。在我之前提到的那些情况下(例如 int 和 char、它们的数组以及它们的聚合),默认初始化不执行初始化,这节省了时间。 对于具有用户提供的默认构造函数的类类型,值初始化和默认初始化之间没有区别:两者都只是调用默认构造函数。但对于许多其他类型,可能存在很大差异。 一种简单的思考方法,至少对于 C 开发人员来说是这样:make_unique 使用 calloc() 而 make_unique_for_overwrite 使用 malloc()它存在的意义在于 malloc 通常比 calloc 更快。

回答 3 投票 0

在*现代* C++ 中我应该如何管理*无主*指针?

在现代 C++ 中,我应该如何管理无主指针? 我在想像 unique_ptr 的weak_ptr 之类的东西,但这似乎不存在。 例子 例如,如果我有一个 A 类拥有一个 po...

回答 4 投票 0

为什么智能指针的自定义删除器不允许抛出异常?

我正在阅读一本书中有关智能指针的内容,其中指定不允许抛出自定义删除器。但我无法弄清楚其中的原因。为什么不让他们扔?

回答 2 投票 0

创建动态推导类型的智能指针?

是否可以在不使用 if 序列的情况下创建动态推导类型的指针? 我应该使用什么作为地图值类型? 类车辆{ 民众: 虚拟无效运行()=0; }; // 德尔...

回答 1 投票 0

如何在C++Builder中使用ComPtr?

我正在尝试在我的 C++Builder 项目中实现 DX11。所有 SDK 参考都使用 ComPtr<> 模板,例如: // 创建DX11 API设备对象,并获取相应的上下文。 康普特<

回答 2 投票 0

如何在C++Builder中替换ComPtr?

我正在尝试在我的 C++Builder 项目中实现 DX11。所有 SDK 参考都使用 ComPtr<> 模板,例如: // 创建DX11 API设备对象,并获取相应的上下文。 康普特<

回答 1 投票 0

C++ Builder 中的 ComPtr<>

我正在尝试在我的 C++ Builder 项目中实现 DX11。所有 SDK 参考都使用 ComPtr<> 模板。 // 创建DX11 API设备对象,并获取相应的上下文。 康普特 我正在尝试在我的 C++ Builder 项目中实现 DX11。所有 SDK 参考都使用 ComPtr<> 模板。 // Create the DX11 API device object, and get a corresponding context. ComPtr<ID3D11Device> device; ComPtr<ID3D11DeviceContext> context; 当然,C++ Builder 不知道 ComPtr<> 那么我如何在哪里包含它呢?或者通过 ComPtr<> 模板进行移植。基本上让它在 C++ Builder 中工作。 更新 于是有人问我关于标题的事。显然我没有所需的标头,因此我在这里寻求解决方案。 #include <vcl.h> #include <winuser.h> #include <d2d1.h> #include <d3d11.h> 根据 Microsoft 的说法,我应该包含 <client.h>,但 C++ Builder 无法找到该内容。 ATL::CComPtr是微软的课程。我相信它在微软的atlcom.h或atlcomcli.h中。将会有一个 MFC 等效项。 如果您没有 Visual Studio,模板将如下所示: template<typename T> class CComPtr { T *m_pObj; public: CComPtr() : m_pObj(nullptr) {} CComPtr(T *p) : m_pObj(p) { p->AddRef(); } ~CComPtr(); HRESULT CreateInstance(REFCLSID rclsid, DWORD dwClsContext, LPUNKNOWN pUnkOuter=nullptr, REFIID riid = IID_IUnknown) { ASSERTE(m_pObj == nullptr); // if not, release first return CoCreateInstance(rclsid, pUnkOuter, dwClasContext, riid, &m_pObj); } void Release() { if (m_pObj) m_pObj->Release(); m_pObj = nullptr; } // These methods access the pointer without adding or releasing references. void Attach(T *p); T* Detach(); // non-modifying operator overloads T* operator *(); T* operator ->(); operator bool(); // modifying overload - Pointer should be null before use. T** operator &(); };

回答 1 投票 0

std::shared_ptr 在多大程度上保证了线程安全?

我正在阅读http://gcc.gnu.org/onlinedocs/libstdc++/manual/shared_ptr.html,一些线程安全问题对我来说仍然不清楚: 标准保证引用计数由线程处理...

回答 3 投票 0

我应该分配或重置unique_ptr吗?

考虑到所拥有对象的生命周期与其所有者相关联的常见情况,我可以通过两种方式之一使用唯一指针。 。 它可以被赋值: 班级所有者 { std::unique_ptr<

回答 3 投票 0

如何在表达式中触发 std::shared_ptr 的 bool 运算符(即 `bool is_empty = cur_front_res && cur_back_res;` )?

既然cur_front_res和cur_back_res都是shared_ptr,那么std::shared_ptr的bool运算符如何在表达式中触发(即bool is_empty = cur_front_res && cur_back_res;)?...

回答 1 投票 0

如何有效地检查两个 std::weak_ptr 指针是否指向同一个对象?

我想比较两个 std::weak_ptr 或一个 std::weak_ptr 和一个 std::shared_ptr 是否相等。 我想知道的是weak_ptr/shared_ptr各自指向的对象是否相同....

回答 1 投票 0

当共享托管对象永远不会同时被评估时,在生产者和消费者之间使用 std::shared_ptr 是否安全?

下面是演示代码片段。 由于 std::shared_ptr 本身是线程安全的并且托管对象永远不会被生产者和消费者同时访问,因此可以删除互斥锁吗? #

回答 1 投票 0

为什么没有 std::shared_ptr<T[]> 专业化?

该标准提供了 std::unique_ptr 的模板特化,它可以从其析构函数中正确调用delete[]: 无效函数() { std::unique_ptr< int[] > arr(new int[10]); ......

回答 1 投票 0

为什么不再允许从数组的 unique_ptr 创建shared_ptr?

来自 cppreference: 在 C++11 和 C++14 中,构造 std::shared_ptr 是有效的 std::unique_ptr: std::unique_ptr arr(new int[1]); std::shared_ptr 来自cppreference: 在 C++11 和 C++14 中,从以下位置构造 std::shared_ptr<T> 是有效的 std::unique_ptr<T[]>: std::unique_ptr<int[]> arr(new int[1]); std::shared_ptr<int> ptr(std::move(arr)); 由于 shared_ptr 获得了它的删除器(a std::default_delete<T[]> 对象)来自 unique_ptr,数组将 被正确地释放。 C++17 中不再允许这样做。而是数组形式 应该使用std::shared_ptr<T[]>。 为什么C++17中不允许这样?发生了什么变化? p0497r0: 从 unique_ptr 构建共享指针的约束不正确 [...] 根据实施经验,我认为正确的形式是:         备注: 除非 Y* 与 T* 兼容且 unique_ptr<Y, D>::pointer 可转换为 element_type*,否则此构造函数不应参与重载决策。 “兼容”检查可防止从 unique_ptr<T[]> 到 shared_ptr<T> 的不良转换,“可转换为”检查可确保 unique_ptr<Y, D>::get() 的结果可以存储在 shared_ptr 中并由 shared_ptr<T>::get() 返回。 换句话说,故意使其无效只是因为它不应该有效,而不仅仅是其他更改的副作用。 这对我来说很有意义。 shared_ptr<T> 很可能被其他程序员解读为仅指向一个 T 对象。要求程序员在需要多个 shared_ptr<T[]> 对象时使用 T 会导致代码更具可读性。 注意:标准中没有这个正确的形式。然而,其基本原理部分是对标准内容的评论。

回答 1 投票 0

你能让 std::shared_ptr 管理一个用 new T[] 分配的数组吗?

你能让 std::shared_ptr 指向数组吗?例如, std::shared_ptr sp(new int[10]); 如果没有,那为什么不呢?我已经知道的原因之一是不能递增/递减......

回答 2 投票 0

智能指针可以与使用 new T[] 分配的数组一起使用吗?

智能指针如何处理数组?例如, 无效函数() { std::unique_ptr my_array(new int[5]); } 当 my_array 超出范围并被破坏时,整个数组是否...

回答 2 投票 0

为什么添加 & 会导致 Rust 移动?

编译如下: #[导出(调试)] 枚举列表{ 缺点(Rc>,Rc), 零, } 使用 std::ops::Deref ; 使用 crate::List::{Cons, Nil}; 使用 std::cell::RefCell; 你...

回答 1 投票 0

是否存在具有单个强所有者和多个弱引用的共享指针?

我正在寻找一个类似于 Arc/Rc 的智能指针,只不过它不允许共享所有权。 我想要尽可能多的 rc::Weak 引用,但我只想要一个强引用,又名...

回答 2 投票 0

通过父类访问子类变量

我正在为圆形和正方形制作一个简单的 2D 物理引擎。我有一个主体类,我希望在创建时为其提供一个形状的 unique_ptr 实例。形状可以是圆形或盒子......

回答 1 投票 0

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