[{"data":1,"prerenderedAt":3644},["ShallowReactive",2],{"wiki-page-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-9-zhi-neng-zhi-zhen":3,"wiki-doc-items-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-9-zhi-neng-zhi-zhen":3215,"language-switcher-data-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-9-zhi-neng-zhi-zhen":3628,"wiki-i18n-paths-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-9-zhi-neng-zhi-zhen":3643},{"id":4,"title":5,"body":6,"canonicalPath":3197,"chapter":3198,"chapterSort":3199,"date":3200,"description":204,"docI18nKey":3201,"docKey":3202,"docRoot":3203,"docTitle":3204,"extension":3205,"i18nKey":3206,"isBlogPost":3207,"isWikiDoc":241,"isWikiIndex":3207,"layout":3208,"legacyPath":3209,"locale":3210,"localeSlug":3211,"meta":3212,"navigation":241,"path":3197,"seo":3213,"sourcePath":3209,"sourceStem":3206,"stem":3206,"wikiDepth":211,"__hash__":3214},"content/wiki/2023-10-05-Cplusplus教学/ch18-9-智能指针.md","智能指针",{"type":7,"value":8,"toc":3181},"minimark",[9,13,25,28,94,97,101,131,138,141,180,183,188,198,843,850,858,868,872,877,1384,1388,1394,1398,1410,1869,1873,1879,1886,1890,1901,2338,2342,2348,2363,2367,2370,2401,2959,2963,2969,2972,3074,3077,3114,3117,3151,3154,3177],[10,11,12],"h2",{"id":12},"本节解决什么问题",[14,15,16,20,21,24],"p",{},[17,18,19],"code",{},"new/delete"," 能手动管理动态内存，但它要求你在所有路径上都记得释放资源。一旦函数提前 ",[17,22,23],{},"return","、抛异常，或者多个对象互相持有指针，就很容易出现内存泄漏、重复释放、悬空指针。",[14,26,27],{},"智能指针把\"谁负责释放对象\"写进类型里：",[29,30,31,47],"table",{},[32,33,34],"thead",{},[35,36,37,41,44],"tr",{},[38,39,5],"th",{"align":40},"left",[38,42,43],{"align":40},"所有权含义",[38,45,46],{"align":40},"典型场景",[48,49,50,64,77],"tbody",{},[35,51,52,58,61],{},[53,54,55],"td",{"align":40},[17,56,57],{},"std::unique_ptr\u003CT>",[53,59,60],{"align":40},"独占所有权",[53,62,63],{"align":40},"默认选择，一个对象只有一个拥有者",[35,65,66,71,74],{},[53,67,68],{"align":40},[17,69,70],{},"std::shared_ptr\u003CT>",[53,72,73],{"align":40},"共享所有权",[53,75,76],{"align":40},"对象确实需要多个拥有者共同延长生命周期",[35,78,79,84,87],{},[53,80,81],{"align":40},[17,82,83],{},"std::weak_ptr\u003CT>",[53,85,86],{"align":40},"弱引用，不拥有",[53,88,89,90,93],{"align":40},"观察 ",[17,91,92],{},"shared_ptr"," 管理的对象，常用于打破循环引用",[14,95,96],{},"智能指针本质上是 RAII：智能指针对象离开作用域时，它的析构函数会自动释放所管理的对象。",[10,98,100],{"id":99},"c-标准版本","C++ 标准版本",[102,103,104,111,120,126],"ul",{},[105,106,107,110],"li",{},[17,108,109],{},"std::unique_ptr","：C++11",[105,112,113,116,117,110],{},[17,114,115],{},"std::shared_ptr"," / ",[17,118,119],{},"std::weak_ptr",[105,121,122,125],{},[17,123,124],{},"std::make_unique","：C++14",[105,127,128,110],{},[17,129,130],{},"std::make_shared",[14,132,133,134,137],{},"需要的头文件是 ",[17,135,136],{},"\u003Cmemory>","。",[10,139,140],{"id":140},"学习顺序",[142,143,144,150,157,166,171,177],"ol",{},[105,145,146,147,149],{},"先看手动 ",[17,148,19],{}," 在提前返回时的问题。",[105,151,152,153,156],{},"用 ",[17,154,155],{},"unique_ptr"," 解决单一所有权和自动释放。",[105,158,152,159,162,163,165],{},[17,160,161],{},"std::move"," 转移 ",[17,164,155],{}," 所有权。",[105,167,168,169,137],{},"只有确实共享所有权时，才用 ",[17,170,92],{},[105,172,152,173,176],{},[17,174,175],{},"weak_ptr"," 观察对象并打破循环引用。",[105,178,179],{},"函数参数要表达真实语义：借用、转移、共享是三件不同的事。",[10,181,182],{"id":182},"示例代码",[184,185,187],"h3",{"id":186},"示例-1旧写法的问题和-unique_ptr-的-raii","示例 1：旧写法的问题和 unique_ptr 的 RAII",[14,189,190,191,194,195,197],{},"这个例子故意让函数提前返回。旧写法中，",[17,192,193],{},"delete"," 没有执行；",[17,196,155],{}," 版本中，即使提前返回也会自动析构。",[199,200,205],"pre",{"className":201,"code":202,"language":203,"meta":204,"style":204},"language-cpp shiki shiki-themes github-light github-dark","#include \u003Ciostream>\n#include \u003Cmemory>\n#include \u003Cstring>\n\nclass Resource\n{\n    std::string name_;\n\npublic:\n    explicit Resource(const std::string& name) : name_(name)\n    {\n        std::cout \u003C\u003C name_ \u003C\u003C \" created\\n\";\n    }\n\n    ~Resource()\n    {\n        std::cout \u003C\u003C name_ \u003C\u003C \" destroyed\\n\";\n    }\n\n    void use() const\n    {\n        std::cout \u003C\u003C name_ \u003C\u003C \" used\\n\";\n    }\n};\n\nbool old_style()\n{\n    Resource* res = new Resource(\"old resource\");\n    res->use();\n\n    std::cout \u003C\u003C \"old_style: early return\\n\";\n    return false; // res 没有 delete，析构函数不会执行\n}\n\nbool modern_style()\n{\n    auto res = std::make_unique\u003CResource>(\"modern resource\");\n    res->use();\n\n    std::cout \u003C\u003C \"modern_style: early return\\n\";\n    return false; // res 离开作用域，自动 delete\n}\n\nint main()\n{\n    std::cout \u003C\u003C std::boolalpha;\n\n    bool old_ok = old_style();\n    std::cout \u003C\u003C \"old_ok = \" \u003C\u003C old_ok \u003C\u003C \"\\n\";\n\n    std::cout \u003C\u003C \"---\\n\";\n\n    bool modern_ok = modern_style();\n    std::cout \u003C\u003C \"modern_ok = \" \u003C\u003C modern_ok \u003C\u003C \"\\n\";\n\n    return 0;\n}\n","cpp","",[17,206,207,220,228,236,243,253,260,269,274,280,320,326,356,362,367,376,381,403,408,413,428,433,455,460,466,471,482,487,515,527,532,550,566,572,577,587,592,623,632,637,655,667,672,677,688,693,707,712,727,755,760,778,783,797,823,828,838],{"__ignoreMap":204},[208,209,212,216],"span",{"class":210,"line":211},"line",1,[208,213,215],{"class":214},"szBVR","#include",[208,217,219],{"class":218},"sZZnC"," \u003Ciostream>\n",[208,221,223,225],{"class":210,"line":222},2,[208,224,215],{"class":214},[208,226,227],{"class":218}," \u003Cmemory>\n",[208,229,231,233],{"class":210,"line":230},3,[208,232,215],{"class":214},[208,234,235],{"class":218}," \u003Cstring>\n",[208,237,239],{"class":210,"line":238},4,[208,240,242],{"emptyLinePlaceholder":241},true,"\n",[208,244,246,249],{"class":210,"line":245},5,[208,247,248],{"class":214},"class",[208,250,252],{"class":251},"sScJk"," Resource\n",[208,254,256],{"class":210,"line":255},6,[208,257,259],{"class":258},"sVt8B","{\n",[208,261,263,266],{"class":210,"line":262},7,[208,264,265],{"class":251},"    std",[208,267,268],{"class":258},"::string name_;\n",[208,270,272],{"class":210,"line":271},8,[208,273,242],{"emptyLinePlaceholder":241},[208,275,277],{"class":210,"line":276},9,[208,278,279],{"class":214},"public:\n",[208,281,283,286,289,292,295,298,301,304,307,311,314,317],{"class":210,"line":282},10,[208,284,285],{"class":214},"    explicit",[208,287,288],{"class":251}," Resource",[208,290,291],{"class":258},"(",[208,293,294],{"class":214},"const",[208,296,297],{"class":251}," std",[208,299,300],{"class":258},"::",[208,302,303],{"class":251},"string",[208,305,306],{"class":214},"&",[208,308,310],{"class":309},"s4XuR"," name",[208,312,313],{"class":258},") : ",[208,315,316],{"class":251},"name_",[208,318,319],{"class":258},"(name)\n",[208,321,323],{"class":210,"line":322},11,[208,324,325],{"class":258},"    {\n",[208,327,329,332,335,338,341,343,346,350,353],{"class":210,"line":328},12,[208,330,331],{"class":251},"        std",[208,333,334],{"class":258},"::cout ",[208,336,337],{"class":214},"\u003C\u003C",[208,339,340],{"class":258}," name_ ",[208,342,337],{"class":214},[208,344,345],{"class":218}," \" created",[208,347,349],{"class":348},"sj4cs","\\n",[208,351,352],{"class":218},"\"",[208,354,355],{"class":258},";\n",[208,357,359],{"class":210,"line":358},13,[208,360,361],{"class":258},"    }\n",[208,363,365],{"class":210,"line":364},14,[208,366,242],{"emptyLinePlaceholder":241},[208,368,370,373],{"class":210,"line":369},15,[208,371,372],{"class":251},"    ~Resource",[208,374,375],{"class":258},"()\n",[208,377,379],{"class":210,"line":378},16,[208,380,325],{"class":258},[208,382,384,386,388,390,392,394,397,399,401],{"class":210,"line":383},17,[208,385,331],{"class":251},[208,387,334],{"class":258},[208,389,337],{"class":214},[208,391,340],{"class":258},[208,393,337],{"class":214},[208,395,396],{"class":218}," \" destroyed",[208,398,349],{"class":348},[208,400,352],{"class":218},[208,402,355],{"class":258},[208,404,406],{"class":210,"line":405},18,[208,407,361],{"class":258},[208,409,411],{"class":210,"line":410},19,[208,412,242],{"emptyLinePlaceholder":241},[208,414,416,419,422,425],{"class":210,"line":415},20,[208,417,418],{"class":214},"    void",[208,420,421],{"class":251}," use",[208,423,424],{"class":258},"() ",[208,426,427],{"class":214},"const\n",[208,429,431],{"class":210,"line":430},21,[208,432,325],{"class":258},[208,434,436,438,440,442,444,446,449,451,453],{"class":210,"line":435},22,[208,437,331],{"class":251},[208,439,334],{"class":258},[208,441,337],{"class":214},[208,443,340],{"class":258},[208,445,337],{"class":214},[208,447,448],{"class":218}," \" used",[208,450,349],{"class":348},[208,452,352],{"class":218},[208,454,355],{"class":258},[208,456,458],{"class":210,"line":457},23,[208,459,361],{"class":258},[208,461,463],{"class":210,"line":462},24,[208,464,465],{"class":258},"};\n",[208,467,469],{"class":210,"line":468},25,[208,470,242],{"emptyLinePlaceholder":241},[208,472,474,477,480],{"class":210,"line":473},26,[208,475,476],{"class":214},"bool",[208,478,479],{"class":251}," old_style",[208,481,375],{"class":258},[208,483,485],{"class":210,"line":484},27,[208,486,259],{"class":258},[208,488,490,493,496,499,502,505,507,509,512],{"class":210,"line":489},28,[208,491,492],{"class":258},"    Resource",[208,494,495],{"class":214},"*",[208,497,498],{"class":258}," res ",[208,500,501],{"class":214},"=",[208,503,504],{"class":214}," new",[208,506,288],{"class":251},[208,508,291],{"class":258},[208,510,511],{"class":218},"\"old resource\"",[208,513,514],{"class":258},");\n",[208,516,518,521,524],{"class":210,"line":517},29,[208,519,520],{"class":258},"    res->",[208,522,523],{"class":251},"use",[208,525,526],{"class":258},"();\n",[208,528,530],{"class":210,"line":529},30,[208,531,242],{"emptyLinePlaceholder":241},[208,533,535,537,539,541,544,546,548],{"class":210,"line":534},31,[208,536,265],{"class":251},[208,538,334],{"class":258},[208,540,337],{"class":214},[208,542,543],{"class":218}," \"old_style: early return",[208,545,349],{"class":348},[208,547,352],{"class":218},[208,549,355],{"class":258},[208,551,553,556,559,562],{"class":210,"line":552},32,[208,554,555],{"class":214},"    return",[208,557,558],{"class":348}," false",[208,560,561],{"class":258},";",[208,563,565],{"class":564},"sJ8bj"," // res 没有 delete，析构函数不会执行\n",[208,567,569],{"class":210,"line":568},33,[208,570,571],{"class":258},"}\n",[208,573,575],{"class":210,"line":574},34,[208,576,242],{"emptyLinePlaceholder":241},[208,578,580,582,585],{"class":210,"line":579},35,[208,581,476],{"class":214},[208,583,584],{"class":251}," modern_style",[208,586,375],{"class":258},[208,588,590],{"class":210,"line":589},36,[208,591,259],{"class":258},[208,593,595,598,600,602,604,606,609,612,615,618,621],{"class":210,"line":594},37,[208,596,597],{"class":214},"    auto",[208,599,498],{"class":258},[208,601,501],{"class":214},[208,603,297],{"class":251},[208,605,300],{"class":258},[208,607,608],{"class":251},"make_unique",[208,610,611],{"class":258},"\u003C",[208,613,614],{"class":251},"Resource",[208,616,617],{"class":258},">(",[208,619,620],{"class":218},"\"modern resource\"",[208,622,514],{"class":258},[208,624,626,628,630],{"class":210,"line":625},38,[208,627,520],{"class":258},[208,629,523],{"class":251},[208,631,526],{"class":258},[208,633,635],{"class":210,"line":634},39,[208,636,242],{"emptyLinePlaceholder":241},[208,638,640,642,644,646,649,651,653],{"class":210,"line":639},40,[208,641,265],{"class":251},[208,643,334],{"class":258},[208,645,337],{"class":214},[208,647,648],{"class":218}," \"modern_style: early return",[208,650,349],{"class":348},[208,652,352],{"class":218},[208,654,355],{"class":258},[208,656,658,660,662,664],{"class":210,"line":657},41,[208,659,555],{"class":214},[208,661,558],{"class":348},[208,663,561],{"class":258},[208,665,666],{"class":564}," // res 离开作用域，自动 delete\n",[208,668,670],{"class":210,"line":669},42,[208,671,571],{"class":258},[208,673,675],{"class":210,"line":674},43,[208,676,242],{"emptyLinePlaceholder":241},[208,678,680,683,686],{"class":210,"line":679},44,[208,681,682],{"class":214},"int",[208,684,685],{"class":251}," main",[208,687,375],{"class":258},[208,689,691],{"class":210,"line":690},45,[208,692,259],{"class":258},[208,694,696,698,700,702,704],{"class":210,"line":695},46,[208,697,265],{"class":251},[208,699,334],{"class":258},[208,701,337],{"class":214},[208,703,297],{"class":251},[208,705,706],{"class":258},"::boolalpha;\n",[208,708,710],{"class":210,"line":709},47,[208,711,242],{"emptyLinePlaceholder":241},[208,713,715,718,721,723,725],{"class":210,"line":714},48,[208,716,717],{"class":214},"    bool",[208,719,720],{"class":258}," old_ok ",[208,722,501],{"class":214},[208,724,479],{"class":251},[208,726,526],{"class":258},[208,728,730,732,734,736,739,742,744,746,749,751,753],{"class":210,"line":729},49,[208,731,265],{"class":251},[208,733,334],{"class":258},[208,735,337],{"class":214},[208,737,738],{"class":218}," \"old_ok = \"",[208,740,741],{"class":214}," \u003C\u003C",[208,743,720],{"class":258},[208,745,337],{"class":214},[208,747,748],{"class":218}," \"",[208,750,349],{"class":348},[208,752,352],{"class":218},[208,754,355],{"class":258},[208,756,758],{"class":210,"line":757},50,[208,759,242],{"emptyLinePlaceholder":241},[208,761,763,765,767,769,772,774,776],{"class":210,"line":762},51,[208,764,265],{"class":251},[208,766,334],{"class":258},[208,768,337],{"class":214},[208,770,771],{"class":218}," \"---",[208,773,349],{"class":348},[208,775,352],{"class":218},[208,777,355],{"class":258},[208,779,781],{"class":210,"line":780},52,[208,782,242],{"emptyLinePlaceholder":241},[208,784,786,788,791,793,795],{"class":210,"line":785},53,[208,787,717],{"class":214},[208,789,790],{"class":258}," modern_ok ",[208,792,501],{"class":214},[208,794,584],{"class":251},[208,796,526],{"class":258},[208,798,800,802,804,806,809,811,813,815,817,819,821],{"class":210,"line":799},54,[208,801,265],{"class":251},[208,803,334],{"class":258},[208,805,337],{"class":214},[208,807,808],{"class":218}," \"modern_ok = \"",[208,810,741],{"class":214},[208,812,790],{"class":258},[208,814,337],{"class":214},[208,816,748],{"class":218},[208,818,349],{"class":348},[208,820,352],{"class":218},[208,822,355],{"class":258},[208,824,826],{"class":210,"line":825},55,[208,827,242],{"emptyLinePlaceholder":241},[208,829,831,833,836],{"class":210,"line":830},56,[208,832,555],{"class":214},[208,834,835],{"class":348}," 0",[208,837,355],{"class":258},[208,839,841],{"class":210,"line":840},57,[208,842,571],{"class":258},[14,844,845,849],{},[846,847,848],"strong",{},"运行结果","：",[199,851,856],{"className":852,"code":854,"language":855,"meta":204},[853],"language-text","old resource created\nold resource used\nold_style: early return\nold_ok = false\n---\nmodern resource created\nmodern resource used\nmodern_style: early return\nmodern resource destroyed\nmodern_ok = false\n","text",[17,857,854],{"__ignoreMap":204},[14,859,860,861,864,865,867],{},"注意第一段输出里没有 ",[17,862,863],{},"old resource destroyed","，这就是手动 ",[17,866,19],{}," 在复杂路径下最容易出的错。",[184,869,871],{"id":870},"示例-2unique_ptr-的独占所有权和转移","示例 2：unique_ptr 的独占所有权和转移",[14,873,874,876],{},[17,875,155],{}," 不能复制，只能移动。移动之后，原来的指针会变成空指针。",[199,878,880],{"className":201,"code":879,"language":203,"meta":204,"style":204},"#include \u003Ciostream>\n#include \u003Cmemory>\n#include \u003Cstring>\n#include \u003Cutility>\n\nclass Student\n{\n    std::string name_;\n\npublic:\n    explicit Student(const std::string& name) : name_(name)\n    {\n        std::cout \u003C\u003C \"Student \" \u003C\u003C name_ \u003C\u003C \" created\\n\";\n    }\n\n    ~Student()\n    {\n        std::cout \u003C\u003C \"Student \" \u003C\u003C name_ \u003C\u003C \" destroyed\\n\";\n    }\n\n    const std::string& name() const\n    {\n        return name_;\n    }\n};\n\n// 智能指针负责管理对象生命周期，减少手动释放资源的风险。\nvoid take_ownership(std::unique_ptr\u003CStudent> student)\n{\n    std::cout \u003C\u003C \"take ownership of \" \u003C\u003C student->name() \u003C\u003C \"\\n\";\n}\n\nint main()\n{\n    // 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    auto p = std::make_unique\u003CStudent>(\"Alice\");\n\n    auto owner = std::move(p);\n    std::cout \u003C\u003C \"p is null? \" \u003C\u003C (p == nullptr ? \"yes\" : \"no\") \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C \"owner has \" \u003C\u003C owner->name() \u003C\u003C \"\\n\";\n\n    take_ownership(std::move(owner));\n    std::cout \u003C\u003C \"owner is null? \" \u003C\u003C (owner == nullptr ? \"yes\" : \"no\") \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[17,881,882,888,894,900,907,911,918,922,928,932,936,963,967,992,996,1000,1007,1011,1035,1039,1043,1062,1066,1074,1078,1082,1086,1091,1122,1126,1157,1161,1165,1173,1177,1182,1208,1212,1231,1278,1308,1312,1328,1368,1372,1380],{"__ignoreMap":204},[208,883,884,886],{"class":210,"line":211},[208,885,215],{"class":214},[208,887,219],{"class":218},[208,889,890,892],{"class":210,"line":222},[208,891,215],{"class":214},[208,893,227],{"class":218},[208,895,896,898],{"class":210,"line":230},[208,897,215],{"class":214},[208,899,235],{"class":218},[208,901,902,904],{"class":210,"line":238},[208,903,215],{"class":214},[208,905,906],{"class":218}," \u003Cutility>\n",[208,908,909],{"class":210,"line":245},[208,910,242],{"emptyLinePlaceholder":241},[208,912,913,915],{"class":210,"line":255},[208,914,248],{"class":214},[208,916,917],{"class":251}," Student\n",[208,919,920],{"class":210,"line":262},[208,921,259],{"class":258},[208,923,924,926],{"class":210,"line":271},[208,925,265],{"class":251},[208,927,268],{"class":258},[208,929,930],{"class":210,"line":276},[208,931,242],{"emptyLinePlaceholder":241},[208,933,934],{"class":210,"line":282},[208,935,279],{"class":214},[208,937,938,940,943,945,947,949,951,953,955,957,959,961],{"class":210,"line":322},[208,939,285],{"class":214},[208,941,942],{"class":251}," Student",[208,944,291],{"class":258},[208,946,294],{"class":214},[208,948,297],{"class":251},[208,950,300],{"class":258},[208,952,303],{"class":251},[208,954,306],{"class":214},[208,956,310],{"class":309},[208,958,313],{"class":258},[208,960,316],{"class":251},[208,962,319],{"class":258},[208,964,965],{"class":210,"line":328},[208,966,325],{"class":258},[208,968,969,971,973,975,978,980,982,984,986,988,990],{"class":210,"line":358},[208,970,331],{"class":251},[208,972,334],{"class":258},[208,974,337],{"class":214},[208,976,977],{"class":218}," \"Student \"",[208,979,741],{"class":214},[208,981,340],{"class":258},[208,983,337],{"class":214},[208,985,345],{"class":218},[208,987,349],{"class":348},[208,989,352],{"class":218},[208,991,355],{"class":258},[208,993,994],{"class":210,"line":364},[208,995,361],{"class":258},[208,997,998],{"class":210,"line":369},[208,999,242],{"emptyLinePlaceholder":241},[208,1001,1002,1005],{"class":210,"line":378},[208,1003,1004],{"class":251},"    ~Student",[208,1006,375],{"class":258},[208,1008,1009],{"class":210,"line":383},[208,1010,325],{"class":258},[208,1012,1013,1015,1017,1019,1021,1023,1025,1027,1029,1031,1033],{"class":210,"line":405},[208,1014,331],{"class":251},[208,1016,334],{"class":258},[208,1018,337],{"class":214},[208,1020,977],{"class":218},[208,1022,741],{"class":214},[208,1024,340],{"class":258},[208,1026,337],{"class":214},[208,1028,396],{"class":218},[208,1030,349],{"class":348},[208,1032,352],{"class":218},[208,1034,355],{"class":258},[208,1036,1037],{"class":210,"line":410},[208,1038,361],{"class":258},[208,1040,1041],{"class":210,"line":415},[208,1042,242],{"emptyLinePlaceholder":241},[208,1044,1045,1048,1050,1052,1054,1056,1058,1060],{"class":210,"line":430},[208,1046,1047],{"class":214},"    const",[208,1049,297],{"class":251},[208,1051,300],{"class":258},[208,1053,303],{"class":251},[208,1055,306],{"class":214},[208,1057,310],{"class":251},[208,1059,424],{"class":258},[208,1061,427],{"class":214},[208,1063,1064],{"class":210,"line":435},[208,1065,325],{"class":258},[208,1067,1068,1071],{"class":210,"line":457},[208,1069,1070],{"class":214},"        return",[208,1072,1073],{"class":258}," name_;\n",[208,1075,1076],{"class":210,"line":462},[208,1077,361],{"class":258},[208,1079,1080],{"class":210,"line":468},[208,1081,465],{"class":258},[208,1083,1084],{"class":210,"line":473},[208,1085,242],{"emptyLinePlaceholder":241},[208,1087,1088],{"class":210,"line":484},[208,1089,1090],{"class":564},"// 智能指针负责管理对象生命周期，减少手动释放资源的风险。\n",[208,1092,1093,1096,1099,1101,1104,1106,1108,1110,1113,1116,1119],{"class":210,"line":489},[208,1094,1095],{"class":214},"void",[208,1097,1098],{"class":251}," take_ownership",[208,1100,291],{"class":258},[208,1102,1103],{"class":251},"std",[208,1105,300],{"class":258},[208,1107,155],{"class":251},[208,1109,611],{"class":258},[208,1111,1112],{"class":251},"Student",[208,1114,1115],{"class":258},"> ",[208,1117,1118],{"class":309},"student",[208,1120,1121],{"class":258},")\n",[208,1123,1124],{"class":210,"line":517},[208,1125,259],{"class":258},[208,1127,1128,1130,1132,1134,1137,1139,1142,1145,1147,1149,1151,1153,1155],{"class":210,"line":529},[208,1129,265],{"class":251},[208,1131,334],{"class":258},[208,1133,337],{"class":214},[208,1135,1136],{"class":218}," \"take ownership of \"",[208,1138,741],{"class":214},[208,1140,1141],{"class":258}," student->",[208,1143,1144],{"class":251},"name",[208,1146,424],{"class":258},[208,1148,337],{"class":214},[208,1150,748],{"class":218},[208,1152,349],{"class":348},[208,1154,352],{"class":218},[208,1156,355],{"class":258},[208,1158,1159],{"class":210,"line":534},[208,1160,571],{"class":258},[208,1162,1163],{"class":210,"line":552},[208,1164,242],{"emptyLinePlaceholder":241},[208,1166,1167,1169,1171],{"class":210,"line":568},[208,1168,682],{"class":214},[208,1170,685],{"class":251},[208,1172,375],{"class":258},[208,1174,1175],{"class":210,"line":574},[208,1176,259],{"class":258},[208,1178,1179],{"class":210,"line":579},[208,1180,1181],{"class":564},"    // 程序从 main 函数开始执行，下面的语句会按顺序运行。\n",[208,1183,1184,1186,1189,1191,1193,1195,1197,1199,1201,1203,1206],{"class":210,"line":589},[208,1185,597],{"class":214},[208,1187,1188],{"class":258}," p ",[208,1190,501],{"class":214},[208,1192,297],{"class":251},[208,1194,300],{"class":258},[208,1196,608],{"class":251},[208,1198,611],{"class":258},[208,1200,1112],{"class":251},[208,1202,617],{"class":258},[208,1204,1205],{"class":218},"\"Alice\"",[208,1207,514],{"class":258},[208,1209,1210],{"class":210,"line":594},[208,1211,242],{"emptyLinePlaceholder":241},[208,1213,1214,1216,1219,1221,1223,1225,1228],{"class":210,"line":625},[208,1215,597],{"class":214},[208,1217,1218],{"class":258}," owner ",[208,1220,501],{"class":214},[208,1222,297],{"class":251},[208,1224,300],{"class":258},[208,1226,1227],{"class":251},"move",[208,1229,1230],{"class":258},"(p);\n",[208,1232,1233,1235,1237,1239,1242,1244,1247,1250,1253,1256,1259,1262,1265,1268,1270,1272,1274,1276],{"class":210,"line":634},[208,1234,265],{"class":251},[208,1236,334],{"class":258},[208,1238,337],{"class":214},[208,1240,1241],{"class":218}," \"p is null? \"",[208,1243,741],{"class":214},[208,1245,1246],{"class":258}," (p ",[208,1248,1249],{"class":214},"==",[208,1251,1252],{"class":348}," nullptr",[208,1254,1255],{"class":214}," ?",[208,1257,1258],{"class":218}," \"yes\"",[208,1260,1261],{"class":214}," :",[208,1263,1264],{"class":218}," \"no\"",[208,1266,1267],{"class":258},") ",[208,1269,337],{"class":214},[208,1271,748],{"class":218},[208,1273,349],{"class":348},[208,1275,352],{"class":218},[208,1277,355],{"class":258},[208,1279,1280,1282,1284,1286,1289,1291,1294,1296,1298,1300,1302,1304,1306],{"class":210,"line":639},[208,1281,265],{"class":251},[208,1283,334],{"class":258},[208,1285,337],{"class":214},[208,1287,1288],{"class":218}," \"owner has \"",[208,1290,741],{"class":214},[208,1292,1293],{"class":258}," owner->",[208,1295,1144],{"class":251},[208,1297,424],{"class":258},[208,1299,337],{"class":214},[208,1301,748],{"class":218},[208,1303,349],{"class":348},[208,1305,352],{"class":218},[208,1307,355],{"class":258},[208,1309,1310],{"class":210,"line":657},[208,1311,242],{"emptyLinePlaceholder":241},[208,1313,1314,1317,1319,1321,1323,1325],{"class":210,"line":669},[208,1315,1316],{"class":251},"    take_ownership",[208,1318,291],{"class":258},[208,1320,1103],{"class":251},[208,1322,300],{"class":258},[208,1324,1227],{"class":251},[208,1326,1327],{"class":258},"(owner));\n",[208,1329,1330,1332,1334,1336,1339,1341,1344,1346,1348,1350,1352,1354,1356,1358,1360,1362,1364,1366],{"class":210,"line":674},[208,1331,265],{"class":251},[208,1333,334],{"class":258},[208,1335,337],{"class":214},[208,1337,1338],{"class":218}," \"owner is null? \"",[208,1340,741],{"class":214},[208,1342,1343],{"class":258}," (owner ",[208,1345,1249],{"class":214},[208,1347,1252],{"class":348},[208,1349,1255],{"class":214},[208,1351,1258],{"class":218},[208,1353,1261],{"class":214},[208,1355,1264],{"class":218},[208,1357,1267],{"class":258},[208,1359,337],{"class":214},[208,1361,748],{"class":218},[208,1363,349],{"class":348},[208,1365,352],{"class":218},[208,1367,355],{"class":258},[208,1369,1370],{"class":210,"line":679},[208,1371,242],{"emptyLinePlaceholder":241},[208,1373,1374,1376,1378],{"class":210,"line":690},[208,1375,555],{"class":214},[208,1377,835],{"class":348},[208,1379,355],{"class":258},[208,1381,1382],{"class":210,"line":695},[208,1383,571],{"class":258},[14,1385,1386,849],{},[846,1387,848],{},[199,1389,1392],{"className":1390,"code":1391,"language":855,"meta":204},[853],"Student Alice created\np is null? yes\nowner has Alice\ntake ownership of Alice\nStudent Alice destroyed\nowner is null? yes\n",[17,1393,1391],{"__ignoreMap":204},[184,1395,1397],{"id":1396},"示例-3shared_ptr-的共享所有权","示例 3：shared_ptr 的共享所有权",[14,1399,1400,1402,1403,1405,1406,1409],{},[17,1401,92],{}," 通过引用计数管理对象。最后一个 ",[17,1404,92],{}," 销毁或 ",[17,1407,1408],{},"reset"," 后，对象才会释放。",[199,1411,1413],{"className":201,"code":1412,"language":203,"meta":204,"style":204},"#include \u003Ciostream>\n#include \u003Cmemory>\n#include \u003Cstring>\n\nclass File\n{\n    std::string name_;\n\npublic:\n    explicit File(const std::string& name) : name_(name)\n    {\n        std::cout \u003C\u003C \"File \" \u003C\u003C name_ \u003C\u003C \" opened\\n\";\n    }\n\n    ~File()\n    {\n        std::cout \u003C\u003C \"File \" \u003C\u003C name_ \u003C\u003C \" closed\\n\";\n    }\n\n    void read() const\n    {\n        std::cout \u003C\u003C \"read from \" \u003C\u003C name_ \u003C\u003C \"\\n\";\n    }\n};\n\nint main()\n{\n    // 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    // 智能指针负责管理对象生命周期，减少手动释放资源的风险。\n    auto file1 = std::make_shared\u003CFile>(\"log.txt\");\n    std::cout \u003C\u003C \"count after create = \" \u003C\u003C file1.use_count() \u003C\u003C \"\\n\";\n\n    {\n        auto file2 = file1;\n        std::cout \u003C\u003C \"count in scope = \" \u003C\u003C file1.use_count() \u003C\u003C \"\\n\";\n        file2->read();\n    }\n\n    std::cout \u003C\u003C \"count after scope = \" \u003C\u003C file1.use_count() \u003C\u003C \"\\n\";\n\n    file1.reset();\n    std::cout \u003C\u003C \"file1 is empty? \" \u003C\u003C (file1 == nullptr ? \"yes\" : \"no\") \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[17,1414,1415,1421,1427,1433,1437,1444,1448,1454,1458,1462,1489,1493,1519,1523,1527,1534,1538,1563,1567,1571,1582,1586,1611,1615,1619,1623,1631,1635,1639,1644,1672,1703,1707,1711,1724,1753,1763,1767,1771,1800,1804,1813,1853,1857,1865],{"__ignoreMap":204},[208,1416,1417,1419],{"class":210,"line":211},[208,1418,215],{"class":214},[208,1420,219],{"class":218},[208,1422,1423,1425],{"class":210,"line":222},[208,1424,215],{"class":214},[208,1426,227],{"class":218},[208,1428,1429,1431],{"class":210,"line":230},[208,1430,215],{"class":214},[208,1432,235],{"class":218},[208,1434,1435],{"class":210,"line":238},[208,1436,242],{"emptyLinePlaceholder":241},[208,1438,1439,1441],{"class":210,"line":245},[208,1440,248],{"class":214},[208,1442,1443],{"class":251}," File\n",[208,1445,1446],{"class":210,"line":255},[208,1447,259],{"class":258},[208,1449,1450,1452],{"class":210,"line":262},[208,1451,265],{"class":251},[208,1453,268],{"class":258},[208,1455,1456],{"class":210,"line":271},[208,1457,242],{"emptyLinePlaceholder":241},[208,1459,1460],{"class":210,"line":276},[208,1461,279],{"class":214},[208,1463,1464,1466,1469,1471,1473,1475,1477,1479,1481,1483,1485,1487],{"class":210,"line":282},[208,1465,285],{"class":214},[208,1467,1468],{"class":251}," File",[208,1470,291],{"class":258},[208,1472,294],{"class":214},[208,1474,297],{"class":251},[208,1476,300],{"class":258},[208,1478,303],{"class":251},[208,1480,306],{"class":214},[208,1482,310],{"class":309},[208,1484,313],{"class":258},[208,1486,316],{"class":251},[208,1488,319],{"class":258},[208,1490,1491],{"class":210,"line":322},[208,1492,325],{"class":258},[208,1494,1495,1497,1499,1501,1504,1506,1508,1510,1513,1515,1517],{"class":210,"line":328},[208,1496,331],{"class":251},[208,1498,334],{"class":258},[208,1500,337],{"class":214},[208,1502,1503],{"class":218}," \"File \"",[208,1505,741],{"class":214},[208,1507,340],{"class":258},[208,1509,337],{"class":214},[208,1511,1512],{"class":218}," \" opened",[208,1514,349],{"class":348},[208,1516,352],{"class":218},[208,1518,355],{"class":258},[208,1520,1521],{"class":210,"line":358},[208,1522,361],{"class":258},[208,1524,1525],{"class":210,"line":364},[208,1526,242],{"emptyLinePlaceholder":241},[208,1528,1529,1532],{"class":210,"line":369},[208,1530,1531],{"class":251},"    ~File",[208,1533,375],{"class":258},[208,1535,1536],{"class":210,"line":378},[208,1537,325],{"class":258},[208,1539,1540,1542,1544,1546,1548,1550,1552,1554,1557,1559,1561],{"class":210,"line":383},[208,1541,331],{"class":251},[208,1543,334],{"class":258},[208,1545,337],{"class":214},[208,1547,1503],{"class":218},[208,1549,741],{"class":214},[208,1551,340],{"class":258},[208,1553,337],{"class":214},[208,1555,1556],{"class":218}," \" closed",[208,1558,349],{"class":348},[208,1560,352],{"class":218},[208,1562,355],{"class":258},[208,1564,1565],{"class":210,"line":405},[208,1566,361],{"class":258},[208,1568,1569],{"class":210,"line":410},[208,1570,242],{"emptyLinePlaceholder":241},[208,1572,1573,1575,1578,1580],{"class":210,"line":415},[208,1574,418],{"class":214},[208,1576,1577],{"class":251}," read",[208,1579,424],{"class":258},[208,1581,427],{"class":214},[208,1583,1584],{"class":210,"line":430},[208,1585,325],{"class":258},[208,1587,1588,1590,1592,1594,1597,1599,1601,1603,1605,1607,1609],{"class":210,"line":435},[208,1589,331],{"class":251},[208,1591,334],{"class":258},[208,1593,337],{"class":214},[208,1595,1596],{"class":218}," \"read from \"",[208,1598,741],{"class":214},[208,1600,340],{"class":258},[208,1602,337],{"class":214},[208,1604,748],{"class":218},[208,1606,349],{"class":348},[208,1608,352],{"class":218},[208,1610,355],{"class":258},[208,1612,1613],{"class":210,"line":457},[208,1614,361],{"class":258},[208,1616,1617],{"class":210,"line":462},[208,1618,465],{"class":258},[208,1620,1621],{"class":210,"line":468},[208,1622,242],{"emptyLinePlaceholder":241},[208,1624,1625,1627,1629],{"class":210,"line":473},[208,1626,682],{"class":214},[208,1628,685],{"class":251},[208,1630,375],{"class":258},[208,1632,1633],{"class":210,"line":484},[208,1634,259],{"class":258},[208,1636,1637],{"class":210,"line":489},[208,1638,1181],{"class":564},[208,1640,1641],{"class":210,"line":517},[208,1642,1643],{"class":564},"    // 智能指针负责管理对象生命周期，减少手动释放资源的风险。\n",[208,1645,1646,1648,1651,1653,1655,1657,1660,1662,1665,1667,1670],{"class":210,"line":529},[208,1647,597],{"class":214},[208,1649,1650],{"class":258}," file1 ",[208,1652,501],{"class":214},[208,1654,297],{"class":251},[208,1656,300],{"class":258},[208,1658,1659],{"class":251},"make_shared",[208,1661,611],{"class":258},[208,1663,1664],{"class":251},"File",[208,1666,617],{"class":258},[208,1668,1669],{"class":218},"\"log.txt\"",[208,1671,514],{"class":258},[208,1673,1674,1676,1678,1680,1683,1685,1688,1691,1693,1695,1697,1699,1701],{"class":210,"line":534},[208,1675,265],{"class":251},[208,1677,334],{"class":258},[208,1679,337],{"class":214},[208,1681,1682],{"class":218}," \"count after create = \"",[208,1684,741],{"class":214},[208,1686,1687],{"class":258}," file1.",[208,1689,1690],{"class":251},"use_count",[208,1692,424],{"class":258},[208,1694,337],{"class":214},[208,1696,748],{"class":218},[208,1698,349],{"class":348},[208,1700,352],{"class":218},[208,1702,355],{"class":258},[208,1704,1705],{"class":210,"line":552},[208,1706,242],{"emptyLinePlaceholder":241},[208,1708,1709],{"class":210,"line":568},[208,1710,325],{"class":258},[208,1712,1713,1716,1719,1721],{"class":210,"line":574},[208,1714,1715],{"class":214},"        auto",[208,1717,1718],{"class":258}," file2 ",[208,1720,501],{"class":214},[208,1722,1723],{"class":258}," file1;\n",[208,1725,1726,1728,1730,1732,1735,1737,1739,1741,1743,1745,1747,1749,1751],{"class":210,"line":579},[208,1727,331],{"class":251},[208,1729,334],{"class":258},[208,1731,337],{"class":214},[208,1733,1734],{"class":218}," \"count in scope = \"",[208,1736,741],{"class":214},[208,1738,1687],{"class":258},[208,1740,1690],{"class":251},[208,1742,424],{"class":258},[208,1744,337],{"class":214},[208,1746,748],{"class":218},[208,1748,349],{"class":348},[208,1750,352],{"class":218},[208,1752,355],{"class":258},[208,1754,1755,1758,1761],{"class":210,"line":589},[208,1756,1757],{"class":258},"        file2->",[208,1759,1760],{"class":251},"read",[208,1762,526],{"class":258},[208,1764,1765],{"class":210,"line":594},[208,1766,361],{"class":258},[208,1768,1769],{"class":210,"line":625},[208,1770,242],{"emptyLinePlaceholder":241},[208,1772,1773,1775,1777,1779,1782,1784,1786,1788,1790,1792,1794,1796,1798],{"class":210,"line":634},[208,1774,265],{"class":251},[208,1776,334],{"class":258},[208,1778,337],{"class":214},[208,1780,1781],{"class":218}," \"count after scope = \"",[208,1783,741],{"class":214},[208,1785,1687],{"class":258},[208,1787,1690],{"class":251},[208,1789,424],{"class":258},[208,1791,337],{"class":214},[208,1793,748],{"class":218},[208,1795,349],{"class":348},[208,1797,352],{"class":218},[208,1799,355],{"class":258},[208,1801,1802],{"class":210,"line":639},[208,1803,242],{"emptyLinePlaceholder":241},[208,1805,1806,1809,1811],{"class":210,"line":657},[208,1807,1808],{"class":258},"    file1.",[208,1810,1408],{"class":251},[208,1812,526],{"class":258},[208,1814,1815,1817,1819,1821,1824,1826,1829,1831,1833,1835,1837,1839,1841,1843,1845,1847,1849,1851],{"class":210,"line":669},[208,1816,265],{"class":251},[208,1818,334],{"class":258},[208,1820,337],{"class":214},[208,1822,1823],{"class":218}," \"file1 is empty? \"",[208,1825,741],{"class":214},[208,1827,1828],{"class":258}," (file1 ",[208,1830,1249],{"class":214},[208,1832,1252],{"class":348},[208,1834,1255],{"class":214},[208,1836,1258],{"class":218},[208,1838,1261],{"class":214},[208,1840,1264],{"class":218},[208,1842,1267],{"class":258},[208,1844,337],{"class":214},[208,1846,748],{"class":218},[208,1848,349],{"class":348},[208,1850,352],{"class":218},[208,1852,355],{"class":258},[208,1854,1855],{"class":210,"line":674},[208,1856,242],{"emptyLinePlaceholder":241},[208,1858,1859,1861,1863],{"class":210,"line":679},[208,1860,555],{"class":214},[208,1862,835],{"class":348},[208,1864,355],{"class":258},[208,1866,1867],{"class":210,"line":690},[208,1868,571],{"class":258},[14,1870,1871,849],{},[846,1872,848],{},[199,1874,1877],{"className":1875,"code":1876,"language":855,"meta":204},[853],"File log.txt opened\ncount after create = 1\ncount in scope = 2\nread from log.txt\ncount after scope = 1\nFile log.txt closed\nfile1 is empty? yes\n",[17,1878,1876],{"__ignoreMap":204},[14,1880,1881,1883,1884,137],{},[17,1882,92],{}," 很方便，但不是\"更安全的默认指针\"。它有引用计数开销，也会让所有权关系变复杂。默认优先考虑 ",[17,1885,155],{},[184,1887,1889],{"id":1888},"示例-4weak_ptr-打破-shared_ptr-循环引用","示例 4：weak_ptr 打破 shared_ptr 循环引用",[14,1891,1892,1893,1895,1896,1898,1899,137],{},"如果两个对象互相用 ",[17,1894,92],{}," 指向对方，它们的引用计数可能永远不会归零。常见做法是：主要方向用 ",[17,1897,92],{},"，反向观察关系用 ",[17,1900,175],{},[199,1902,1904],{"className":201,"code":1903,"language":203,"meta":204,"style":204},"#include \u003Ciostream>\n#include \u003Cmemory>\n#include \u003Cstring>\n\nclass Node\n{\npublic:\n    std::string name;\n    std::shared_ptr\u003CNode> next;\n    std::weak_ptr\u003CNode> prev;\n\n    explicit Node(const std::string& n) : name(n)\n    {\n        std::cout \u003C\u003C \"Node \" \u003C\u003C name \u003C\u003C \" created\\n\";\n    }\n\n    ~Node()\n    {\n        std::cout \u003C\u003C \"Node \" \u003C\u003C name \u003C\u003C \" destroyed\\n\";\n    }\n};\n\nint main()\n{\n    auto a = std::make_shared\u003CNode>(\"A\");\n    auto b = std::make_shared\u003CNode>(\"B\");\n\n    a->next = b; // A 拥有下一个节点\n    b->prev = a; // B 只观察前一个节点，不增加 A 的引用计数\n\n    std::cout \u003C\u003C \"a count = \" \u003C\u003C a.use_count() \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C \"b count = \" \u003C\u003C b.use_count() \u003C\u003C \"\\n\";\n\n    if (auto p = b->prev.lock())\n    {\n        std::cout \u003C\u003C \"B prev is \" \u003C\u003C p->name \u003C\u003C \"\\n\";\n    }\n\n    return 0;\n}\n",[17,1905,1906,1912,1918,1924,1928,1935,1939,1943,1950,1968,1984,1988,2017,2021,2047,2051,2055,2062,2066,2090,2094,2098,2102,2110,2114,2140,2166,2170,2183,2196,2200,2230,2260,2264,2288,2292,2318,2322,2326,2334],{"__ignoreMap":204},[208,1907,1908,1910],{"class":210,"line":211},[208,1909,215],{"class":214},[208,1911,219],{"class":218},[208,1913,1914,1916],{"class":210,"line":222},[208,1915,215],{"class":214},[208,1917,227],{"class":218},[208,1919,1920,1922],{"class":210,"line":230},[208,1921,215],{"class":214},[208,1923,235],{"class":218},[208,1925,1926],{"class":210,"line":238},[208,1927,242],{"emptyLinePlaceholder":241},[208,1929,1930,1932],{"class":210,"line":245},[208,1931,248],{"class":214},[208,1933,1934],{"class":251}," Node\n",[208,1936,1937],{"class":210,"line":255},[208,1938,259],{"class":258},[208,1940,1941],{"class":210,"line":262},[208,1942,279],{"class":214},[208,1944,1945,1947],{"class":210,"line":271},[208,1946,265],{"class":251},[208,1948,1949],{"class":258},"::string name;\n",[208,1951,1952,1954,1957,1959,1962,1965],{"class":210,"line":276},[208,1953,265],{"class":251},[208,1955,1956],{"class":258},"::shared_ptr",[208,1958,611],{"class":214},[208,1960,1961],{"class":258},"Node",[208,1963,1964],{"class":214},">",[208,1966,1967],{"class":258}," next;\n",[208,1969,1970,1972,1975,1977,1979,1981],{"class":210,"line":282},[208,1971,265],{"class":251},[208,1973,1974],{"class":258},"::weak_ptr",[208,1976,611],{"class":214},[208,1978,1961],{"class":258},[208,1980,1964],{"class":214},[208,1982,1983],{"class":258}," prev;\n",[208,1985,1986],{"class":210,"line":322},[208,1987,242],{"emptyLinePlaceholder":241},[208,1989,1990,1992,1995,1997,1999,2001,2003,2005,2007,2010,2012,2014],{"class":210,"line":328},[208,1991,285],{"class":214},[208,1993,1994],{"class":251}," Node",[208,1996,291],{"class":258},[208,1998,294],{"class":214},[208,2000,297],{"class":251},[208,2002,300],{"class":258},[208,2004,303],{"class":251},[208,2006,306],{"class":214},[208,2008,2009],{"class":309}," n",[208,2011,313],{"class":258},[208,2013,1144],{"class":251},[208,2015,2016],{"class":258},"(n)\n",[208,2018,2019],{"class":210,"line":358},[208,2020,325],{"class":258},[208,2022,2023,2025,2027,2029,2032,2034,2037,2039,2041,2043,2045],{"class":210,"line":364},[208,2024,331],{"class":251},[208,2026,334],{"class":258},[208,2028,337],{"class":214},[208,2030,2031],{"class":218}," \"Node \"",[208,2033,741],{"class":214},[208,2035,2036],{"class":258}," name ",[208,2038,337],{"class":214},[208,2040,345],{"class":218},[208,2042,349],{"class":348},[208,2044,352],{"class":218},[208,2046,355],{"class":258},[208,2048,2049],{"class":210,"line":369},[208,2050,361],{"class":258},[208,2052,2053],{"class":210,"line":378},[208,2054,242],{"emptyLinePlaceholder":241},[208,2056,2057,2060],{"class":210,"line":383},[208,2058,2059],{"class":251},"    ~Node",[208,2061,375],{"class":258},[208,2063,2064],{"class":210,"line":405},[208,2065,325],{"class":258},[208,2067,2068,2070,2072,2074,2076,2078,2080,2082,2084,2086,2088],{"class":210,"line":410},[208,2069,331],{"class":251},[208,2071,334],{"class":258},[208,2073,337],{"class":214},[208,2075,2031],{"class":218},[208,2077,741],{"class":214},[208,2079,2036],{"class":258},[208,2081,337],{"class":214},[208,2083,396],{"class":218},[208,2085,349],{"class":348},[208,2087,352],{"class":218},[208,2089,355],{"class":258},[208,2091,2092],{"class":210,"line":415},[208,2093,361],{"class":258},[208,2095,2096],{"class":210,"line":430},[208,2097,465],{"class":258},[208,2099,2100],{"class":210,"line":435},[208,2101,242],{"emptyLinePlaceholder":241},[208,2103,2104,2106,2108],{"class":210,"line":457},[208,2105,682],{"class":214},[208,2107,685],{"class":251},[208,2109,375],{"class":258},[208,2111,2112],{"class":210,"line":462},[208,2113,259],{"class":258},[208,2115,2116,2118,2121,2123,2125,2127,2129,2131,2133,2135,2138],{"class":210,"line":468},[208,2117,597],{"class":214},[208,2119,2120],{"class":258}," a ",[208,2122,501],{"class":214},[208,2124,297],{"class":251},[208,2126,300],{"class":258},[208,2128,1659],{"class":251},[208,2130,611],{"class":258},[208,2132,1961],{"class":251},[208,2134,617],{"class":258},[208,2136,2137],{"class":218},"\"A\"",[208,2139,514],{"class":258},[208,2141,2142,2144,2147,2149,2151,2153,2155,2157,2159,2161,2164],{"class":210,"line":473},[208,2143,597],{"class":214},[208,2145,2146],{"class":258}," b ",[208,2148,501],{"class":214},[208,2150,297],{"class":251},[208,2152,300],{"class":258},[208,2154,1659],{"class":251},[208,2156,611],{"class":258},[208,2158,1961],{"class":251},[208,2160,617],{"class":258},[208,2162,2163],{"class":218},"\"B\"",[208,2165,514],{"class":258},[208,2167,2168],{"class":210,"line":484},[208,2169,242],{"emptyLinePlaceholder":241},[208,2171,2172,2175,2177,2180],{"class":210,"line":489},[208,2173,2174],{"class":258},"    a->next ",[208,2176,501],{"class":214},[208,2178,2179],{"class":258}," b;",[208,2181,2182],{"class":564}," // A 拥有下一个节点\n",[208,2184,2185,2188,2190,2193],{"class":210,"line":517},[208,2186,2187],{"class":258},"    b->prev ",[208,2189,501],{"class":214},[208,2191,2192],{"class":258}," a;",[208,2194,2195],{"class":564}," // B 只观察前一个节点，不增加 A 的引用计数\n",[208,2197,2198],{"class":210,"line":529},[208,2199,242],{"emptyLinePlaceholder":241},[208,2201,2202,2204,2206,2208,2211,2213,2216,2218,2220,2222,2224,2226,2228],{"class":210,"line":534},[208,2203,265],{"class":251},[208,2205,334],{"class":258},[208,2207,337],{"class":214},[208,2209,2210],{"class":218}," \"a count = \"",[208,2212,741],{"class":214},[208,2214,2215],{"class":258}," a.",[208,2217,1690],{"class":251},[208,2219,424],{"class":258},[208,2221,337],{"class":214},[208,2223,748],{"class":218},[208,2225,349],{"class":348},[208,2227,352],{"class":218},[208,2229,355],{"class":258},[208,2231,2232,2234,2236,2238,2241,2243,2246,2248,2250,2252,2254,2256,2258],{"class":210,"line":552},[208,2233,265],{"class":251},[208,2235,334],{"class":258},[208,2237,337],{"class":214},[208,2239,2240],{"class":218}," \"b count = \"",[208,2242,741],{"class":214},[208,2244,2245],{"class":258}," b.",[208,2247,1690],{"class":251},[208,2249,424],{"class":258},[208,2251,337],{"class":214},[208,2253,748],{"class":218},[208,2255,349],{"class":348},[208,2257,352],{"class":218},[208,2259,355],{"class":258},[208,2261,2262],{"class":210,"line":568},[208,2263,242],{"emptyLinePlaceholder":241},[208,2265,2266,2269,2272,2275,2277,2279,2282,2285],{"class":210,"line":574},[208,2267,2268],{"class":214},"    if",[208,2270,2271],{"class":258}," (",[208,2273,2274],{"class":214},"auto",[208,2276,1188],{"class":258},[208,2278,501],{"class":214},[208,2280,2281],{"class":258}," b->prev.",[208,2283,2284],{"class":251},"lock",[208,2286,2287],{"class":258},"())\n",[208,2289,2290],{"class":210,"line":579},[208,2291,325],{"class":258},[208,2293,2294,2296,2298,2300,2303,2305,2308,2310,2312,2314,2316],{"class":210,"line":589},[208,2295,331],{"class":251},[208,2297,334],{"class":258},[208,2299,337],{"class":214},[208,2301,2302],{"class":218}," \"B prev is \"",[208,2304,741],{"class":214},[208,2306,2307],{"class":258}," p->name ",[208,2309,337],{"class":214},[208,2311,748],{"class":218},[208,2313,349],{"class":348},[208,2315,352],{"class":218},[208,2317,355],{"class":258},[208,2319,2320],{"class":210,"line":594},[208,2321,361],{"class":258},[208,2323,2324],{"class":210,"line":625},[208,2325,242],{"emptyLinePlaceholder":241},[208,2327,2328,2330,2332],{"class":210,"line":634},[208,2329,555],{"class":214},[208,2331,835],{"class":348},[208,2333,355],{"class":258},[208,2335,2336],{"class":210,"line":639},[208,2337,571],{"class":258},[14,2339,2340,849],{},[846,2341,848],{},[199,2343,2346],{"className":2344,"code":2345,"language":855,"meta":204},[853],"Node A created\nNode B created\na count = 1\nb count = 2\nB prev is A\nNode A destroyed\nNode B destroyed\n",[17,2347,2345],{"__ignoreMap":204},[14,2349,2350,2352,2353,2356,2357,2359,2360,2362],{},[17,2351,175],{}," 不能直接访问对象，需要先调用 ",[17,2354,2355],{},"lock()","。如果对象还活着，",[17,2358,2355],{}," 返回一个临时 ",[17,2361,92],{},"；如果对象已经释放，返回空指针。",[184,2364,2366],{"id":2365},"示例-5函数参数不要滥用-shared_ptr","示例 5：函数参数不要滥用 shared_ptr",[14,2368,2369],{},"函数参数应该表达真实语义：",[102,2371,2372,2382,2391,2396],{},[105,2373,2374,2375,2378,2379,137],{},"只是临时使用对象：用 ",[17,2376,2377],{},"T&"," 或 ",[17,2380,2381],{},"const T&",[105,2383,2384,2385,2378,2388,137],{},"函数可能没有对象：用 ",[17,2386,2387],{},"T*",[17,2389,2390],{},"const T*",[105,2392,2393,2394,137],{},"函数要接管对象：用 ",[17,2395,57],{},[105,2397,2398,2399,137],{},"函数要共同拥有对象：用 ",[17,2400,70],{},[199,2402,2404],{"className":201,"code":2403,"language":203,"meta":204,"style":204},"#include \u003Ciostream>\n#include \u003Cmemory>\n#include \u003Cstring>\n#include \u003Cutility>\n\nclass Robot\n{\n    std::string name_;\n\npublic:\n    explicit Robot(std::string name) : name_(std::move(name)) {}\n\n    const std::string& name() const\n    {\n        return name_;\n    }\n};\n\nvoid print_robot(const Robot& robot)\n{\n    std::cout \u003C\u003C \"borrow: \" \u003C\u003C robot.name() \u003C\u003C \"\\n\";\n}\n\n// 智能指针负责管理对象生命周期，减少手动释放资源的风险。\nvoid take_robot(std::unique_ptr\u003CRobot> robot)\n{\n    std::cout \u003C\u003C \"take: \" \u003C\u003C robot->name() \u003C\u003C \"\\n\";\n}\n\nvoid share_robot(std::shared_ptr\u003CRobot> robot)\n{\n    std::cout \u003C\u003C \"share count inside = \" \u003C\u003C robot.use_count() \u003C\u003C \"\\n\";\n}\n\nint main()\n{\n    // 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    auto robot = std::make_unique\u003CRobot>(\"R1\");\n    print_robot(*robot);\n    take_robot(std::move(robot));\n    std::cout \u003C\u003C \"robot is null? \" \u003C\u003C (robot == nullptr ? \"yes\" : \"no\") \u003C\u003C \"\\n\";\n\n    auto shared_robot = std::make_shared\u003CRobot>(\"R2\");\n    std::cout \u003C\u003C \"share count before = \" \u003C\u003C shared_robot.use_count() \u003C\u003C \"\\n\";\n    share_robot(shared_robot);\n    std::cout \u003C\u003C \"share count after = \" \u003C\u003C shared_robot.use_count() \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[17,2405,2406,2412,2418,2424,2430,2434,2441,2445,2451,2455,2459,2491,2495,2513,2517,2523,2527,2531,2535,2555,2559,2589,2593,2597,2601,2628,2632,2662,2666,2670,2695,2699,2728,2732,2736,2744,2748,2752,2778,2790,2806,2846,2850,2876,2906,2914,2943,2947,2955],{"__ignoreMap":204},[208,2407,2408,2410],{"class":210,"line":211},[208,2409,215],{"class":214},[208,2411,219],{"class":218},[208,2413,2414,2416],{"class":210,"line":222},[208,2415,215],{"class":214},[208,2417,227],{"class":218},[208,2419,2420,2422],{"class":210,"line":230},[208,2421,215],{"class":214},[208,2423,235],{"class":218},[208,2425,2426,2428],{"class":210,"line":238},[208,2427,215],{"class":214},[208,2429,906],{"class":218},[208,2431,2432],{"class":210,"line":245},[208,2433,242],{"emptyLinePlaceholder":241},[208,2435,2436,2438],{"class":210,"line":255},[208,2437,248],{"class":214},[208,2439,2440],{"class":251}," Robot\n",[208,2442,2443],{"class":210,"line":262},[208,2444,259],{"class":258},[208,2446,2447,2449],{"class":210,"line":271},[208,2448,265],{"class":251},[208,2450,268],{"class":258},[208,2452,2453],{"class":210,"line":276},[208,2454,242],{"emptyLinePlaceholder":241},[208,2456,2457],{"class":210,"line":282},[208,2458,279],{"class":214},[208,2460,2461,2463,2466,2468,2470,2472,2474,2476,2478,2480,2482,2484,2486,2488],{"class":210,"line":322},[208,2462,285],{"class":214},[208,2464,2465],{"class":251}," Robot",[208,2467,291],{"class":258},[208,2469,1103],{"class":251},[208,2471,300],{"class":258},[208,2473,303],{"class":251},[208,2475,310],{"class":309},[208,2477,313],{"class":258},[208,2479,316],{"class":251},[208,2481,291],{"class":258},[208,2483,1103],{"class":251},[208,2485,300],{"class":258},[208,2487,1227],{"class":251},[208,2489,2490],{"class":258},"(name)) {}\n",[208,2492,2493],{"class":210,"line":328},[208,2494,242],{"emptyLinePlaceholder":241},[208,2496,2497,2499,2501,2503,2505,2507,2509,2511],{"class":210,"line":358},[208,2498,1047],{"class":214},[208,2500,297],{"class":251},[208,2502,300],{"class":258},[208,2504,303],{"class":251},[208,2506,306],{"class":214},[208,2508,310],{"class":251},[208,2510,424],{"class":258},[208,2512,427],{"class":214},[208,2514,2515],{"class":210,"line":364},[208,2516,325],{"class":258},[208,2518,2519,2521],{"class":210,"line":369},[208,2520,1070],{"class":214},[208,2522,1073],{"class":258},[208,2524,2525],{"class":210,"line":378},[208,2526,361],{"class":258},[208,2528,2529],{"class":210,"line":383},[208,2530,465],{"class":258},[208,2532,2533],{"class":210,"line":405},[208,2534,242],{"emptyLinePlaceholder":241},[208,2536,2537,2539,2542,2544,2546,2548,2550,2553],{"class":210,"line":410},[208,2538,1095],{"class":214},[208,2540,2541],{"class":251}," print_robot",[208,2543,291],{"class":258},[208,2545,294],{"class":214},[208,2547,2465],{"class":251},[208,2549,306],{"class":214},[208,2551,2552],{"class":309}," robot",[208,2554,1121],{"class":258},[208,2556,2557],{"class":210,"line":415},[208,2558,259],{"class":258},[208,2560,2561,2563,2565,2567,2570,2572,2575,2577,2579,2581,2583,2585,2587],{"class":210,"line":430},[208,2562,265],{"class":251},[208,2564,334],{"class":258},[208,2566,337],{"class":214},[208,2568,2569],{"class":218}," \"borrow: \"",[208,2571,741],{"class":214},[208,2573,2574],{"class":258}," robot.",[208,2576,1144],{"class":251},[208,2578,424],{"class":258},[208,2580,337],{"class":214},[208,2582,748],{"class":218},[208,2584,349],{"class":348},[208,2586,352],{"class":218},[208,2588,355],{"class":258},[208,2590,2591],{"class":210,"line":435},[208,2592,571],{"class":258},[208,2594,2595],{"class":210,"line":457},[208,2596,242],{"emptyLinePlaceholder":241},[208,2598,2599],{"class":210,"line":462},[208,2600,1090],{"class":564},[208,2602,2603,2605,2608,2610,2612,2614,2616,2618,2621,2623,2626],{"class":210,"line":468},[208,2604,1095],{"class":214},[208,2606,2607],{"class":251}," take_robot",[208,2609,291],{"class":258},[208,2611,1103],{"class":251},[208,2613,300],{"class":258},[208,2615,155],{"class":251},[208,2617,611],{"class":258},[208,2619,2620],{"class":251},"Robot",[208,2622,1115],{"class":258},[208,2624,2625],{"class":309},"robot",[208,2627,1121],{"class":258},[208,2629,2630],{"class":210,"line":473},[208,2631,259],{"class":258},[208,2633,2634,2636,2638,2640,2643,2645,2648,2650,2652,2654,2656,2658,2660],{"class":210,"line":484},[208,2635,265],{"class":251},[208,2637,334],{"class":258},[208,2639,337],{"class":214},[208,2641,2642],{"class":218}," \"take: \"",[208,2644,741],{"class":214},[208,2646,2647],{"class":258}," robot->",[208,2649,1144],{"class":251},[208,2651,424],{"class":258},[208,2653,337],{"class":214},[208,2655,748],{"class":218},[208,2657,349],{"class":348},[208,2659,352],{"class":218},[208,2661,355],{"class":258},[208,2663,2664],{"class":210,"line":489},[208,2665,571],{"class":258},[208,2667,2668],{"class":210,"line":517},[208,2669,242],{"emptyLinePlaceholder":241},[208,2671,2672,2674,2677,2679,2681,2683,2685,2687,2689,2691,2693],{"class":210,"line":529},[208,2673,1095],{"class":214},[208,2675,2676],{"class":251}," share_robot",[208,2678,291],{"class":258},[208,2680,1103],{"class":251},[208,2682,300],{"class":258},[208,2684,92],{"class":251},[208,2686,611],{"class":258},[208,2688,2620],{"class":251},[208,2690,1115],{"class":258},[208,2692,2625],{"class":309},[208,2694,1121],{"class":258},[208,2696,2697],{"class":210,"line":534},[208,2698,259],{"class":258},[208,2700,2701,2703,2705,2707,2710,2712,2714,2716,2718,2720,2722,2724,2726],{"class":210,"line":552},[208,2702,265],{"class":251},[208,2704,334],{"class":258},[208,2706,337],{"class":214},[208,2708,2709],{"class":218}," \"share count inside = \"",[208,2711,741],{"class":214},[208,2713,2574],{"class":258},[208,2715,1690],{"class":251},[208,2717,424],{"class":258},[208,2719,337],{"class":214},[208,2721,748],{"class":218},[208,2723,349],{"class":348},[208,2725,352],{"class":218},[208,2727,355],{"class":258},[208,2729,2730],{"class":210,"line":568},[208,2731,571],{"class":258},[208,2733,2734],{"class":210,"line":574},[208,2735,242],{"emptyLinePlaceholder":241},[208,2737,2738,2740,2742],{"class":210,"line":579},[208,2739,682],{"class":214},[208,2741,685],{"class":251},[208,2743,375],{"class":258},[208,2745,2746],{"class":210,"line":589},[208,2747,259],{"class":258},[208,2749,2750],{"class":210,"line":594},[208,2751,1181],{"class":564},[208,2753,2754,2756,2759,2761,2763,2765,2767,2769,2771,2773,2776],{"class":210,"line":625},[208,2755,597],{"class":214},[208,2757,2758],{"class":258}," robot ",[208,2760,501],{"class":214},[208,2762,297],{"class":251},[208,2764,300],{"class":258},[208,2766,608],{"class":251},[208,2768,611],{"class":258},[208,2770,2620],{"class":251},[208,2772,617],{"class":258},[208,2774,2775],{"class":218},"\"R1\"",[208,2777,514],{"class":258},[208,2779,2780,2783,2785,2787],{"class":210,"line":634},[208,2781,2782],{"class":251},"    print_robot",[208,2784,291],{"class":258},[208,2786,495],{"class":214},[208,2788,2789],{"class":258},"robot);\n",[208,2791,2792,2795,2797,2799,2801,2803],{"class":210,"line":639},[208,2793,2794],{"class":251},"    take_robot",[208,2796,291],{"class":258},[208,2798,1103],{"class":251},[208,2800,300],{"class":258},[208,2802,1227],{"class":251},[208,2804,2805],{"class":258},"(robot));\n",[208,2807,2808,2810,2812,2814,2817,2819,2822,2824,2826,2828,2830,2832,2834,2836,2838,2840,2842,2844],{"class":210,"line":657},[208,2809,265],{"class":251},[208,2811,334],{"class":258},[208,2813,337],{"class":214},[208,2815,2816],{"class":218}," \"robot is null? \"",[208,2818,741],{"class":214},[208,2820,2821],{"class":258}," (robot ",[208,2823,1249],{"class":214},[208,2825,1252],{"class":348},[208,2827,1255],{"class":214},[208,2829,1258],{"class":218},[208,2831,1261],{"class":214},[208,2833,1264],{"class":218},[208,2835,1267],{"class":258},[208,2837,337],{"class":214},[208,2839,748],{"class":218},[208,2841,349],{"class":348},[208,2843,352],{"class":218},[208,2845,355],{"class":258},[208,2847,2848],{"class":210,"line":669},[208,2849,242],{"emptyLinePlaceholder":241},[208,2851,2852,2854,2857,2859,2861,2863,2865,2867,2869,2871,2874],{"class":210,"line":674},[208,2853,597],{"class":214},[208,2855,2856],{"class":258}," shared_robot ",[208,2858,501],{"class":214},[208,2860,297],{"class":251},[208,2862,300],{"class":258},[208,2864,1659],{"class":251},[208,2866,611],{"class":258},[208,2868,2620],{"class":251},[208,2870,617],{"class":258},[208,2872,2873],{"class":218},"\"R2\"",[208,2875,514],{"class":258},[208,2877,2878,2880,2882,2884,2887,2889,2892,2894,2896,2898,2900,2902,2904],{"class":210,"line":679},[208,2879,265],{"class":251},[208,2881,334],{"class":258},[208,2883,337],{"class":214},[208,2885,2886],{"class":218}," \"share count before = \"",[208,2888,741],{"class":214},[208,2890,2891],{"class":258}," shared_robot.",[208,2893,1690],{"class":251},[208,2895,424],{"class":258},[208,2897,337],{"class":214},[208,2899,748],{"class":218},[208,2901,349],{"class":348},[208,2903,352],{"class":218},[208,2905,355],{"class":258},[208,2907,2908,2911],{"class":210,"line":690},[208,2909,2910],{"class":251},"    share_robot",[208,2912,2913],{"class":258},"(shared_robot);\n",[208,2915,2916,2918,2920,2922,2925,2927,2929,2931,2933,2935,2937,2939,2941],{"class":210,"line":695},[208,2917,265],{"class":251},[208,2919,334],{"class":258},[208,2921,337],{"class":214},[208,2923,2924],{"class":218}," \"share count after = \"",[208,2926,741],{"class":214},[208,2928,2891],{"class":258},[208,2930,1690],{"class":251},[208,2932,424],{"class":258},[208,2934,337],{"class":214},[208,2936,748],{"class":218},[208,2938,349],{"class":348},[208,2940,352],{"class":218},[208,2942,355],{"class":258},[208,2944,2945],{"class":210,"line":709},[208,2946,242],{"emptyLinePlaceholder":241},[208,2948,2949,2951,2953],{"class":210,"line":714},[208,2950,555],{"class":214},[208,2952,835],{"class":348},[208,2954,355],{"class":258},[208,2956,2957],{"class":210,"line":729},[208,2958,571],{"class":258},[14,2960,2961,849],{},[846,2962,848],{},[199,2964,2967],{"className":2965,"code":2966,"language":855,"meta":204},[853],"borrow: R1\ntake: R1\nrobot is null? yes\nshare count before = 1\nshare count inside = 2\nshare count after = 1\n",[17,2968,2966],{"__ignoreMap":204},[10,2970,2971],{"id":2971},"关键语法解释",[29,2973,2974,2987],{},[32,2975,2976],{},[35,2977,2978,2981,2984],{},[38,2979,2980],{"align":40},"写法",[38,2982,2983],{"align":40},"含义",[38,2985,2986],{"align":40},"注意事项",[48,2988,2989,3002,3018,3031,3044,3058],{},[35,2990,2991,2996,2999],{},[53,2992,2993],{"align":40},[17,2994,2995],{},"std::make_unique\u003CT>(...)",[53,2997,2998],{"align":40},"创建独占所有权对象",[53,3000,3001],{"align":40},"C++14 起可用",[35,3003,3004,3009,3015],{},[53,3005,3006],{"align":40},[17,3007,3008],{},"std::move(p)",[53,3010,3011,3012,3014],{"align":40},"把 ",[17,3013,155],{}," 所有权转出去",[53,3016,3017],{"align":40},"移动后原指针通常为空",[35,3019,3020,3025,3028],{},[53,3021,3022],{"align":40},[17,3023,3024],{},"std::make_shared\u003CT>(...)",[53,3026,3027],{"align":40},"创建共享所有权对象",[53,3029,3030],{"align":40},"引用计数有开销",[35,3032,3033,3038,3041],{},[53,3034,3035],{"align":40},[17,3036,3037],{},"sp.use_count()",[53,3039,3040],{"align":40},"查看共享引用计数",[53,3042,3043],{"align":40},"教学调试可用，业务逻辑不要依赖它",[35,3045,3046,3050,3053],{},[53,3047,3048],{"align":40},[17,3049,83],{},[53,3051,3052],{"align":40},"弱引用，不增加引用计数",[53,3054,3055,3056],{"align":40},"访问前必须 ",[17,3057,2355],{},[35,3059,3060,3065,3068],{},[53,3061,3062],{"align":40},[17,3063,3064],{},"p.reset()",[53,3066,3067],{"align":40},"释放当前管理的对象",[53,3069,3070,3071,3073],{"align":40},"对 ",[17,3072,92],{}," 是减少一次引用计数",[10,3075,3076],{"id":3076},"常见错误",[142,3078,3079,3087,3093,3102,3108],{},[105,3080,3011,3081,3083,3084,3086],{},[17,3082,155],{}," 当普通指针复制。",[17,3085,155],{}," 只能移动，不能复制。",[105,3088,3089,3090,3092],{},"明明只是借用对象，却把参数写成 ",[17,3091,92],{},"。这会暗示函数也参与共享所有权。",[105,3094,3095,3096,3098,3099,3101],{},"用一个 ",[17,3097,92],{}," 的原始指针创建另一个 ",[17,3100,92],{},"。这样会产生两个控制块，最终可能重复释放。",[105,3103,3104,3105,3107],{},"两个对象互相用 ",[17,3106,92],{}," 持有对方，导致循环引用。",[105,3109,3110,3111,3113],{},"用智能指针管理栈对象。例如把局部变量地址交给 ",[17,3112,155],{},"，离开作用域时会错误释放栈内存。",[10,3115,3116],{"id":3116},"使用建议",[142,3118,3119,3122,3127,3132,3140,3148],{},[105,3120,3121],{},"能不用指针就不用指针，普通对象和引用优先。",[105,3123,3124,3125,137],{},"需要动态所有权时，优先用 ",[17,3126,155],{},[105,3128,3129,3130,137],{},"只有确实有多个所有者时，才用 ",[17,3131,92],{},[105,3133,3134,3135,3137,3138,137],{},"只观察 ",[17,3136,92],{}," 管理的对象时，用 ",[17,3139,175],{},[105,3141,3142,3143,3145,3146,137],{},"创建智能指针优先使用 ",[17,3144,608],{}," 和 ",[17,3147,1659],{},[105,3149,3150],{},"函数参数要表达语义：借用、转移、共享不要混用。",[10,3152,3153],{"id":3153},"小结",[102,3155,3156,3159,3164,3169,3174],{},[105,3157,3158],{},"智能指针是 RAII 的典型应用。",[105,3160,3161,3163],{},[17,3162,155],{}," 表达独占所有权，是默认首选。",[105,3165,3166,3168],{},[17,3167,92],{}," 表达共享所有权，不要因为方便就滥用。",[105,3170,3171,3173],{},[17,3172,175],{}," 不拥有对象，常用于解决循环引用。",[105,3175,3176],{},"智能指针最重要的不是\"自动 delete\"，而是把所有权关系写清楚。",[3178,3179,3180],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":204,"searchDepth":222,"depth":222,"links":3182},[3183,3184,3185,3186,3193,3194,3195,3196],{"id":12,"depth":222,"text":12},{"id":99,"depth":222,"text":100},{"id":140,"depth":222,"text":140},{"id":182,"depth":222,"text":182,"children":3187},[3188,3189,3190,3191,3192],{"id":186,"depth":230,"text":187},{"id":870,"depth":230,"text":871},{"id":1396,"depth":230,"text":1397},{"id":1888,"depth":230,"text":1889},{"id":2365,"depth":230,"text":2366},{"id":2971,"depth":222,"text":2971},{"id":3076,"depth":222,"text":3076},{"id":3116,"depth":222,"text":3116},{"id":3153,"depth":222,"text":3153},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-9-zhi-neng-zhi-zhen","18.9",18090000,"2023-10-05","wiki/2023-10-05-cplusplus-jiao-xue","zh-cn:2023-10-05-cplusplus-jiao-xue","/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki/2023-10-05-Cplusplus教学/ch18-9-智能指针",false,null,"/wiki/2023-10-05-cplusplus-jiao-xue/ch18-9-zhi-neng-zhi-zhen","zh-CN","zh-cn",{},{"title":5,"description":204},"5m9ctZuLnuQglNIh_np-B7WszoY53BGwlkz0VQrBX1Y",[3216,3222,3228,3234,3240,3246,3252,3258,3264,3270,3276,3282,3288,3294,3300,3306,3312,3318,3324,3330,3336,3342,3348,3354,3359,3365,3371,3377,3383,3389,3395,3401,3407,3413,3419,3425,3431,3437,3443,3449,3455,3461,3467,3473,3479,3485,3491,3497,3498,3504,3510,3516,3522,3528,3534,3540,3546,3552,3558,3564,3570,3576,3582,3588,3594,3600,3606,3612,3618,3624],{"path":3217,"stem":3218,"title":3219,"date":3200,"chapter":3220,"chapterSort":3221,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch1-c-ji-chu-chu-shi","wiki/2023-10-05-Cplusplus教学/ch1-C++基础初识","C++基础初识","1",1000000,{"path":3223,"stem":3224,"title":3225,"date":3200,"chapter":3226,"chapterSort":3227,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch10-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","wiki/2023-10-05-Cplusplus教学/ch10-内存分区与生命周期","内存分区与生命周期","10",10000000,{"path":3229,"stem":3230,"title":3231,"date":3200,"chapter":3232,"chapterSort":3233,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch11-yin-yong","wiki/2023-10-05-Cplusplus教学/ch11-引用","引用","11",11000000,{"path":3235,"stem":3236,"title":3237,"date":3200,"chapter":3238,"chapterSort":3239,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch12-han-shu-ti-gao-yu-ming-ming-kong-jian","wiki/2023-10-05-Cplusplus教学/ch12-函数提高与命名空间","函数提高与命名空间","12",12000000,{"path":3241,"stem":3242,"title":3243,"date":3200,"chapter":3244,"chapterSort":3245,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-1-feng-zhuang","wiki/2023-10-05-Cplusplus教学/ch13-1-封装","封装","13.1",13010000,{"path":3247,"stem":3248,"title":3249,"date":3200,"chapter":3250,"chapterSort":3251,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-2-dui-xiang-chu-shi-hua-he-qing-li","wiki/2023-10-05-Cplusplus教学/ch13-2-对象初始化和清理","对象初始化和清理","13.2",13020000,{"path":3253,"stem":3254,"title":3255,"date":3200,"chapter":3256,"chapterSort":3257,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-3-dui-xiang-mo-xing-yu-this-zhi-zhen","wiki/2023-10-05-Cplusplus教学/ch13-3-对象模型与this指针","对象模型与this指针","13.3",13030000,{"path":3259,"stem":3260,"title":3261,"date":3200,"chapter":3262,"chapterSort":3263,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-4-you-yuan-yu-yun-suan-fu-zhong-zai","wiki/2023-10-05-Cplusplus教学/ch13-4-友元与运算符重载","友元与运算符重载","13.4",13040000,{"path":3265,"stem":3266,"title":3267,"date":3200,"chapter":3268,"chapterSort":3269,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-5-ji-cheng","wiki/2023-10-05-Cplusplus教学/ch13-5-继承","继承","13.5",13050000,{"path":3271,"stem":3272,"title":3273,"date":3200,"chapter":3274,"chapterSort":3275,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-6-duo-tai","wiki/2023-10-05-Cplusplus教学/ch13-6-多态","多态","13.6",13060000,{"path":3277,"stem":3278,"title":3279,"date":3200,"chapter":3280,"chapterSort":3281,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-lei-he-dui-xiang","wiki/2023-10-05-Cplusplus教学/ch13-类和对象","类和对象","13",13000000,{"path":3283,"stem":3284,"title":3285,"date":3200,"chapter":3286,"chapterSort":3287,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch14-wen-jian-cao-zuo","wiki/2023-10-05-Cplusplus教学/ch14-文件操作","文件操作","14",14000000,{"path":3289,"stem":3290,"title":3291,"date":3200,"chapter":3292,"chapterSort":3293,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch15-mu-ban","wiki/2023-10-05-Cplusplus教学/ch15-模板","模板","15",15000000,{"path":3295,"stem":3296,"title":3297,"date":3200,"chapter":3298,"chapterSort":3299,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-1-stl-chu-shi","wiki/2023-10-05-Cplusplus教学/ch16-1-STL初识","STL初识","16.1",16010000,{"path":3301,"stem":3302,"title":3303,"date":3200,"chapter":3304,"chapterSort":3305,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-2-std-array","wiki/2023-10-05-Cplusplus教学/ch16-2-std-array","std::array","16.2",16020000,{"path":3307,"stem":3308,"title":3309,"date":3200,"chapter":3310,"chapterSort":3311,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-3-string-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-3-string容器","string容器","16.3",16030000,{"path":3313,"stem":3314,"title":3315,"date":3200,"chapter":3316,"chapterSort":3317,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-4-vector-yu-deque-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-4-vector与deque容器","vector与deque容器","16.4",16040000,{"path":3319,"stem":3320,"title":3321,"date":3200,"chapter":3322,"chapterSort":3323,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-5-stack-queue-list-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-5-stack-queue-list容器","stack / queue / list 容器","16.5",16050000,{"path":3325,"stem":3326,"title":3327,"date":3200,"chapter":3328,"chapterSort":3329,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-6-set-map-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-6-set-map容器","set / map 容器","16.6",16060000,{"path":3331,"stem":3332,"title":3333,"date":3200,"chapter":3334,"chapterSort":3335,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-7-han-shu-dui-xiang-yu-wei-ci","wiki/2023-10-05-Cplusplus教学/ch16-7-函数对象与谓词","函数对象与谓词","16.7",16070000,{"path":3337,"stem":3338,"title":3339,"date":3200,"chapter":3340,"chapterSort":3341,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-8-chang-yong-suan-fa","wiki/2023-10-05-Cplusplus教学/ch16-8-常用算法","常用算法","16.8",16080000,{"path":3343,"stem":3344,"title":3345,"date":3200,"chapter":3346,"chapterSort":3347,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-stl-ti-gao-bian-cheng","wiki/2023-10-05-Cplusplus教学/ch16-STL提高编程","STL提高编程","16",16000000,{"path":3349,"stem":3350,"title":3351,"date":3200,"chapter":3352,"chapterSort":3353,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch17-c-lei-xing-zhuan-huan","wiki/2023-10-05-Cplusplus教学/ch17-C++类型转换","C++类型转换","17",17000000,{"path":3355,"stem":3356,"title":2274,"date":3200,"chapter":3357,"chapterSort":3358,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-1-auto","wiki/2023-10-05-Cplusplus教学/ch18-1-auto","18.1",18010000,{"path":3360,"stem":3361,"title":3362,"date":3200,"chapter":3363,"chapterSort":3364,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-10-you-zhi-yin-yong-he-yi-dong-yu-yi","wiki/2023-10-05-Cplusplus教学/ch18-10-右值引用和移动语义","右值引用和移动语义","18.10",18100000,{"path":3366,"stem":3367,"title":3368,"date":3200,"chapter":3369,"chapterSort":3370,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-11-lambda-biao-da-shi","wiki/2023-10-05-Cplusplus教学/ch18-11-Lambda表达式","Lambda 表达式","18.11",18110000,{"path":3372,"stem":3373,"title":3374,"date":3200,"chapter":3375,"chapterSort":3376,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-12-std-function","wiki/2023-10-05-Cplusplus教学/ch18-12-std-function","std::function","18.12",18120000,{"path":3378,"stem":3379,"title":3380,"date":3200,"chapter":3381,"chapterSort":3382,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-13-std-bind","wiki/2023-10-05-Cplusplus教学/ch18-13-std-bind","std::bind","18.13",18130000,{"path":3384,"stem":3385,"title":3386,"date":3200,"chapter":3387,"chapterSort":3388,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-14-std-optional","wiki/2023-10-05-Cplusplus教学/ch18-14-std-optional","std::optional","18.14",18140000,{"path":3390,"stem":3391,"title":3392,"date":3200,"chapter":3393,"chapterSort":3394,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-15-std-variant","wiki/2023-10-05-Cplusplus教学/ch18-15-std-variant","std::variant","18.15",18150000,{"path":3396,"stem":3397,"title":3398,"date":3200,"chapter":3399,"chapterSort":3400,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-16-std-span","wiki/2023-10-05-Cplusplus教学/ch18-16-std-span","std::span","18.16",18160000,{"path":3402,"stem":3403,"title":3404,"date":3200,"chapter":3405,"chapterSort":3406,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-17-std-format-print","wiki/2023-10-05-Cplusplus教学/ch18-17-std-format-print","std::format / std::print","18.17",18170000,{"path":3408,"stem":3409,"title":3410,"date":3200,"chapter":3411,"chapterSort":3412,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-18-std-chrono","wiki/2023-10-05-Cplusplus教学/ch18-18-std-chrono","std::chrono","18.18",18180000,{"path":3414,"stem":3415,"title":3416,"date":3200,"chapter":3417,"chapterSort":3418,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-1-std-thread","wiki/2023-10-05-Cplusplus教学/ch18-19-1-std-thread","std::thread 与 join","18.19.1",18190100,{"path":3420,"stem":3421,"title":3422,"date":3200,"chapter":3423,"chapterSort":3424,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-2-mutex-lock-guard","wiki/2023-10-05-Cplusplus教学/ch18-19-2-mutex-lock-guard","mutex 与 lock_guard","18.19.2",18190200,{"path":3426,"stem":3427,"title":3428,"date":3200,"chapter":3429,"chapterSort":3430,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-3-std-atomic","wiki/2023-10-05-Cplusplus教学/ch18-19-3-std-atomic","std::atomic","18.19.3",18190300,{"path":3432,"stem":3433,"title":3434,"date":3200,"chapter":3435,"chapterSort":3436,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-4-condition-variable","wiki/2023-10-05-Cplusplus教学/ch18-19-4-condition-variable","condition_variable","18.19.4",18190400,{"path":3438,"stem":3439,"title":3440,"date":3200,"chapter":3441,"chapterSort":3442,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-bing-fa-bian-cheng","wiki/2023-10-05-Cplusplus教学/ch18-19-并发编程","并发编程","18.19",18190000,{"path":3444,"stem":3445,"title":3446,"date":3200,"chapter":3447,"chapterSort":3448,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-2-nullptr","wiki/2023-10-05-Cplusplus教学/ch18-2-nullptr","nullptr","18.2",18020000,{"path":3450,"stem":3451,"title":3452,"date":3200,"chapter":3453,"chapterSort":3454,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-20-std-filesystem","wiki/2023-10-05-Cplusplus教学/ch18-20-std-filesystem","std::filesystem","18.20",18200000,{"path":3456,"stem":3457,"title":3458,"date":3200,"chapter":3459,"chapterSort":3460,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-21-modules-jian-jie","wiki/2023-10-05-Cplusplus教学/ch18-21-modules简介","modules 简介","18.21",18210000,{"path":3462,"stem":3463,"title":3464,"date":3200,"chapter":3465,"chapterSort":3466,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-3-using","wiki/2023-10-05-Cplusplus教学/ch18-3-using","using","18.3",18030000,{"path":3468,"stem":3469,"title":3470,"date":3200,"chapter":3471,"chapterSort":3472,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-4-enum-class","wiki/2023-10-05-Cplusplus教学/ch18-4-enum-class","enum class","18.4",18040000,{"path":3474,"stem":3475,"title":3476,"date":3200,"chapter":3477,"chapterSort":3478,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-5-fan-wei-for-xun-huan","wiki/2023-10-05-Cplusplus教学/ch18-5-范围for循环","范围 for 循环","18.5",18050000,{"path":3480,"stem":3481,"title":3482,"date":3200,"chapter":3483,"chapterSort":3484,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-6-jie-gou-hua-bang-ding","wiki/2023-10-05-Cplusplus教学/ch18-6-结构化绑定","结构化绑定","18.6",18060000,{"path":3486,"stem":3487,"title":3488,"date":3200,"chapter":3489,"chapterSort":3490,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-7-constexpr","wiki/2023-10-05-Cplusplus教学/ch18-7-constexpr","constexpr","18.7",18070000,{"path":3492,"stem":3493,"title":3494,"date":3200,"chapter":3495,"chapterSort":3496,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-8-raii","wiki/2023-10-05-Cplusplus教学/ch18-8-RAII","RAII","18.8",18080000,{"path":3197,"stem":3206,"title":5,"date":3200,"chapter":3198,"chapterSort":3199,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},{"path":3499,"stem":3500,"title":3501,"date":3200,"chapter":3502,"chapterSort":3503,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-xian-dai-c","wiki/2023-10-05-Cplusplus教学/ch18-现代C++","现代C++","18",18000000,{"path":3505,"stem":3506,"title":3507,"date":3200,"chapter":3508,"chapterSort":3509,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-1-ding-shi-qi-yu-yi-bu-io","wiki/2023-10-05-Cplusplus教学/ch19-1-1-定时器与异步IO","定时器与异步 IO","19.1.1",19010100,{"path":3511,"stem":3512,"title":3513,"date":3200,"chapter":3514,"chapterSort":3515,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-2-boost-asio-ji-chu","wiki/2023-10-05-Cplusplus教学/ch19-1-2-Boost.Asio基础","Boost.Asio 基础","19.1.2",19010200,{"path":3517,"stem":3518,"title":3519,"date":3200,"chapter":3520,"chapterSort":3521,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-3-chuan-kou-tong-xin","wiki/2023-10-05-Cplusplus教学/ch19-1-3-串口通信","串口通信","19.1.3",19010300,{"path":3523,"stem":3524,"title":3525,"date":3200,"chapter":3526,"chapterSort":3527,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-4-tcp-tong-xin","wiki/2023-10-05-Cplusplus教学/ch19-1-4-TCP通信","TCP 通信","19.1.4",19010400,{"path":3529,"stem":3530,"title":3531,"date":3200,"chapter":3532,"chapterSort":3533,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-5-udp-tong-xin","wiki/2023-10-05-Cplusplus教学/ch19-1-5-UDP通信","UDP 通信","19.1.5",19010500,{"path":3535,"stem":3536,"title":3537,"date":3200,"chapter":3538,"chapterSort":3539,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-6-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","wiki/2023-10-05-Cplusplus教学/ch19-1-6-机器人工程写法与ROS2集成","机器人工程写法与 ROS2 集成","19.1.6",19010600,{"path":3541,"stem":3542,"title":3543,"date":3200,"chapter":3544,"chapterSort":3545,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-boost-asio-yi-bu-io-ku","wiki/2023-10-05-Cplusplus教学/ch19-1-Boost.Asio异步IO库","Boost.Asio异步IO库","19.1",19010000,{"path":3547,"stem":3548,"title":3549,"date":3200,"chapter":3550,"chapterSort":3551,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-2-eigen-xian-xing-dai-shu-ku","wiki/2023-10-05-Cplusplus教学/ch19-2-Eigen线性代数库","Eigen线性代数库","19.2",19020000,{"path":3553,"stem":3554,"title":3555,"date":3200,"chapter":3556,"chapterSort":3557,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-3-opencv-ji-suan-ji-shi-jue-ku","wiki/2023-10-05-Cplusplus教学/ch19-3-OpenCV计算机视觉库","OpenCV计算机视觉库","19.3",19030000,{"path":3559,"stem":3560,"title":3561,"date":3200,"chapter":3562,"chapterSort":3563,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-4-pcl-dian-yun-ku","wiki/2023-10-05-Cplusplus教学/ch19-4-PCL点云库","PCL点云库","19.4",19040000,{"path":3565,"stem":3566,"title":3567,"date":3200,"chapter":3568,"chapterSort":3569,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-5-sophus-li-qun-li-dai-shu-ku","wiki/2023-10-05-Cplusplus教学/ch19-5-Sophus李群李代数库","Sophus 李群李代数库","19.5",19050000,{"path":3571,"stem":3572,"title":3573,"date":3200,"chapter":3574,"chapterSort":3575,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-chang-yong-ku","wiki/2023-10-05-Cplusplus教学/ch19-常用库","常用库学习","19",19000000,{"path":3577,"stem":3578,"title":3579,"date":3200,"chapter":3580,"chapterSort":3581,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch2-shu-ju-lei-xing-yu-shu-ju-cun-fang","wiki/2023-10-05-Cplusplus教学/ch2-数据类型与数据存放","数据类型与数据存放","2",2000000,{"path":3583,"stem":3584,"title":3585,"date":3200,"chapter":3586,"chapterSort":3587,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch3-shu-ru-shu-chu","wiki/2023-10-05-Cplusplus教学/ch3-输入输出","输入输出","3",3000000,{"path":3589,"stem":3590,"title":3591,"date":3200,"chapter":3592,"chapterSort":3593,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch4-yun-suan-fu","wiki/2023-10-05-Cplusplus教学/ch4-运算符","运算符","4",4000000,{"path":3595,"stem":3596,"title":3597,"date":3200,"chapter":3598,"chapterSort":3599,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch5-cheng-xu-liu-cheng-jie-gou","wiki/2023-10-05-Cplusplus教学/ch5-程序流程结构","程序流程结构","5",5000000,{"path":3601,"stem":3602,"title":3603,"date":3200,"chapter":3604,"chapterSort":3605,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch6-shu-zu","wiki/2023-10-05-Cplusplus教学/ch6-数组","数组","6",6000000,{"path":3607,"stem":3608,"title":3609,"date":3200,"chapter":3610,"chapterSort":3611,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch7-han-shu-yu-tou-wen-jian","wiki/2023-10-05-Cplusplus教学/ch7-函数与头文件","函数与头文件","7",7000000,{"path":3613,"stem":3614,"title":3615,"date":3200,"chapter":3616,"chapterSort":3617,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch8-zhi-zhen","wiki/2023-10-05-Cplusplus教学/ch8-指针","指针","8",8000000,{"path":3619,"stem":3620,"title":3621,"date":3200,"chapter":3622,"chapterSort":3623,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":3207},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch9-jie-gou-ti-yu-gong-yong-ti","wiki/2023-10-05-Cplusplus教学/ch9-结构体与共用体","结构体与共用体","9",9000000,{"path":3203,"stem":3625,"title":3626,"date":3200,"chapter":3208,"chapterSort":3627,"docKey":3202,"docRoot":3203,"docTitle":3204,"isWikiDoc":241,"isWikiIndex":241},"wiki/2023-10-05-Cplusplus教学/index","C/C++教程",0,{"variants":3629},[3630,3633,3636,3639,3642],{"path":3631,"localeSlug":3632,"i18nKey":3206},"/en-us/wiki/2023-10-05-cplusplus-jiao-xue/ch18-9-zhi-neng-zhi-zhen","en-us",{"path":3634,"localeSlug":3635,"i18nKey":3206},"/zh-hant/wiki/2023-10-05-cplusplus-jiao-xue/ch18-9-zhi-neng-zhi-zhen","zh-hant",{"path":3637,"localeSlug":3638,"i18nKey":3206},"/zh-hk/wiki/2023-10-05-cplusplus-jiao-xue/ch18-9-zhi-neng-zhi-zhen","zh-hk",{"path":3640,"localeSlug":3641,"i18nKey":3206},"/zh-tw/wiki/2023-10-05-cplusplus-jiao-xue/ch18-9-zhi-neng-zhi-zhen","zh-tw",{"path":3197,"localeSlug":3211,"i18nKey":3206},[3631,3209,3634,3209,3637,3209,3640,3209,3197,3209],1780663036109]