在 C++11 中,unique_ptr
和 shared_ptr
是两种智能指针,它们都能够帮助管理动态分配的内存,但它们的管理策略和用法有所不同。
-
unique_ptr
是一种独占所有权的智能指针,意味着同一时间只能有一个unique_ptr
指向一个特定的资源。当unique_ptr
被销毁时,它所指向的对象也会被自动删除。 -
shared_ptr
是一种共享所有权的智能指针,允许多个shared_ptr
实例指向同一个资源。每个shared_ptr
都会维护一个引用计数,当最后一个指向对象的shared_ptr
被销毁时,该对象才会被删除。
转换关系
-
unique_ptr
转shared_ptr
可以将unique_ptr
转换为shared_ptr
。这种转换是安全的,因为它从独占所有权模型转变为共享所有权模型。转换后,原始的unique_ptr
将不再拥有对象的所有权,所有权被转移给了shared_ptr
。这可以通过std::move
来实现,因为unique_ptr
不能被复制,只能被移动。示例代码:
cppstd::unique_ptr<int> uPtr(new int(10)); std::shared_ptr<int> sPtr = std::move(uPtr); // 转移所有权
-
shared_ptr
转unique_ptr
这种转换通常是不安全的,因为shared_ptr
的设计是为了多个指针共享同一个对象的所有权。因此,标准库中并没有提供直接从shared_ptr
到unique_ptr
的转换方式。如果你确实需要这样做,你必须确保没有其他shared_ptr
实例正在指向该对象。这种操作通常涉及到手动管理资源,可能会导致错误和资源泄漏。
总结来说,unique_ptr
可以安全地转换为 shared_ptr
,这在实际开发中是常见的。然而,从 shared_ptr
转换到 unique_ptr
通常是不推荐的,因为它违反了 shared_ptr
的设计初衷并可能引起资源管理上的问题。如果你需要进行这种转换,务必谨慎并确保理解所有权的转移和影响。