shared_ptr是内存管理的理想选择,因为它通过引用计数机制实现共享所有权,允许多个指针安全地共享同一资源,当最后一个shared_ptr销毁时资源自动释放,避免内存泄漏和悬空指针;在多所有权场景下,如缓存、图形渲染或事件系统,它能自动管理复杂生命周期;为防止循环引用导致内存泄漏,应使用weak_ptr打破引用环,weak_ptr不增加引用计数,仅作为观察者通过lock()安全访问对象;相比unique_ptr(独占所有权,轻量高效,适用于单一所有者场景)和原始指针(无所有权管理,易出错,仅用于性能敏感或非拥有观察),shared_ptr适用于资源被多方共享且生命周期不确定的场景,三者应根据所有权模型合理选用。

shared_ptr
shared_ptr
使用
std::shared_ptr
std::make_shared
shared_ptr
new
shared_ptr
当你复制一个
shared_ptr
shared_ptr
shared_ptr
shared_ptr
#include <iostream>
#include <memory>
#include <vector>
class MyResource {
public:
MyResource(int id) : id_(id) {
std::cout << "MyResource " << id_ << " created.\n";
}
~MyResource() {
std::cout << "MyResource " << id_ << " destroyed.\n";
}
void doSomething() {
std::cout << "MyResource " << id_ << " doing something.\n";
}
private:
int id_;
};
void processResource(std::shared_ptr<MyResource> res) {
std::cout << "Inside processResource, ref count: " << res.use_count() << "\n";
res->doSomething();
} // res 离开作用域,引用计数减一
int main() {
// 推荐使用 make_shared
auto res1 = std::make_shared<MyResource>(1);
std::cout << "res1 ref count after creation: " << res1.use_count() << "\n";
// 复制 shared_ptr,引用计数增加
std::shared_ptr<MyResource> res2 = res1;
std::cout << "res1 ref count after copy to res2: " << res1.use_count() << "\n";
processResource(res1); // 传递 shared_ptr,临时增加引用计数
std::cout << "res1 ref count after processResource: " << res1.use_count() << "\n";
// 将 shared_ptr 放入容器
std::vector<std::shared_ptr<MyResource>> resources;
resources.push_back(res1);
std::cout << "res1 ref count after push_back: " << res1.use_count() << "\n";
// 当所有 shared_ptr 都离开作用域,对象才会被销毁
// 比如 res1, res2, 以及 resources 向量中的元素都销毁后
// MyResource 1 才会被销毁
return 0;
}shared_ptr
在我看来,
shared_ptr
unique_ptr
想象一下,你有一个缓存系统,里面存放着一些从数据库加载进来的数据对象。这些数据对象可能会被UI层、业务逻辑层、甚至后台任务同时访问。如果用原始指针,你很难判断什么时候可以安全地释放这些数据:是UI关闭了?还是业务逻辑处理完了?如果某个后台任务还在异步处理它呢?这时,
shared_ptr
shared_ptr
shared_ptr
再比如,在图形渲染中,一个纹理资源可能被多个渲染对象共享,每个对象都需要这个纹理,但谁也不是它的唯一拥有者。或者在事件驱动系统中,一个事件对象可能被多个监听器订阅,每个监听器都可能在处理它。这些都是
shared_ptr
shared_ptr
这是一个非常经典且容易踩的坑,也是
shared_ptr
shared_ptr
shared_ptr
shared_ptr
shared_ptr
解决这个问题的“利器”就是
std::weak_ptr
weak_ptr
shared_ptr
weak_ptr
weak_ptr
当你想访问
weak_ptr
lock()
lock()
shared_ptr
lock()
shared_ptr
lock()
shared_ptr
lock()
在设计数据结构时,特别是涉及到父子关系、观察者模式或图结构时,如果存在循环引用,通常的做法是让强所有权(
shared_ptr
weak_ptr
shared_ptr
weak_ptr
shared_ptr
unique_ptr
选择哪种指针,很多时候取决于你对资源“所有权”的理解和设计。这三者各有各的优势和适用范围,没有绝对的优劣之分。
std::unique_ptr
unique_ptr
unique_ptr
unique_ptr
shared_ptr
std::shared_ptr
shared_ptr
unique_ptr
shared_ptr
至于原始指针(raw pointer),它不具备任何所有权语义。它仅仅是一个内存地址。使用原始指针时,内存的管理完全由程序员手动负责。这意味着你需要自己去
new
delete
new
delete
delete
delete
总结来说,如果资源是独占的,用
unique_ptr
shared_ptr
以上就是智能指针在STL中应用 shared_ptr使用场景分析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号