
std::unique_ptr 不支持拷贝构造和拷贝赋值操作,主要是因为它遵循 独占所有权(exclusive ownership) 的语义。这是 C++ 智能指针设计中的一种关键原则,目的是确保资源的唯一所有权和自动释放。以下是具体原因和设计考量:
unique_ptr 的核心思想是 唯一拥有 所管理的对象,即同一时间只能有一个 unique_ptr 指向某个资源。unique_ptr 指向同一资源,违背了“唯一所有权”的初衷。unique_ptr 共享同一资源。unique_ptr 析构时,资源会被释放,其他 unique_ptr 会变成悬空指针(dangling pointers),引发未定义行为。unique_ptr 通过 移动语义(move semantics) 支持所有权的转移(例如 std::move),而非拷贝:
std::unique_ptr<int> ptr1 = std::make_unique<int>(42);
std::unique_ptr<int> ptr2 = std::move(ptr1); // 所有权转移,ptr1 变为 nullptr移动操作后,原 unique_ptr 会释放所有权(变为 nullptr),确保资源始终只有一个所有者。
std::shared_ptr 的对比std::shared_ptr 支持拷贝,因为它通过引用计数实现共享所有权,但会带来额外的性能开销(引用计数的原子操作)。unique_ptr 的设计目标是轻量级、零开销的独占管理,因此省略了拷贝功能以提高效率。std::move),避免隐式的所有权共享。// 非法操作:拷贝构造(编译错误)
std::unique_ptr<int> p1 = std::make_unique<int>(10);
std::unique_ptr<int> p2 = p1; // 错误!拷贝构造被禁用
// 合法操作:移动语义
std::unique_ptr<int> p3 = std::move(p1); // p1 的所有权转移给 p3std::unique_ptr 禁用拷贝操作是为了:
如果需要共享所有权,应使用 std::shared_ptr。