C++11智能指针终极指南
C++11 智能指针详解(下)
shared_ptr:共享所有权智能指针
shared_ptr 通过引用计数机制管理资源,多个指针可以共享同一对象的所有权。当最后一个 shared_ptr 离开作用域时,资源自动释放。
构造方式:
std::shared_ptr<int> p1(new int(10));
std::shared_ptr<int> p2 = std::make_shared<int>(20); // 更高效
引用计数操作:
p1.use_count(); // 获取当前引用计数
p1.reset(); // 减少引用计数(可能释放资源)
循环引用问题:
struct Node {
std::shared_ptr<Node> next;
};
auto node1 = std::make_shared<Node>();
auto node2 = std::make_shared<Node>();
node1->next = node2;
node2->next = node1; // 循环引用导致内存泄漏
weak_ptr:解决循环引用的助手
weak_ptr 是 shared_ptr 的观察者,不增加引用计数,可检测资源是否有效。
基本用法:
std::weak_ptr<int> wp(p1);
if (auto sp = wp.lock()) { // 尝试提升为shared_ptr
// 资源仍存在
}
解决循环引用:
struct SafeNode {
std::weak_ptr<SafeNode> next; // 使用weak_ptr替代
};
unique_ptr 与 shared_ptr 的转换
unique_ptr 可以转移所有权到 shared_ptr,反之则不行:
std::unique_ptr<int> up(new int(42));
std::shared_ptr<int> sp = std::move(up); // 合法
自定义删除器
两种智能指针都支持自定义删除逻辑:
// 文件指针自定义删除
std::shared_ptr<FILE> filePtr(fopen("test.txt","r"), [](FILE* f){
if(f) fclose(f);
});
// 数组删除器
std::unique_ptr<int[]> arr(new int[10]);
性能与安全建议
- 优先使用
make_shared而非new(单次内存分配) - 避免原始指针与智能指针混用
- 按需选择指针类型:
- 独占所有权用
unique_ptr - 共享所有权用
shared_ptr - 观察资源用
weak_ptr
- 独占所有权用
典型应用场景
- 资源自动管理(文件、网络连接)
- 工厂模式返回对象
- 容器存储动态对象
- 多线程共享只读数据
通过合理组合这三种智能指针,可以显著降低C++内存管理复杂度,同时保持代码的高效性。现代C++项目应尽量避免直接使用 new/delete。
BbS.okapop051.sbs/PoSt/1122_038559.HtM
BbS.okapop052.sbs/PoSt/1122_400768.HtM
BbS.okapop053.sbs/PoSt/1122_730674.HtM
BbS.okapop054.sbs/PoSt/1122_653436.HtM
BbS.okapop055.sbs/PoSt/1122_118484.HtM
BbS.okapop056.sbs/PoSt/1122_543559.HtM
BbS.okapop057.sbs/PoSt/1122_214483.HtM
BbS.okapop058.sbs/PoSt/1122_297129.HtM
BbS.okapop059.sbs/PoSt/1122_056270.HtM
BbS.okapop060.sbs/PoSt/1122_763729.HtM
BbS.okapop051.sbs/PoSt/1122_508131.HtM
BbS.okapop052.sbs/PoSt/1122_852960.HtM
BbS.okapop053.sbs/PoSt/1122_631602.HtM
BbS.okapop054.sbs/PoSt/1122_272133.HtM
BbS.okapop055.sbs/PoSt/1122_592201.HtM
BbS.okapop056.sbs/PoSt/1122_664730.HtM
BbS.okapop057.sbs/PoSt/1122_501307.HtM
BbS.okapop058.sbs/PoSt/1122_950055.HtM
BbS.okapop059.sbs/PoSt/1122_339135.HtM
BbS.okapop060.sbs/PoSt/1122_945610.HtM
BbS.okapop051.sbs/PoSt/1122_483791.HtM
BbS.okapop052.sbs/PoSt/1122_362771.HtM
BbS.okapop053.sbs/PoSt/1122_710885.HtM
BbS.okapop054.sbs/PoSt/1122_764179.HtM
BbS.okapop055.sbs/PoSt/1122_937542.HtM
BbS.okapop056.sbs/PoSt/1122_216903.HtM
BbS.okapop057.sbs/PoSt/1122_613561.HtM
BbS.okapop058.sbs/PoSt/1122_338031.HtM
BbS.okapop059.sbs/PoSt/1122_804166.HtM
BbS.okapop060.sbs/PoSt/1122_281840.HtM
BbS.okapop051.sbs/PoSt/1122_281165.HtM
BbS.okapop052.sbs/PoSt/1122_620694.HtM
BbS.okapop053.sbs/PoSt/1122_590704.HtM
BbS.okapop054.sbs/PoSt/1122_958635.HtM
BbS.okapop055.sbs/PoSt/1122_918524.HtM
BbS.okapop056.sbs/PoSt/1122_953735.HtM
BbS.okapop057.sbs/PoSt/1122_451531.HtM
BbS.okapop058.sbs/PoSt/1122_451229.HtM
BbS.okapop059.sbs/PoSt/1122_662465.HtM
BbS.okapop060.sbs/PoSt/1122_207114.HtM
BbS.okapop061.sbs/PoSt/1122_433805.HtM
BbS.okapop062.sbs/PoSt/1122_953035.HtM
BbS.okapop063.sbs/PoSt/1122_372737.HtM
BbS.okapop065.sbs/PoSt/1122_936374.HtM
BbS.okapop066.sbs/PoSt/1122_217293.HtM
BbS.okapop067.sbs/PoSt/1122_335687.HtM
BbS.okapop068.sbs/PoSt/1122_517339.HtM
BbS.okapop069.sbs/PoSt/1122_967695.HtM
BbS.okapop070.sbs/PoSt/1122_768280.HtM
BbS.okapop071.sbs/PoSt/1122_334187.HtM
BbS.okapop061.sbs/PoSt/1122_374050.HtM
BbS.okapop062.sbs/PoSt/1122_655588.HtM
BbS.okapop063.sbs/PoSt/1122_680673.HtM
BbS.okapop065.sbs/PoSt/1122_331026.HtM
BbS.okapop066.sbs/PoSt/1122_320728.HtM
BbS.okapop067.sbs/PoSt/1122_975525.HtM
BbS.okapop068.sbs/PoSt/1122_294821.HtM
BbS.okapop069.sbs/PoSt/1122_371289.HtM
BbS.okapop070.sbs/PoSt/1122_209482.HtM
BbS.okapop071.sbs/PoSt/1122_126958.HtM
BbS.okapop061.sbs/PoSt/1122_776043.HtM
BbS.okapop062.sbs/PoSt/1122_515573.HtM
BbS.okapop063.sbs/PoSt/1122_048877.HtM
BbS.okapop065.sbs/PoSt/1122_950090.HtM
BbS.okapop066.sbs/PoSt/1122_030744.HtM
BbS.okapop067.sbs/PoSt/1122_074932.HtM
BbS.okapop068.sbs/PoSt/1122_094973.HtM
BbS.okapop069.sbs/PoSt/1122_976534.HtM
BbS.okapop070.sbs/PoSt/1122_194739.HtM
BbS.okapop071.sbs/PoSt/1122_370889.HtM
BbS.okapop061.sbs/PoSt/1122_990698.HtM
BbS.okapop062.sbs/PoSt/1122_827665.HtM
BbS.okapop063.sbs/PoSt/1122_833449.HtM
BbS.okapop065.sbs/PoSt/1122_758151.HtM
BbS.okapop066.sbs/PoSt/1122_602610.HtM
BbS.okapop067.sbs/PoSt/1122_785262.HtM
BbS.okapop068.sbs/PoSt/1122_081804.HtM
BbS.okapop069.sbs/PoSt/1122_486222.HtM
BbS.okapop070.sbs/PoSt/1122_837416.HtM
BbS.okapop071.sbs/PoSt/1122_261071.HtM

海康威视公司福利 1282人发布