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_ptrshared_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

#牛客AI配图神器#

全部评论

相关推荐

09-26 19:45
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务