unique_ptr独占所有权,性能高,适用于单一拥有者场景;shared_ptr共享所有权,通过引用计数管理生命周期,支持多拥有者但有性能开销和循环引用风险。

C++中的
shared_ptr
unique_ptr
unique_ptr
shared_ptr
unique_ptr
shared_ptr
unique_ptr
shared_ptr
unique_ptr
unique_ptr
std::move
unique_ptr
shared_ptr
shared_ptr
shared_ptr
shared_ptr
shared_ptr
立即学习“C++免费学习笔记(深入)”;
选择哪种智能指针,关键在于你对资源所有权的需求。如果资源有一个明确的、唯一的拥有者,并且这个拥有者在其生命周期结束时负责释放资源,那么
unique_ptr
shared_ptr
std::unique_ptr
在我看来,
unique_ptr
shared_ptr
它的适用场景非常广泛,几乎涵盖了所有你可以明确资源单一所有权的情况。比如,当你在一个工厂函数中创建对象并返回时,
unique_ptr
std::unique_ptr<MyObject> createObject() {
return std::make_unique<MyObject>(); // 返回一个独占所有权的智能指针
}
// ...
auto obj = createObject(); // obj现在独占MyObject实例再比如,在一个类中,如果某个成员变量是动态分配的,并且它的生命周期完全由这个类的实例来管理,那么
unique_ptr
delete
class Manager {
private:
std::unique_ptr<Resource> _resource; // Manager独占Resource
public:
Manager() : _resource(std::make_unique<Resource>()) {}
// ...
};此外,在标准库容器中存储动态分配的对象时,
std::vector<std::unique_ptr<T>>
unique_ptr
std::shared_ptr
shared_ptr
shared_ptr
shared_ptr
然而,这种便利并非没有代价,它最臭名昭著的陷阱就是循环引用。想象一下,两个对象A和B,A持有一个
shared_ptr
shared_ptr
shared_ptr
shared_ptr
struct B; // 前向声明
struct A {
std::shared_ptr<B> b_ptr;
~A() { std::cout << "A destroyed!\n"; }
};
struct B {
std::shared_ptr<A> a_ptr; // 这里如果用shared_ptr,就会形成循环引用
~B() { std::cout << "B destroyed!\n"; }
};
void create_circular_ref() {
auto a = std::make_shared<A>();
auto b = std::make_shared<B>();
a->b_ptr = b;
b->a_ptr = a;
} // 当a和b离开作用域时,它们的引用计数仍为1,导致A和B都不会被销毁为了解决这个难题,C++标准库引入了
std::weak_ptr
weak_ptr
shared_ptr
weak_ptr
lock()
shared_ptr
lock()
shared_ptr
// 修正后的B结构体,使用weak_ptr打破循环引用
struct B_fixed {
std::weak_ptr<A> a_ptr; // 使用weak_ptr
~B_fixed() { std::cout << "B_fixed destroyed!\n"; }
};
void create_no_circular_ref() {
auto a = std::make_shared<A>();
auto b = std::make_shared<B_fixed>();
a->b_ptr = b;
b->a_ptr = a; // 这里a_ptr不会增加a的引用计数
} // 当a和b离开作用域时,A和B_fixed都会被正确销毁所以,在使用
shared_ptr
weak_ptr
unique_ptr
shared_ptr
在实际的软件开发中,我们经常会遇到这样的场景:一个资源最初被设计为独占所有权,由
unique_ptr
unique_ptr
shared_ptr
从
unique_ptr
shared_ptr
std::move
unique_ptr
std::unique_ptr<Gadget> unique_gadget = std::make_unique<Gadget>(); // ... 经过一些独占阶段的操作 ... // 现在,这个Gadget需要被共享了 std::shared_ptr<Gadget> shared_gadget = std::move(unique_gadget); // 此时,unique_gadget已经变为空指针,所有权已转移给shared_gadget // shared_gadget的引用计数为1
这种转换是单向的。你不能将一个
shared_ptr
unique_ptr
shared_ptr
unique_ptr
shared_ptr
shared_ptr
shared_ptr
这种转换机制体现了C++智能指针的灵活性和实用性。它允许开发者根据程序运行时的实际需求,动态调整资源的生命周期管理策略。在一个大型系统中,一个对象可能在某个阶段作为内部组件被独占管理,而在另一个阶段又需要作为API的一部分被广泛共享。
unique_ptr
shared_ptr
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号