unique_ptr:如何安全地共享原始指针
unique_ptr: How to safely share raw pointer
我正在创建一个由unique_ptr
管理的类,但由于各种原因,我需要为实现提供对该对象的原始指针的访问权限。但是,我希望确保用户不会无意中删除底层对象。我提出了以下示例代码:
(它是树结构的一部分,我需要能够查看树节点的成员,而无需实际分离它们。在这种情况下,shared_ptr
似乎有些过头了。)
#include <memory>
using namespace std;
class unOnly
{
~unOnly() {}
public:
unOnly() {}
friend class default_delete<unOnly>;
};
int main()
{
unique_ptr<unOnly> ptr(new unOnly());
}
这在gcc 4.4.5中为我编译。然而,我能确定在所有实现中,default_delete
实际上是delete
的对象,而不是一些私有的实现类吗?我应该写我自己的委托书来确定吗?
为什么不
class unOnly
{
unOnly() {}
~unOnly() {}
struct deleter { void operator()(unOnly* x) { delete x; }};
public:
typedef std::unique_ptr<unOnly, deleter> handle;
static handle create() { return handle(new unOnly); }
};
auto x = unOnly::create();
甚至
class unOnly
{
~unOnly() {}
struct deleter { void operator()(unOnly* x) { delete x; }};
public:
unOnly() {}
typedef std::unique_ptr<unOnly, deleter> handle;
};
unOnly::handle x(new unOnly);
(我更喜欢前者,但后者可能更符合您的要求)
unique_ptr
的要点(除了拥有一个拥有其指针的对象)是,您可以向它传递一个自定义的deleter,因此只写一个deleter而不做其他事情是有意义的,这似乎不必要地复杂。
引用标准:
20.7类模板unique_ptr
6。[…]
template<class T, class D = default_delete<T>> class unique_ptr;
20.7.1.1.1
1类模板default_delete用作类模板unique_ptr的默认deleter(销毁策略)。
因此,似乎unique_ptr
的实现需要使用default_delete
作为默认的删除器。
编辑:
但这并不意味着你的方法是万无一失的,请参阅下面@RMartinhoFernandes的评论。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 从不同线程使用int64的不同字节安全吗
- 共享队列的线程安全
- Libssh2:在"每个线程的通道"基础上在线程之间共享 ssh 会话是否安全?
- 通过引用返回共享对象是否安全"std::lock_guard<mutex>"?
- 只写到共享 std::unordered_map 线程是否安全
- 链接后,剥离共享库是安全的吗?
- 在可执行文件中实现静态方法是否安全,该方法已在共享库中实现
- 公开具有共享库的类型安全动态API
- 对共享数据的线程安全访问 - 读/写实际发生,不会发生重新排序
- QString 的隐式共享实现如何线程安全?
- 线程安全、无数据争用、无延迟的共享容器 (circular_buffer)
- 如何在C++中实现自己的线程安全共享指针
- 为什么当对共享数据的所有引用都序列化时,函数是线程安全的
- 异常安全C++共享指针
- boost::posix_time::ptime存储在Windows共享内存映射中是否安全?
- linux上c++线程间的线程安全数据交换/共享内存
- 共享提升::shared_ptr<>变量线程安全吗?
- 如何在c++中使共享内存中的容器线程安全
- 向下投射具有附加功能的派生类的共享指针-这样安全吗