C++ 智能指针:unique_ptr 与 shared_ptr

智能指针把资源释放放进对象生命周期里。

unique_ptr

std::unique_ptr 表示独占所有权。

auto p = std::make_unique<Node>();

它不能复制,只能移动。

shared_ptr

std::shared_ptr 表示共享所有权,通过引用计数管理生命周期。

auto p = std::make_shared<Node>();

不要滥用 shared_ptr。如果所有权关系不清晰,代码会变得难以推理。

weak_ptr

std::weak_ptr 不拥有对象,常用于打破循环引用。

所有权要能说清楚

使用智能指针前,先用一句话说明所有权关系。如果只能说“大家都可能用一下”,那往往说明设计还不清楚。

unique_ptr 适合表达唯一拥有者:

class Parser {
    std::unique_ptr<Lexer> lexer_;
};

这表示 Parser 拥有 Lexer。当 Parser 销毁时,Lexer 也跟着销毁。

shared_ptr 适合对象确实被多个地方共同拥有的场景,比如异步任务和回调共享状态。但它也会让生命周期变得更长、更难预测。

面试常问

shared_ptr 的循环引用为什么会泄漏?因为两个对象互相持有对方的强引用,引用计数永远无法归零。解决方式通常是把其中一条关系改成 weak_ptr

评论

...

正在读取评论。