[{"data":1,"prerenderedAt":4556},["ShallowReactive",2],{"wiki-page-\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen":3,"wiki-doc-items-\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen":4135,"language-switcher-data-\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen":4540,"wiki-i18n-paths-\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen":4555},{"id":4,"title":5,"body":6,"canonicalPath":4118,"chapterDepth":211,"chapterOrder":4119,"date":4120,"description":204,"docI18nKey":4121,"docKey":4122,"docRoot":4123,"docTitle":4124,"extension":4125,"i18nKey":4126,"isBlogPost":4127,"isWikiDoc":241,"isWikiIndex":4127,"layout":4128,"legacyPath":4129,"locale":4130,"localeSlug":4131,"meta":4132,"navigation":241,"path":4118,"seo":4133,"sourcePath":4129,"sourceStem":4126,"stem":4126,"wikiDepth":211,"__hash__":4134},"content\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针.md","智能指针",{"type":7,"value":8,"toc":4102},"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,2376,2382,2423,2426,2438,2441,2444,2497,2511,2556,2559,2574,2592,2595,2610,2622,2628,2631,2675,2679,2682,2701,2717,2723,2736,2742,2751,2764,2768,2773,2804,2807,2821,2831,2843,2846,2902,2905,2932,2950,2959,2976,2980,2989,3140,3154,3161,3196,3211,3214,3224,3265,3268,3274,3285,3289,3292,3323,3881,3885,3891,3894,3996,3999,4036,4039,4072,4075,4098],[10,11,12],"h2",{"id":12},"本节解决什么问题",[14,15,16,20,21,24],"p",{},[17,18,19],"code",{},"new\u002Fdelete"," 能手动管理动态内存，但它要求你在所有路径上都记得释放资源。一旦函数提前 ",[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"," \u002F ",[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; \u002F\u002F 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; \u002F\u002F 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"," \u002F\u002F 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}," \u002F\u002F 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\u002F\u002F 智能指针负责管理对象生命周期，减少手动释放资源的风险。\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    \u002F\u002F 程序从 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},"\u002F\u002F 智能指针负责管理对象生命周期，减少手动释放资源的风险。\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},"    \u002F\u002F 程序从 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    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    \u002F\u002F 智能指针负责管理对象生命周期，减少手动释放资源的风险。\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},"    \u002F\u002F 智能指针负责管理对象生命周期，减少手动释放资源的风险。\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; \u002F\u002F A 拥有下一个节点\n    b->prev = a; \u002F\u002F 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}," \u002F\u002F 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}," \u002F\u002F 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],{},"；如果对象已经释放，返回空指针。",[2364,2365,2366],"h4",{"id":2366},"这个例子表达了什么关系",[14,2368,2369],{},"这段代码可以看成一个只有两个节点的双向链表：",[199,2371,2374],{"className":2372,"code":2373,"language":855,"meta":204},[853],"A  ----next---->  B\nA  \u003C---prev-----  B\n",[17,2375,2373],{"__ignoreMap":204},[14,2377,2378,2379,849],{},"虽然两个节点都能找到对方，但两个方向的",[846,2380,2381],{},"所有权含义并不相同",[102,2383,2384,2404],{},[105,2385,2386,2389,2390,2393,2394,2397,2398,2400,2401,137],{},[17,2387,2388],{},"A"," 通过 ",[17,2391,2392],{},"next"," 拥有 ",[17,2395,2396],{},"B","，因此 ",[17,2399,2392],{}," 使用 ",[17,2402,2403],{},"std::shared_ptr\u003CNode>",[105,2405,2406,2389,2408,2411,2412,2414,2415,2417,2418,2400,2420,137],{},[17,2407,2396],{},[17,2409,2410],{},"prev"," 观察 ",[17,2413,2388],{},"，但不负责延长 ",[17,2416,2388],{}," 的生命周期，因此 ",[17,2419,2410],{},[17,2421,2422],{},"std::weak_ptr\u003CNode>",[14,2424,2425],{},"可以把它简单理解为：",[102,2427,2428,2433],{},[105,2429,2430,2432],{},[17,2431,92],{}," 表示“我拥有这个对象，它暂时不能被销毁”。",[105,2434,2435,2437],{},[17,2436,175],{}," 表示“我知道这个对象在哪里，但我不负责让它继续存活”。",[2364,2439,2440],{"id":2440},"引用计数是怎样变化的",[14,2442,2443],{},"刚创建两个节点时：",[199,2445,2447],{"className":201,"code":2446,"language":203,"meta":204,"style":204},"auto a = std::make_shared\u003CNode>(\"A\");\nauto b = std::make_shared\u003CNode>(\"B\");\n",[17,2448,2449,2473],{"__ignoreMap":204},[208,2450,2451,2453,2455,2457,2459,2461,2463,2465,2467,2469,2471],{"class":210,"line":211},[208,2452,2274],{"class":214},[208,2454,2120],{"class":258},[208,2456,501],{"class":214},[208,2458,297],{"class":251},[208,2460,300],{"class":258},[208,2462,1659],{"class":251},[208,2464,611],{"class":258},[208,2466,1961],{"class":251},[208,2468,617],{"class":258},[208,2470,2137],{"class":218},[208,2472,514],{"class":258},[208,2474,2475,2477,2479,2481,2483,2485,2487,2489,2491,2493,2495],{"class":210,"line":222},[208,2476,2274],{"class":214},[208,2478,2146],{"class":258},[208,2480,501],{"class":214},[208,2482,297],{"class":251},[208,2484,300],{"class":258},[208,2486,1659],{"class":251},[208,2488,611],{"class":258},[208,2490,1961],{"class":251},[208,2492,617],{"class":258},[208,2494,2163],{"class":218},[208,2496,514],{"class":258},[14,2498,2499,2500,2393,2503,2505,2506,2393,2509,849],{},"此时 ",[17,2501,2502],{},"a",[17,2504,2388],{},"，",[17,2507,2508],{},"b",[17,2510,2396],{},[29,2512,2513,2529],{},[32,2514,2515],{},[35,2516,2517,2520,2525],{},[38,2518,2519],{"align":40},"对象",[38,2521,2522,2523],{"align":40},"拥有它的 ",[17,2524,92],{},[38,2526,2528],{"align":2527},"center","引用计数",[48,2530,2531,2544],{},[35,2532,2533,2537,2541],{},[53,2534,2535],{"align":40},[17,2536,2388],{},[53,2538,2539],{"align":40},[17,2540,2502],{},[53,2542,2543],{"align":2527},"1",[35,2545,2546,2550,2554],{},[53,2547,2548],{"align":40},[17,2549,2396],{},[53,2551,2552],{"align":40},[17,2553,2508],{},[53,2555,2543],{"align":2527},[14,2557,2558],{},"执行：",[199,2560,2562],{"className":201,"code":2561,"language":203,"meta":204,"style":204},"a->next = b;\n",[17,2563,2564],{"__ignoreMap":204},[208,2565,2566,2569,2571],{"class":210,"line":211},[208,2567,2568],{"class":258},"a->next ",[208,2570,501],{"class":214},[208,2572,2573],{"class":258}," b;\n",[14,2575,2576,2579,2580,2582,2583,2585,2586,2588,2589,2591],{},[17,2577,2578],{},"a->next"," 也是一个 ",[17,2581,92],{},"，它和 ",[17,2584,2508],{}," 共同拥有 ",[17,2587,2396],{},"，所以 ",[17,2590,2396],{}," 的引用计数由 1 变成 2。",[14,2593,2594],{},"接着执行：",[199,2596,2598],{"className":201,"code":2597,"language":203,"meta":204,"style":204},"b->prev = a;\n",[17,2599,2600],{"__ignoreMap":204},[208,2601,2602,2605,2607],{"class":210,"line":211},[208,2603,2604],{"class":258},"b->prev ",[208,2606,501],{"class":214},[208,2608,2609],{"class":258}," a;\n",[14,2611,2612,2615,2616,2618,2619,2621],{},[17,2613,2614],{},"b->prev"," 是 ",[17,2617,175],{},"，只观察 ",[17,2620,2388],{},"，不会增加引用计数。因此最终输出为：",[199,2623,2626],{"className":2624,"code":2625,"language":855,"meta":204},[853],"a count = 1\nb count = 2\n",[17,2627,2625],{"__ignoreMap":204},[14,2629,2630],{},"对应关系是：",[29,2632,2633,2645],{},[32,2634,2635],{},[35,2636,2637,2639,2643],{},[38,2638,2519],{"align":40},[38,2640,2522,2641],{"align":40},[17,2642,92],{},[38,2644,2528],{"align":2527},[48,2646,2647,2659],{},[35,2648,2649,2653,2657],{},[53,2650,2651],{"align":40},[17,2652,2388],{},[53,2654,2655],{"align":40},[17,2656,2502],{},[53,2658,2543],{"align":2527},[35,2660,2661,2665,2672],{},[53,2662,2663],{"align":40},[17,2664,2396],{},[53,2666,2667,2669,2670],{"align":40},[17,2668,2508],{},"、",[17,2671,2578],{},[53,2673,2674],{"align":2527},"2",[2364,2676,2678],{"id":2677},"为什么反向指针不能也使用-shared_ptr","为什么反向指针不能也使用 shared_ptr",[14,2680,2681],{},"假设把成员改成：",[199,2683,2685],{"className":201,"code":2684,"language":203,"meta":204,"style":204},"std::shared_ptr\u003CNode> prev;\n",[17,2686,2687],{"__ignoreMap":204},[208,2688,2689,2691,2693,2695,2697,2699],{"class":210,"line":211},[208,2690,1103],{"class":251},[208,2692,1956],{"class":258},[208,2694,611],{"class":214},[208,2696,1961],{"class":258},[208,2698,1964],{"class":214},[208,2700,1983],{"class":258},[14,2702,2703,2704,2389,2706,2393,2708,2505,2710,2712,2713,2393,2715,849],{},"那么 ",[17,2705,2388],{},[17,2707,2392],{},[17,2709,2396],{},[17,2711,2396],{}," 又通过 ",[17,2714,2410],{},[17,2716,2388],{},[199,2718,2721],{"className":2719,"code":2720,"language":855,"meta":204},[853],"A  ----shared_ptr---->  B\nA  \u003C---shared_ptr----  B\n",[17,2722,2720],{"__ignoreMap":204},[14,2724,2725,2726,2729,2730,2732,2733,2735],{},"当 ",[17,2727,2728],{},"main()"," 结束时，局部变量 ",[17,2731,2502],{}," 和 ",[17,2734,2508],{}," 虽然会销毁，但两个节点内部仍然互相持有：",[199,2737,2740],{"className":2738,"code":2739,"language":855,"meta":204},[853],"A 的引用计数至少为 1：来自 B.prev\nB 的引用计数至少为 1：来自 A.next\n",[17,2741,2739],{"__ignoreMap":204},[14,2743,2744,2745,2747,2748,137],{},"它们的引用计数都无法降到 0，因此两个对象都不会析构，这就是 ",[17,2746,92],{}," 的",[846,2749,2750],{},"循环引用问题",[14,2752,2753,2754,2756,2757,2760,2761,2763],{},"使用 ",[17,2755,175],{}," 作为反向指针后，",[17,2758,2759],{},"B.prev"," 不参与 ",[17,2762,2388],{}," 的引用计数，循环所有权被打破，对象便可以正常释放。",[2364,2765,2767],{"id":2766},"lock-的作用是什么","lock() 的作用是什么",[14,2769,2770,2772],{},[17,2771,175],{}," 不拥有对象，因此它不能保证自己观察的对象仍然存在。也正因为如此，不能直接写：",[199,2774,2776],{"className":201,"code":2775,"language":203,"meta":204,"style":204},"\u002F\u002F 错误：weak_ptr 不支持直接使用 -> 访问对象\nstd::cout \u003C\u003C b->prev->name \u003C\u003C \"\\n\";\n",[17,2777,2778,2783],{"__ignoreMap":204},[208,2779,2780],{"class":210,"line":211},[208,2781,2782],{"class":564},"\u002F\u002F 错误：weak_ptr 不支持直接使用 -> 访问对象\n",[208,2784,2785,2787,2789,2791,2794,2796,2798,2800,2802],{"class":210,"line":222},[208,2786,1103],{"class":251},[208,2788,334],{"class":258},[208,2790,337],{"class":214},[208,2792,2793],{"class":258}," b->prev->name ",[208,2795,337],{"class":214},[208,2797,748],{"class":218},[208,2799,349],{"class":348},[208,2801,352],{"class":218},[208,2803,355],{"class":258},[14,2805,2806],{},"访问前必须调用：",[199,2808,2810],{"className":201,"code":2809,"language":203,"meta":204,"style":204},"b->prev.lock()\n",[17,2811,2812],{"__ignoreMap":204},[208,2813,2814,2817,2819],{"class":210,"line":211},[208,2815,2816],{"class":258},"b->prev.",[208,2818,2284],{"class":251},[208,2820,375],{"class":258},[14,2822,2823,2825,2826,2828,2829,849],{},[17,2824,2355],{}," 会尝试根据 ",[17,2827,175],{}," 得到一个 ",[17,2830,92],{},[102,2832,2833,2838],{},[105,2834,2835,2836,137],{},"如果对象仍然存在，返回一个有效的 ",[17,2837,92],{},[105,2839,2840,2841,137],{},"如果对象已经销毁，返回一个空的 ",[17,2842,92],{},[14,2844,2845],{},"因此原代码写成：",[199,2847,2849],{"className":201,"code":2848,"language":203,"meta":204,"style":204},"if (auto p = b->prev.lock())\n{\n    std::cout \u003C\u003C \"B prev is \" \u003C\u003C p->name \u003C\u003C \"\\n\";\n}\n",[17,2850,2851,2870,2874,2898],{"__ignoreMap":204},[208,2852,2853,2856,2858,2860,2862,2864,2866,2868],{"class":210,"line":211},[208,2854,2855],{"class":214},"if",[208,2857,2271],{"class":258},[208,2859,2274],{"class":214},[208,2861,1188],{"class":258},[208,2863,501],{"class":214},[208,2865,2281],{"class":258},[208,2867,2284],{"class":251},[208,2869,2287],{"class":258},[208,2871,2872],{"class":210,"line":222},[208,2873,259],{"class":258},[208,2875,2876,2878,2880,2882,2884,2886,2888,2890,2892,2894,2896],{"class":210,"line":230},[208,2877,265],{"class":251},[208,2879,334],{"class":258},[208,2881,337],{"class":214},[208,2883,2302],{"class":218},[208,2885,741],{"class":214},[208,2887,2307],{"class":258},[208,2889,337],{"class":214},[208,2891,748],{"class":218},[208,2893,349],{"class":348},[208,2895,352],{"class":218},[208,2897,355],{"class":258},[208,2899,2900],{"class":210,"line":238},[208,2901,571],{"class":258},[14,2903,2904],{},"这段代码可以分成三步理解：",[142,2906,2907,2918,2924],{},[105,2908,2909,2912,2913,2915,2916,137],{},[17,2910,2911],{},"b->prev.lock()"," 尝试获得指向 ",[17,2914,2388],{}," 的 ",[17,2917,92],{},[105,2919,2920,2921,2923],{},"返回值保存到局部变量 ",[17,2922,14],{}," 中。",[105,2925,2926,2928,2929,2931],{},[17,2927,2855],{}," 检查 ",[17,2930,14],{}," 是否非空，只有对象仍然存在时才进入代码块。",[14,2933,2934,2935,2937,2938,2940,2941,2943,2944,2946,2947,2949],{},"在这个例子中，",[17,2936,2388],{}," 仍然由变量 ",[17,2939,2502],{}," 管理，所以 ",[17,2942,2355],{}," 成功，",[17,2945,14],{}," 指向 ",[17,2948,2388],{},"，可以安全访问：",[199,2951,2953],{"className":201,"code":2952,"language":203,"meta":204,"style":204},"p->name\n",[17,2954,2955],{"__ignoreMap":204},[208,2956,2957],{"class":210,"line":211},[208,2958,2952],{"class":258},[14,2960,2961,2962,2964,2965,2397,2967,2969,2970,2972,2973,2975],{},"在 ",[17,2963,14],{}," 存活期间，它也会暂时拥有 ",[17,2966,2388],{},[17,2968,2388],{}," 的引用计数会临时从 1 变成 2。离开 ",[17,2971,2855],{}," 代码块后，",[17,2974,14],{}," 被销毁，引用计数再从 2 变回 1。",[2364,2977,2979],{"id":2978},"lock-失败时会怎样","lock() 失败时会怎样",[14,2981,2982,2983,2985,2986,2988],{},"下面的例子中，",[17,2984,2388],{}," 被销毁以后，",[17,2987,175],{}," 本身仍然可以存在，但它已经处于过期状态：",[199,2990,2992],{"className":201,"code":2991,"language":203,"meta":204,"style":204},"std::weak_ptr\u003CNode> observer;\n\n{\n    auto owner = std::make_shared\u003CNode>(\"A\");\n    observer = owner;\n} \u002F\u002F owner 销毁，A 的引用计数变成 0，A 被释放\n\nif (auto p = observer.lock())\n{\n    std::cout \u003C\u003C p->name \u003C\u003C \"\\n\";\n}\nelse\n{\n    std::cout \u003C\u003C \"observed object has been destroyed\\n\";\n}\n",[17,2993,2994,3009,3013,3017,3041,3051,3059,3063,3082,3086,3106,3110,3115,3119,3136],{"__ignoreMap":204},[208,2995,2996,2998,3000,3002,3004,3006],{"class":210,"line":211},[208,2997,1103],{"class":251},[208,2999,1974],{"class":258},[208,3001,611],{"class":214},[208,3003,1961],{"class":258},[208,3005,1964],{"class":214},[208,3007,3008],{"class":258}," observer;\n",[208,3010,3011],{"class":210,"line":222},[208,3012,242],{"emptyLinePlaceholder":241},[208,3014,3015],{"class":210,"line":230},[208,3016,259],{"class":258},[208,3018,3019,3021,3023,3025,3027,3029,3031,3033,3035,3037,3039],{"class":210,"line":238},[208,3020,597],{"class":214},[208,3022,1218],{"class":258},[208,3024,501],{"class":214},[208,3026,297],{"class":251},[208,3028,300],{"class":258},[208,3030,1659],{"class":251},[208,3032,611],{"class":258},[208,3034,1961],{"class":251},[208,3036,617],{"class":258},[208,3038,2137],{"class":218},[208,3040,514],{"class":258},[208,3042,3043,3046,3048],{"class":210,"line":245},[208,3044,3045],{"class":258},"    observer ",[208,3047,501],{"class":214},[208,3049,3050],{"class":258}," owner;\n",[208,3052,3053,3056],{"class":210,"line":255},[208,3054,3055],{"class":258},"}",[208,3057,3058],{"class":564}," \u002F\u002F owner 销毁，A 的引用计数变成 0，A 被释放\n",[208,3060,3061],{"class":210,"line":262},[208,3062,242],{"emptyLinePlaceholder":241},[208,3064,3065,3067,3069,3071,3073,3075,3078,3080],{"class":210,"line":271},[208,3066,2855],{"class":214},[208,3068,2271],{"class":258},[208,3070,2274],{"class":214},[208,3072,1188],{"class":258},[208,3074,501],{"class":214},[208,3076,3077],{"class":258}," observer.",[208,3079,2284],{"class":251},[208,3081,2287],{"class":258},[208,3083,3084],{"class":210,"line":276},[208,3085,259],{"class":258},[208,3087,3088,3090,3092,3094,3096,3098,3100,3102,3104],{"class":210,"line":282},[208,3089,265],{"class":251},[208,3091,334],{"class":258},[208,3093,337],{"class":214},[208,3095,2307],{"class":258},[208,3097,337],{"class":214},[208,3099,748],{"class":218},[208,3101,349],{"class":348},[208,3103,352],{"class":218},[208,3105,355],{"class":258},[208,3107,3108],{"class":210,"line":322},[208,3109,571],{"class":258},[208,3111,3112],{"class":210,"line":328},[208,3113,3114],{"class":214},"else\n",[208,3116,3117],{"class":210,"line":358},[208,3118,259],{"class":258},[208,3120,3121,3123,3125,3127,3130,3132,3134],{"class":210,"line":364},[208,3122,265],{"class":251},[208,3124,334],{"class":258},[208,3126,337],{"class":214},[208,3128,3129],{"class":218}," \"observed object has been destroyed",[208,3131,349],{"class":348},[208,3133,352],{"class":218},[208,3135,355],{"class":258},[208,3137,3138],{"class":210,"line":369},[208,3139,571],{"class":258},[14,3141,3142,3143,3146,3147,3149,3150,3153],{},"这时 ",[17,3144,3145],{},"observer.lock()"," 返回空的 ",[17,3148,92],{},"，程序进入 ",[17,3151,3152],{},"else","，不会访问已经销毁的对象。",[14,3155,3156,3157,3160],{},"也可以先使用 ",[17,3158,3159],{},"expired()"," 判断：",[199,3162,3164],{"className":201,"code":3163,"language":203,"meta":204,"style":204},"if (!observer.expired())\n{\n    \u002F\u002F 对象可能仍然存在\n}\n",[17,3165,3166,3183,3187,3192],{"__ignoreMap":204},[208,3167,3168,3170,3172,3175,3178,3181],{"class":210,"line":211},[208,3169,2855],{"class":214},[208,3171,2271],{"class":258},[208,3173,3174],{"class":214},"!",[208,3176,3177],{"class":258},"observer.",[208,3179,3180],{"class":251},"expired",[208,3182,2287],{"class":258},[208,3184,3185],{"class":210,"line":222},[208,3186,259],{"class":258},[208,3188,3189],{"class":210,"line":230},[208,3190,3191],{"class":564},"    \u002F\u002F 对象可能仍然存在\n",[208,3193,3194],{"class":210,"line":238},[208,3195,571],{"class":258},[14,3197,3198,3199,3201,3202,3204,3205,3207,3208,3210],{},"不过需要真正访问对象时，仍然应该直接使用 ",[17,3200,2355],{}," 并检查返回值。因为从调用 ",[17,3203,3159],{}," 到调用 ",[17,3206,2355],{}," 之间，对象的生命周期仍可能发生变化；",[17,3209,2355],{}," 能把“检查对象是否存在”和“临时取得所有权”合并为一次安全操作。",[2364,3212,3213],{"id":3213},"程序结束时为什么两个节点都能析构",[14,3215,3216,3218,3219,3221,3222,849],{},[17,3217,2728],{}," 结束时，局部变量按照创建顺序的相反方向销毁，因此先销毁 ",[17,3220,2508],{},"，再销毁 ",[17,3223,2502],{},[142,3225,3226,3239,3249,3260],{},[105,3227,3228,3230,3231,3233,3234,3236,3237,137],{},[17,3229,2508],{}," 销毁后，",[17,3232,2396],{}," 的引用计数从 2 变成 1，因为 ",[17,3235,2578],{}," 仍然拥有 ",[17,3238,2396],{},[105,3240,3241,3230,3243,3245,3246,3248],{},[17,3242,2502],{},[17,3244,2388],{}," 的引用计数从 1 变成 0，于是 ",[17,3247,2388],{}," 被析构。",[105,3250,3251,3253,3254,3256,3257,3259],{},[17,3252,2388],{}," 被销毁时，它的成员 ",[17,3255,2392],{}," 也随之销毁，",[17,3258,2396],{}," 的引用计数从 1 变成 0。",[105,3261,3262,3263,3248],{},"最后 ",[17,3264,2396],{},[14,3266,3267],{},"所以最终可以看到：",[199,3269,3272],{"className":3270,"code":3271,"language":855,"meta":204},[853],"Node A destroyed\nNode B destroyed\n",[17,3273,3271],{"__ignoreMap":204},[14,3275,3276,3277],{},"这里最关键的不是“前后指针必须分别使用哪一种智能指针”，而是要先判断所有权关系：",[846,3278,3279,3280,3282,3283,137],{},"真正负责对象生命周期的一方使用 ",[17,3281,92],{},"，只负责观察的一方使用 ",[17,3284,175],{},[184,3286,3288],{"id":3287},"示例-5函数参数不要滥用-shared_ptr","示例 5：函数参数不要滥用 shared_ptr",[14,3290,3291],{},"函数参数应该表达真实语义：",[102,3293,3294,3304,3313,3318],{},[105,3295,3296,3297,3300,3301,137],{},"只是临时使用对象：用 ",[17,3298,3299],{},"T&"," 或 ",[17,3302,3303],{},"const T&",[105,3305,3306,3307,3300,3310,137],{},"函数可能没有对象：用 ",[17,3308,3309],{},"T*",[17,3311,3312],{},"const T*",[105,3314,3315,3316,137],{},"函数要接管对象：用 ",[17,3317,57],{},[105,3319,3320,3321,137],{},"函数要共同拥有对象：用 ",[17,3322,70],{},[199,3324,3326],{"className":201,"code":3325,"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\u002F\u002F 智能指针负责管理对象生命周期，减少手动释放资源的风险。\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    \u002F\u002F 程序从 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,3327,3328,3334,3340,3346,3352,3356,3363,3367,3373,3377,3381,3413,3417,3435,3439,3445,3449,3453,3457,3477,3481,3511,3515,3519,3523,3550,3554,3584,3588,3592,3617,3621,3650,3654,3658,3666,3670,3674,3700,3712,3728,3768,3772,3798,3828,3836,3865,3869,3877],{"__ignoreMap":204},[208,3329,3330,3332],{"class":210,"line":211},[208,3331,215],{"class":214},[208,3333,219],{"class":218},[208,3335,3336,3338],{"class":210,"line":222},[208,3337,215],{"class":214},[208,3339,227],{"class":218},[208,3341,3342,3344],{"class":210,"line":230},[208,3343,215],{"class":214},[208,3345,235],{"class":218},[208,3347,3348,3350],{"class":210,"line":238},[208,3349,215],{"class":214},[208,3351,906],{"class":218},[208,3353,3354],{"class":210,"line":245},[208,3355,242],{"emptyLinePlaceholder":241},[208,3357,3358,3360],{"class":210,"line":255},[208,3359,248],{"class":214},[208,3361,3362],{"class":251}," Robot\n",[208,3364,3365],{"class":210,"line":262},[208,3366,259],{"class":258},[208,3368,3369,3371],{"class":210,"line":271},[208,3370,265],{"class":251},[208,3372,268],{"class":258},[208,3374,3375],{"class":210,"line":276},[208,3376,242],{"emptyLinePlaceholder":241},[208,3378,3379],{"class":210,"line":282},[208,3380,279],{"class":214},[208,3382,3383,3385,3388,3390,3392,3394,3396,3398,3400,3402,3404,3406,3408,3410],{"class":210,"line":322},[208,3384,285],{"class":214},[208,3386,3387],{"class":251}," Robot",[208,3389,291],{"class":258},[208,3391,1103],{"class":251},[208,3393,300],{"class":258},[208,3395,303],{"class":251},[208,3397,310],{"class":309},[208,3399,313],{"class":258},[208,3401,316],{"class":251},[208,3403,291],{"class":258},[208,3405,1103],{"class":251},[208,3407,300],{"class":258},[208,3409,1227],{"class":251},[208,3411,3412],{"class":258},"(name)) {}\n",[208,3414,3415],{"class":210,"line":328},[208,3416,242],{"emptyLinePlaceholder":241},[208,3418,3419,3421,3423,3425,3427,3429,3431,3433],{"class":210,"line":358},[208,3420,1047],{"class":214},[208,3422,297],{"class":251},[208,3424,300],{"class":258},[208,3426,303],{"class":251},[208,3428,306],{"class":214},[208,3430,310],{"class":251},[208,3432,424],{"class":258},[208,3434,427],{"class":214},[208,3436,3437],{"class":210,"line":364},[208,3438,325],{"class":258},[208,3440,3441,3443],{"class":210,"line":369},[208,3442,1070],{"class":214},[208,3444,1073],{"class":258},[208,3446,3447],{"class":210,"line":378},[208,3448,361],{"class":258},[208,3450,3451],{"class":210,"line":383},[208,3452,465],{"class":258},[208,3454,3455],{"class":210,"line":405},[208,3456,242],{"emptyLinePlaceholder":241},[208,3458,3459,3461,3464,3466,3468,3470,3472,3475],{"class":210,"line":410},[208,3460,1095],{"class":214},[208,3462,3463],{"class":251}," print_robot",[208,3465,291],{"class":258},[208,3467,294],{"class":214},[208,3469,3387],{"class":251},[208,3471,306],{"class":214},[208,3473,3474],{"class":309}," robot",[208,3476,1121],{"class":258},[208,3478,3479],{"class":210,"line":415},[208,3480,259],{"class":258},[208,3482,3483,3485,3487,3489,3492,3494,3497,3499,3501,3503,3505,3507,3509],{"class":210,"line":430},[208,3484,265],{"class":251},[208,3486,334],{"class":258},[208,3488,337],{"class":214},[208,3490,3491],{"class":218}," \"borrow: \"",[208,3493,741],{"class":214},[208,3495,3496],{"class":258}," robot.",[208,3498,1144],{"class":251},[208,3500,424],{"class":258},[208,3502,337],{"class":214},[208,3504,748],{"class":218},[208,3506,349],{"class":348},[208,3508,352],{"class":218},[208,3510,355],{"class":258},[208,3512,3513],{"class":210,"line":435},[208,3514,571],{"class":258},[208,3516,3517],{"class":210,"line":457},[208,3518,242],{"emptyLinePlaceholder":241},[208,3520,3521],{"class":210,"line":462},[208,3522,1090],{"class":564},[208,3524,3525,3527,3530,3532,3534,3536,3538,3540,3543,3545,3548],{"class":210,"line":468},[208,3526,1095],{"class":214},[208,3528,3529],{"class":251}," take_robot",[208,3531,291],{"class":258},[208,3533,1103],{"class":251},[208,3535,300],{"class":258},[208,3537,155],{"class":251},[208,3539,611],{"class":258},[208,3541,3542],{"class":251},"Robot",[208,3544,1115],{"class":258},[208,3546,3547],{"class":309},"robot",[208,3549,1121],{"class":258},[208,3551,3552],{"class":210,"line":473},[208,3553,259],{"class":258},[208,3555,3556,3558,3560,3562,3565,3567,3570,3572,3574,3576,3578,3580,3582],{"class":210,"line":484},[208,3557,265],{"class":251},[208,3559,334],{"class":258},[208,3561,337],{"class":214},[208,3563,3564],{"class":218}," \"take: \"",[208,3566,741],{"class":214},[208,3568,3569],{"class":258}," robot->",[208,3571,1144],{"class":251},[208,3573,424],{"class":258},[208,3575,337],{"class":214},[208,3577,748],{"class":218},[208,3579,349],{"class":348},[208,3581,352],{"class":218},[208,3583,355],{"class":258},[208,3585,3586],{"class":210,"line":489},[208,3587,571],{"class":258},[208,3589,3590],{"class":210,"line":517},[208,3591,242],{"emptyLinePlaceholder":241},[208,3593,3594,3596,3599,3601,3603,3605,3607,3609,3611,3613,3615],{"class":210,"line":529},[208,3595,1095],{"class":214},[208,3597,3598],{"class":251}," share_robot",[208,3600,291],{"class":258},[208,3602,1103],{"class":251},[208,3604,300],{"class":258},[208,3606,92],{"class":251},[208,3608,611],{"class":258},[208,3610,3542],{"class":251},[208,3612,1115],{"class":258},[208,3614,3547],{"class":309},[208,3616,1121],{"class":258},[208,3618,3619],{"class":210,"line":534},[208,3620,259],{"class":258},[208,3622,3623,3625,3627,3629,3632,3634,3636,3638,3640,3642,3644,3646,3648],{"class":210,"line":552},[208,3624,265],{"class":251},[208,3626,334],{"class":258},[208,3628,337],{"class":214},[208,3630,3631],{"class":218}," \"share count inside = \"",[208,3633,741],{"class":214},[208,3635,3496],{"class":258},[208,3637,1690],{"class":251},[208,3639,424],{"class":258},[208,3641,337],{"class":214},[208,3643,748],{"class":218},[208,3645,349],{"class":348},[208,3647,352],{"class":218},[208,3649,355],{"class":258},[208,3651,3652],{"class":210,"line":568},[208,3653,571],{"class":258},[208,3655,3656],{"class":210,"line":574},[208,3657,242],{"emptyLinePlaceholder":241},[208,3659,3660,3662,3664],{"class":210,"line":579},[208,3661,682],{"class":214},[208,3663,685],{"class":251},[208,3665,375],{"class":258},[208,3667,3668],{"class":210,"line":589},[208,3669,259],{"class":258},[208,3671,3672],{"class":210,"line":594},[208,3673,1181],{"class":564},[208,3675,3676,3678,3681,3683,3685,3687,3689,3691,3693,3695,3698],{"class":210,"line":625},[208,3677,597],{"class":214},[208,3679,3680],{"class":258}," robot ",[208,3682,501],{"class":214},[208,3684,297],{"class":251},[208,3686,300],{"class":258},[208,3688,608],{"class":251},[208,3690,611],{"class":258},[208,3692,3542],{"class":251},[208,3694,617],{"class":258},[208,3696,3697],{"class":218},"\"R1\"",[208,3699,514],{"class":258},[208,3701,3702,3705,3707,3709],{"class":210,"line":634},[208,3703,3704],{"class":251},"    print_robot",[208,3706,291],{"class":258},[208,3708,495],{"class":214},[208,3710,3711],{"class":258},"robot);\n",[208,3713,3714,3717,3719,3721,3723,3725],{"class":210,"line":639},[208,3715,3716],{"class":251},"    take_robot",[208,3718,291],{"class":258},[208,3720,1103],{"class":251},[208,3722,300],{"class":258},[208,3724,1227],{"class":251},[208,3726,3727],{"class":258},"(robot));\n",[208,3729,3730,3732,3734,3736,3739,3741,3744,3746,3748,3750,3752,3754,3756,3758,3760,3762,3764,3766],{"class":210,"line":657},[208,3731,265],{"class":251},[208,3733,334],{"class":258},[208,3735,337],{"class":214},[208,3737,3738],{"class":218}," \"robot is null? \"",[208,3740,741],{"class":214},[208,3742,3743],{"class":258}," (robot ",[208,3745,1249],{"class":214},[208,3747,1252],{"class":348},[208,3749,1255],{"class":214},[208,3751,1258],{"class":218},[208,3753,1261],{"class":214},[208,3755,1264],{"class":218},[208,3757,1267],{"class":258},[208,3759,337],{"class":214},[208,3761,748],{"class":218},[208,3763,349],{"class":348},[208,3765,352],{"class":218},[208,3767,355],{"class":258},[208,3769,3770],{"class":210,"line":669},[208,3771,242],{"emptyLinePlaceholder":241},[208,3773,3774,3776,3779,3781,3783,3785,3787,3789,3791,3793,3796],{"class":210,"line":674},[208,3775,597],{"class":214},[208,3777,3778],{"class":258}," shared_robot ",[208,3780,501],{"class":214},[208,3782,297],{"class":251},[208,3784,300],{"class":258},[208,3786,1659],{"class":251},[208,3788,611],{"class":258},[208,3790,3542],{"class":251},[208,3792,617],{"class":258},[208,3794,3795],{"class":218},"\"R2\"",[208,3797,514],{"class":258},[208,3799,3800,3802,3804,3806,3809,3811,3814,3816,3818,3820,3822,3824,3826],{"class":210,"line":679},[208,3801,265],{"class":251},[208,3803,334],{"class":258},[208,3805,337],{"class":214},[208,3807,3808],{"class":218}," \"share count before = \"",[208,3810,741],{"class":214},[208,3812,3813],{"class":258}," shared_robot.",[208,3815,1690],{"class":251},[208,3817,424],{"class":258},[208,3819,337],{"class":214},[208,3821,748],{"class":218},[208,3823,349],{"class":348},[208,3825,352],{"class":218},[208,3827,355],{"class":258},[208,3829,3830,3833],{"class":210,"line":690},[208,3831,3832],{"class":251},"    share_robot",[208,3834,3835],{"class":258},"(shared_robot);\n",[208,3837,3838,3840,3842,3844,3847,3849,3851,3853,3855,3857,3859,3861,3863],{"class":210,"line":695},[208,3839,265],{"class":251},[208,3841,334],{"class":258},[208,3843,337],{"class":214},[208,3845,3846],{"class":218}," \"share count after = \"",[208,3848,741],{"class":214},[208,3850,3813],{"class":258},[208,3852,1690],{"class":251},[208,3854,424],{"class":258},[208,3856,337],{"class":214},[208,3858,748],{"class":218},[208,3860,349],{"class":348},[208,3862,352],{"class":218},[208,3864,355],{"class":258},[208,3866,3867],{"class":210,"line":709},[208,3868,242],{"emptyLinePlaceholder":241},[208,3870,3871,3873,3875],{"class":210,"line":714},[208,3872,555],{"class":214},[208,3874,835],{"class":348},[208,3876,355],{"class":258},[208,3878,3879],{"class":210,"line":729},[208,3880,571],{"class":258},[14,3882,3883,849],{},[846,3884,848],{},[199,3886,3889],{"className":3887,"code":3888,"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,3890,3888],{"__ignoreMap":204},[10,3892,3893],{"id":3893},"关键语法解释",[29,3895,3896,3909],{},[32,3897,3898],{},[35,3899,3900,3903,3906],{},[38,3901,3902],{"align":40},"写法",[38,3904,3905],{"align":40},"含义",[38,3907,3908],{"align":40},"注意事项",[48,3910,3911,3924,3940,3953,3966,3980],{},[35,3912,3913,3918,3921],{},[53,3914,3915],{"align":40},[17,3916,3917],{},"std::make_unique\u003CT>(...)",[53,3919,3920],{"align":40},"创建独占所有权对象",[53,3922,3923],{"align":40},"C++14 起可用",[35,3925,3926,3931,3937],{},[53,3927,3928],{"align":40},[17,3929,3930],{},"std::move(p)",[53,3932,3933,3934,3936],{"align":40},"把 ",[17,3935,155],{}," 所有权转出去",[53,3938,3939],{"align":40},"移动后原指针通常为空",[35,3941,3942,3947,3950],{},[53,3943,3944],{"align":40},[17,3945,3946],{},"std::make_shared\u003CT>(...)",[53,3948,3949],{"align":40},"创建共享所有权对象",[53,3951,3952],{"align":40},"引用计数有开销",[35,3954,3955,3960,3963],{},[53,3956,3957],{"align":40},[17,3958,3959],{},"sp.use_count()",[53,3961,3962],{"align":40},"查看共享引用计数",[53,3964,3965],{"align":40},"教学调试可用，业务逻辑不要依赖它",[35,3967,3968,3972,3975],{},[53,3969,3970],{"align":40},[17,3971,83],{},[53,3973,3974],{"align":40},"弱引用，不增加引用计数",[53,3976,3977,3978],{"align":40},"访问前必须 ",[17,3979,2355],{},[35,3981,3982,3987,3990],{},[53,3983,3984],{"align":40},[17,3985,3986],{},"p.reset()",[53,3988,3989],{"align":40},"释放当前管理的对象",[53,3991,3992,3993,3995],{"align":40},"对 ",[17,3994,92],{}," 是减少一次引用计数",[10,3997,3998],{"id":3998},"常见错误",[142,4000,4001,4009,4015,4024,4030],{},[105,4002,3933,4003,4005,4006,4008],{},[17,4004,155],{}," 当普通指针复制。",[17,4007,155],{}," 只能移动，不能复制。",[105,4010,4011,4012,4014],{},"明明只是借用对象，却把参数写成 ",[17,4013,92],{},"。这会暗示函数也参与共享所有权。",[105,4016,4017,4018,4020,4021,4023],{},"用一个 ",[17,4019,92],{}," 的原始指针创建另一个 ",[17,4022,92],{},"。这样会产生两个控制块，最终可能重复释放。",[105,4025,4026,4027,4029],{},"两个对象互相用 ",[17,4028,92],{}," 持有对方，导致循环引用。",[105,4031,4032,4033,4035],{},"用智能指针管理栈对象。例如把局部变量地址交给 ",[17,4034,155],{},"，离开作用域时会错误释放栈内存。",[10,4037,4038],{"id":4038},"使用建议",[142,4040,4041,4044,4049,4054,4062,4069],{},[105,4042,4043],{},"能不用指针就不用指针，普通对象和引用优先。",[105,4045,4046,4047,137],{},"需要动态所有权时，优先用 ",[17,4048,155],{},[105,4050,4051,4052,137],{},"只有确实有多个所有者时，才用 ",[17,4053,92],{},[105,4055,4056,4057,4059,4060,137],{},"只观察 ",[17,4058,92],{}," 管理的对象时，用 ",[17,4061,175],{},[105,4063,4064,4065,2732,4067,137],{},"创建智能指针优先使用 ",[17,4066,608],{},[17,4068,1659],{},[105,4070,4071],{},"函数参数要表达语义：借用、转移、共享不要混用。",[10,4073,4074],{"id":4074},"小结",[102,4076,4077,4080,4085,4090,4095],{},[105,4078,4079],{},"智能指针是 RAII 的典型应用。",[105,4081,4082,4084],{},[17,4083,155],{}," 表达独占所有权，是默认首选。",[105,4086,4087,4089],{},[17,4088,92],{}," 表达共享所有权，不要因为方便就滥用。",[105,4091,4092,4094],{},[17,4093,175],{}," 不拥有对象，常用于解决循环引用。",[105,4096,4097],{},"智能指针最重要的不是\"自动 delete\"，而是把所有权关系写清楚。",[4099,4100,4101],"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":4103},[4104,4105,4106,4107,4114,4115,4116,4117],{"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":4108},[4109,4110,4111,4112,4113],{"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":3287,"depth":230,"text":3288},{"id":3893,"depth":222,"text":3893},{"id":3998,"depth":222,"text":3998},{"id":4038,"depth":222,"text":4038},{"id":4074,"depth":222,"text":4074},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","2000-0900","2023-10-05","wiki\u002F2023-10-05-cplusplus-jiao-xue","zh-cn:2023-10-05-cplusplus-jiao-xue","\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针",false,null,"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","zh-CN","zh-cn",{},{"title":5,"description":204},"f4YoENg8LYjFRehCIlfU8Itvge3KidOKrh8arUz807o",[4136,4142,4147,4152,4157,4162,4167,4172,4177,4182,4187,4192,4197,4202,4207,4212,4217,4222,4227,4232,4237,4242,4247,4252,4257,4262,4267,4272,4277,4282,4287,4292,4297,4302,4307,4312,4317,4322,4326,4331,4336,4341,4346,4351,4356,4361,4362,4367,4372,4377,4382,4387,4392,4397,4402,4407,4412,4417,4422,4427,4432,4437,4442,4447,4452,4457,4462,4467,4472,4477,4482,4487,4492,4497,4502,4507,4512,4517,4522,4527,4532,4537],{"path":4137,"stem":4138,"title":4139,"date":4120,"chapterOrder":4140,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++开发环境搭建与测试","0100",0,{"path":4143,"stem":4144,"title":4145,"date":4120,"chapterOrder":4146,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++基础初识","0200",{"path":4148,"stem":4149,"title":4150,"date":4120,"chapterOrder":4151,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","wiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","数据类型与数据存放","0300",{"path":4153,"stem":4154,"title":4155,"date":4120,"chapterOrder":4156,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","输入输出","0400",{"path":4158,"stem":4159,"title":4160,"date":4120,"chapterOrder":4161,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","wiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","运算符","0500",{"path":4163,"stem":4164,"title":4165,"date":4120,"chapterOrder":4166,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","wiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","程序流程结构","0600",{"path":4168,"stem":4169,"title":4170,"date":4120,"chapterOrder":4171,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","wiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","数组","0700",{"path":4173,"stem":4174,"title":4175,"date":4120,"chapterOrder":4176,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","函数与头文件","0800",{"path":4178,"stem":4179,"title":4180,"date":4120,"chapterOrder":4181,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","指针","0900",{"path":4183,"stem":4184,"title":4185,"date":4120,"chapterOrder":4186,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","结构体与共用体","1000",{"path":4188,"stem":4189,"title":4190,"date":4120,"chapterOrder":4191,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","内存分区与生命周期","1100",{"path":4193,"stem":4194,"title":4195,"date":4120,"chapterOrder":4196,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","wiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","引用","1200",{"path":4198,"stem":4199,"title":4200,"date":4120,"chapterOrder":4201,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao-yu-ming-ming-kong-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高与命名空间","函数提高与命名空间","1300",{"path":4203,"stem":4204,"title":4205,"date":4120,"chapterOrder":4206,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","封装","1400-0100",{"path":4208,"stem":4209,"title":4210,"date":4120,"chapterOrder":4211,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","对象初始化和清理","1400-0200",{"path":4213,"stem":4214,"title":4215,"date":4120,"chapterOrder":4216,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","对象模型与this指针","1400-0300",{"path":4218,"stem":4219,"title":4220,"date":4120,"chapterOrder":4221,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","友元与运算符重载","1400-0400",{"path":4223,"stem":4224,"title":4225,"date":4120,"chapterOrder":4226,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","继承","1400-0500",{"path":4228,"stem":4229,"title":4230,"date":4120,"chapterOrder":4231,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","多态","1400-0600",{"path":4233,"stem":4234,"title":4235,"date":4120,"chapterOrder":4236,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","类和对象","1400",{"path":4238,"stem":4239,"title":4240,"date":4120,"chapterOrder":4241,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","wiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","文件操作","1500",{"path":4243,"stem":4244,"title":4245,"date":4120,"chapterOrder":4246,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","wiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","异常处理","1600",{"path":4248,"stem":4249,"title":4250,"date":4120,"chapterOrder":4251,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","模板","1700",{"path":4253,"stem":4254,"title":4255,"date":4120,"chapterOrder":4256,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","STL初识","1800-0100",{"path":4258,"stem":4259,"title":4260,"date":4120,"chapterOrder":4261,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array","1800-0200",{"path":4263,"stem":4264,"title":4265,"date":4120,"chapterOrder":4266,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string容器","1800-0300",{"path":4268,"stem":4269,"title":4270,"date":4120,"chapterOrder":4271,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器","1800-0400",{"path":4273,"stem":4274,"title":4275,"date":4120,"chapterOrder":4276,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器","1800-0500",{"path":4278,"stem":4279,"title":4280,"date":4120,"chapterOrder":4281,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器","1800-0600",{"path":4283,"stem":4284,"title":4285,"date":4120,"chapterOrder":4286,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue 容器","1800-0700",{"path":4288,"stem":4289,"title":4290,"date":4120,"chapterOrder":4291,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器","1800-0800",{"path":4293,"stem":4294,"title":4295,"date":4120,"chapterOrder":4296,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器","1800-0900",{"path":4298,"stem":4299,"title":4300,"date":4120,"chapterOrder":4301,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器","1800-1000",{"path":4303,"stem":4304,"title":4305,"date":4120,"chapterOrder":4306,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","函数对象与谓词","1800-1100",{"path":4308,"stem":4309,"title":4310,"date":4120,"chapterOrder":4311,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","常用算法","1800-1200",{"path":4313,"stem":4314,"title":4315,"date":4120,"chapterOrder":4316,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","STL提高编程","1800",{"path":4318,"stem":4319,"title":4320,"date":4120,"chapterOrder":4321,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++类型转换","1900",{"path":4323,"stem":4324,"title":2274,"date":4120,"chapterOrder":4325,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","2000-0100",{"path":4327,"stem":4328,"title":4329,"date":4120,"chapterOrder":4330,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr","2000-0200",{"path":4332,"stem":4333,"title":4334,"date":4120,"chapterOrder":4335,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","using","2000-0300",{"path":4337,"stem":4338,"title":4339,"date":4120,"chapterOrder":4340,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class","2000-0400",{"path":4342,"stem":4343,"title":4344,"date":4120,"chapterOrder":4345,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","范围 for 循环","2000-0500",{"path":4347,"stem":4348,"title":4349,"date":4120,"chapterOrder":4350,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","结构化绑定","2000-0600",{"path":4352,"stem":4353,"title":4354,"date":4120,"chapterOrder":4355,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr","2000-0700",{"path":4357,"stem":4358,"title":4359,"date":4120,"chapterOrder":4360,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII","2000-0800",{"path":4118,"stem":4126,"title":5,"date":4120,"chapterOrder":4119,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},{"path":4363,"stem":4364,"title":4365,"date":4120,"chapterOrder":4366,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","右值引用和移动语义","2000-1000",{"path":4368,"stem":4369,"title":4370,"date":4120,"chapterOrder":4371,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda 表达式","2000-1100",{"path":4373,"stem":4374,"title":4375,"date":4120,"chapterOrder":4376,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function","2000-1200",{"path":4378,"stem":4379,"title":4380,"date":4120,"chapterOrder":4381,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind","2000-1300",{"path":4383,"stem":4384,"title":4385,"date":4120,"chapterOrder":4386,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional","2000-1400",{"path":4388,"stem":4389,"title":4390,"date":4120,"chapterOrder":4391,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant","2000-1500",{"path":4393,"stem":4394,"title":4395,"date":4120,"chapterOrder":4396,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span","2000-1600",{"path":4398,"stem":4399,"title":4400,"date":4120,"chapterOrder":4401,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print","2000-1700",{"path":4403,"stem":4404,"title":4405,"date":4120,"chapterOrder":4406,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono","2000-1800",{"path":4408,"stem":4409,"title":4410,"date":4120,"chapterOrder":4411,"chapterDepth":222,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread","std::thread 与 join","2000-1900-0100",{"path":4413,"stem":4414,"title":4415,"date":4120,"chapterOrder":4416,"chapterDepth":222,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-mutex-lock-guard","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-mutex-lock-guard","mutex 与 lock_guard","2000-1900-0200",{"path":4418,"stem":4419,"title":4420,"date":4120,"chapterOrder":4421,"chapterDepth":222,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-std-atomic","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-std-atomic","std::atomic","2000-1900-0300",{"path":4423,"stem":4424,"title":4425,"date":4120,"chapterOrder":4426,"chapterDepth":222,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0400-condition-variable","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0400-condition-variable","condition_variable","2000-1900-0400",{"path":4428,"stem":4429,"title":4430,"date":4120,"chapterOrder":4431,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发编程","并发编程","2000-1900",{"path":4433,"stem":4434,"title":4435,"date":4120,"chapterOrder":4436,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem","2000-2000",{"path":4438,"stem":4439,"title":4440,"date":4120,"chapterOrder":4441,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","modules 简介","2000-2100",{"path":4443,"stem":4444,"title":4445,"date":4120,"chapterOrder":4446,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","现代C++","2000",{"path":4448,"stem":4449,"title":4450,"date":4120,"chapterOrder":4451,"chapterDepth":222,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","定时器与异步 IO","2100-0100-0100",{"path":4453,"stem":4454,"title":4455,"date":4120,"chapterOrder":4456,"chapterDepth":222,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Boost.Asio 基础","2100-0100-0200",{"path":4458,"stem":4459,"title":4460,"date":4120,"chapterOrder":4461,"chapterDepth":222,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","串口通信","2100-0100-0300",{"path":4463,"stem":4464,"title":4465,"date":4120,"chapterOrder":4466,"chapterDepth":222,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP 通信","2100-0100-0400",{"path":4468,"stem":4469,"title":4470,"date":4120,"chapterOrder":4471,"chapterDepth":222,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP 通信","2100-0100-0500",{"path":4473,"stem":4474,"title":4475,"date":4120,"chapterOrder":4476,"chapterDepth":222,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","机器人工程写法与 ROS2 集成","2100-0100-0600",{"path":4478,"stem":4479,"title":4480,"date":4120,"chapterOrder":4481,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio异步IO库","2100-0100",{"path":4483,"stem":4484,"title":4485,"date":4120,"chapterOrder":4486,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen线性代数库","2100-0200",{"path":4488,"stem":4489,"title":4490,"date":4120,"chapterOrder":4491,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV计算机视觉库","2100-0300",{"path":4493,"stem":4494,"title":4495,"date":4120,"chapterOrder":4496,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL点云库","2100-0400",{"path":4498,"stem":4499,"title":4500,"date":4120,"chapterOrder":4501,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus 李群李代数库","2100-0500",{"path":4503,"stem":4504,"title":4505,"date":4120,"chapterOrder":4506,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","常用库学习","2100",{"path":4508,"stem":4509,"title":4510,"date":4120,"chapterOrder":4511,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets与构建安装","2200-0100",{"path":4513,"stem":4514,"title":4515,"date":4120,"chapterOrder":4516,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","顶层CMake与公共编译选项","2200-0200",{"path":4518,"stem":4519,"title":4520,"date":4120,"chapterOrder":4521,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","src与lib模块CMake详解","2200-0300",{"path":4523,"stem":4524,"title":4525,"date":4120,"chapterOrder":4526,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","第三方库依赖写法","2200-0400",{"path":4528,"stem":4529,"title":4530,"date":4120,"chapterOrder":4531,"chapterDepth":211,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","模板扩展与常见问题","2200-0500",{"path":4533,"stem":4534,"title":4535,"date":4120,"chapterOrder":4536,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":4127},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake工程模板","2200",{"path":4123,"stem":4538,"title":4539,"date":4120,"chapterOrder":4128,"chapterDepth":4141,"docKey":4122,"docRoot":4123,"docTitle":4124,"isWikiDoc":241,"isWikiIndex":241},"wiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++教程",{"variants":4541},[4542,4545,4548,4551,4554],{"path":4543,"localeSlug":4544,"i18nKey":4126},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","en-us",{"path":4546,"localeSlug":4547,"i18nKey":4126},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","zh-hant",{"path":4549,"localeSlug":4550,"i18nKey":4126},"\u002Fzh-hk\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","zh-hk",{"path":4552,"localeSlug":4553,"i18nKey":4126},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","zh-tw",{"path":4118,"localeSlug":4131,"i18nKey":4126},[4543,4129,4546,4129,4549,4129,4552,4129,4118,4129],1784646786707]