[{"data":1,"prerenderedAt":4544},["ShallowReactive",2],{"wiki-page-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen":3,"wiki-doc-items-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen":4123,"language-switcher-data-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen":4528,"wiki-i18n-paths-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen":4543},{"id":4,"title":5,"body":6,"canonicalPath":4105,"chapterDepth":210,"chapterOrder":4106,"date":4107,"description":203,"docI18nKey":4108,"docKey":4109,"docRoot":4110,"docTitle":4111,"extension":4112,"i18nKey":4113,"isBlogPost":4114,"isWikiDoc":240,"isWikiIndex":4114,"layout":4115,"legacyPath":4115,"locale":4116,"localeSlug":4117,"meta":4118,"navigation":240,"path":4105,"seo":4119,"sourcePath":4120,"sourceStem":4113,"stem":4121,"wikiDepth":210,"__hash__":4122},"content\u002F_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针.md","Smart pointer",{"type":7,"value":8,"toc":4089},"minimark",[9,14,22,25,91,94,98,128,135,139,178,182,187,197,842,849,857,867,871,876,1383,1387,1393,1397,1405,1865,1869,1875,1882,1886,1898,2335,2339,2345,2360,2364,2367,2373,2379,2402,2423,2426,2433,2440,2443,2446,2499,2513,2519,2533,2536,2551,2569,2572,2587,2599,2605,2608,2612,2626,2630,2633,2652,2668,2674,2687,2693,2702,2715,2719,2724,2755,2758,2772,2782,2789,2796,2799,2855,2858,2871,2879,2889,2907,2916,2933,2937,2946,3097,3111,3118,3153,3168,3171,3181,3196,3208,3221,3228,3231,3237,3248,3252,3255,3286,3844,3848,3854,3858,3959,3963,4001,4004,4021,4024,4058,4062,4085],[10,11,13],"h2",{"id":12},"what-problem-does-this-section-solve","What problem does this section solve?",[15,16,17,21],"p",{},[18,19,20],"code",{},"new\u002Fdelete"," allows manual management of dynamic memory, but it requires you to remember to release resources on all code paths. Once a function goes wrong early, throws an exception, or multiple objects hold pointers to each other, it becomes easy to encounter memory leaks, double-free errors, or dangling pointers.",[15,23,24],{},"Smart pointers encode \"who is responsible for releasing the object\" into the type:",[26,27,28,44],"table",{},[29,30,31],"thead",{},[32,33,34,38,41],"tr",{},[35,36,5],"th",{"align":37},"left",[35,39,40],{"align":37},"meaning of ownership",[35,42,43],{"align":37},"Typical scenarios",[45,46,47,61,74],"tbody",{},[32,48,49,55,58],{},[50,51,52],"td",{"align":37},[18,53,54],{},"std::unique_ptr\u003CT>",[50,56,57],{"align":37},"Sole ownership",[50,59,60],{"align":37},"Default selection, an object has only one owner.",[32,62,63,68,71],{},[50,64,65],{"align":37},[18,66,67],{},"std::shared_ptr\u003CT>",[50,69,70],{"align":37},"Shared ownership",[50,72,73],{"align":37},"Objects indeed require multiple owners to collectively extend their lifetime.",[32,75,76,81,84],{},[50,77,78],{"align":37},[18,79,80],{},"std::weak_ptr\u003CT>",[50,82,83],{"align":37},"weak references do not own",[50,85,86,87,90],{"align":37},"Observe the managed object of ",[18,88,89],{},"shared_ptr",", commonly used to break circular references.",[15,92,93],{},"Smart pointers are essentially RAII: when a smart pointer object goes out of scope, its destructor automatically releases the managed object.",[10,95,97],{"id":96},"c-standard-version","C++ standard version",[99,100,101,108,117,123],"ul",{},[102,103,104,107],"li",{},[18,105,106],{},"std::unique_ptr","：C++11",[102,109,110,113,114,107],{},[18,111,112],{},"std::shared_ptr"," \u002F ",[18,115,116],{},"std::weak_ptr",[102,118,119,122],{},[18,120,121],{},"std::make_unique","：C++14",[102,124,125,107],{},[18,126,127],{},"std::make_shared",[15,129,130,131,134],{},"The required header file is ",[18,132,133],{},"\u003Cmemory>",".",[10,136,138],{"id":137},"learning-sequence","Learning Sequence",[140,141,142,148,155,163,169,175],"ol",{},[102,143,144,145,147],{},"First, examine the manual ",[18,146,20],{}," for issues when returning early.",[102,149,150,151,154],{},"Use ",[18,152,153],{},"unique_ptr"," to solve single ownership and automatic release.",[102,156,150,157,160,161,134],{},[18,158,159],{},"std::move"," to transfer ownership of ",[18,162,153],{},[102,164,165,166,168],{},"Only use ",[18,167,89],{}," when there is indeed shared ownership.",[102,170,150,171,174],{},[18,172,173],{},"weak_ptr"," to observe objects and break circular references.",[102,176,177],{},"Function parameters must express true semantics: borrowing, transferring, and sharing are three different things.",[10,179,181],{"id":180},"example-code","Example code",[183,184,186],"h3",{"id":185},"example-1-issues-with-old-approaches-and-the-raii-principle-of-unique_ptr","Example 1: Issues with Old Approaches and the RAII Principle of unique_ptr",[15,188,189,190,193,194,196],{},"This example deliberately makes the function return early. In the old version, ",[18,191,192],{},"delete"," is not executed; in the ",[18,195,153],{}," version, even if the function returns early, the object will automatically destruct.",[198,199,204],"pre",{"className":200,"code":201,"language":202,"meta":203,"style":203},"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","",[18,205,206,219,227,235,242,252,259,268,273,279,319,325,355,361,366,375,380,402,407,412,427,432,454,459,465,470,481,486,514,526,531,549,565,571,576,586,591,622,631,636,654,666,671,676,687,692,706,711,726,754,759,777,782,796,822,827,837],{"__ignoreMap":203},[207,208,211,215],"span",{"class":209,"line":210},"line",1,[207,212,214],{"class":213},"szBVR","#include",[207,216,218],{"class":217},"sZZnC"," \u003Ciostream>\n",[207,220,222,224],{"class":209,"line":221},2,[207,223,214],{"class":213},[207,225,226],{"class":217}," \u003Cmemory>\n",[207,228,230,232],{"class":209,"line":229},3,[207,231,214],{"class":213},[207,233,234],{"class":217}," \u003Cstring>\n",[207,236,238],{"class":209,"line":237},4,[207,239,241],{"emptyLinePlaceholder":240},true,"\n",[207,243,245,248],{"class":209,"line":244},5,[207,246,247],{"class":213},"class",[207,249,251],{"class":250},"sScJk"," Resource\n",[207,253,255],{"class":209,"line":254},6,[207,256,258],{"class":257},"sVt8B","{\n",[207,260,262,265],{"class":209,"line":261},7,[207,263,264],{"class":250},"    std",[207,266,267],{"class":257},"::string name_;\n",[207,269,271],{"class":209,"line":270},8,[207,272,241],{"emptyLinePlaceholder":240},[207,274,276],{"class":209,"line":275},9,[207,277,278],{"class":213},"public:\n",[207,280,282,285,288,291,294,297,300,303,306,310,313,316],{"class":209,"line":281},10,[207,283,284],{"class":213},"    explicit",[207,286,287],{"class":250}," Resource",[207,289,290],{"class":257},"(",[207,292,293],{"class":213},"const",[207,295,296],{"class":250}," std",[207,298,299],{"class":257},"::",[207,301,302],{"class":250},"string",[207,304,305],{"class":213},"&",[207,307,309],{"class":308},"s4XuR"," name",[207,311,312],{"class":257},") : ",[207,314,315],{"class":250},"name_",[207,317,318],{"class":257},"(name)\n",[207,320,322],{"class":209,"line":321},11,[207,323,324],{"class":257},"    {\n",[207,326,328,331,334,337,340,342,345,349,352],{"class":209,"line":327},12,[207,329,330],{"class":250},"        std",[207,332,333],{"class":257},"::cout ",[207,335,336],{"class":213},"\u003C\u003C",[207,338,339],{"class":257}," name_ ",[207,341,336],{"class":213},[207,343,344],{"class":217}," \" created",[207,346,348],{"class":347},"sj4cs","\\n",[207,350,351],{"class":217},"\"",[207,353,354],{"class":257},";\n",[207,356,358],{"class":209,"line":357},13,[207,359,360],{"class":257},"    }\n",[207,362,364],{"class":209,"line":363},14,[207,365,241],{"emptyLinePlaceholder":240},[207,367,369,372],{"class":209,"line":368},15,[207,370,371],{"class":250},"    ~Resource",[207,373,374],{"class":257},"()\n",[207,376,378],{"class":209,"line":377},16,[207,379,324],{"class":257},[207,381,383,385,387,389,391,393,396,398,400],{"class":209,"line":382},17,[207,384,330],{"class":250},[207,386,333],{"class":257},[207,388,336],{"class":213},[207,390,339],{"class":257},[207,392,336],{"class":213},[207,394,395],{"class":217}," \" destroyed",[207,397,348],{"class":347},[207,399,351],{"class":217},[207,401,354],{"class":257},[207,403,405],{"class":209,"line":404},18,[207,406,360],{"class":257},[207,408,410],{"class":209,"line":409},19,[207,411,241],{"emptyLinePlaceholder":240},[207,413,415,418,421,424],{"class":209,"line":414},20,[207,416,417],{"class":213},"    void",[207,419,420],{"class":250}," use",[207,422,423],{"class":257},"() ",[207,425,426],{"class":213},"const\n",[207,428,430],{"class":209,"line":429},21,[207,431,324],{"class":257},[207,433,435,437,439,441,443,445,448,450,452],{"class":209,"line":434},22,[207,436,330],{"class":250},[207,438,333],{"class":257},[207,440,336],{"class":213},[207,442,339],{"class":257},[207,444,336],{"class":213},[207,446,447],{"class":217}," \" used",[207,449,348],{"class":347},[207,451,351],{"class":217},[207,453,354],{"class":257},[207,455,457],{"class":209,"line":456},23,[207,458,360],{"class":257},[207,460,462],{"class":209,"line":461},24,[207,463,464],{"class":257},"};\n",[207,466,468],{"class":209,"line":467},25,[207,469,241],{"emptyLinePlaceholder":240},[207,471,473,476,479],{"class":209,"line":472},26,[207,474,475],{"class":213},"bool",[207,477,478],{"class":250}," old_style",[207,480,374],{"class":257},[207,482,484],{"class":209,"line":483},27,[207,485,258],{"class":257},[207,487,489,492,495,498,501,504,506,508,511],{"class":209,"line":488},28,[207,490,491],{"class":257},"    Resource",[207,493,494],{"class":213},"*",[207,496,497],{"class":257}," res ",[207,499,500],{"class":213},"=",[207,502,503],{"class":213}," new",[207,505,287],{"class":250},[207,507,290],{"class":257},[207,509,510],{"class":217},"\"old resource\"",[207,512,513],{"class":257},");\n",[207,515,517,520,523],{"class":209,"line":516},29,[207,518,519],{"class":257},"    res->",[207,521,522],{"class":250},"use",[207,524,525],{"class":257},"();\n",[207,527,529],{"class":209,"line":528},30,[207,530,241],{"emptyLinePlaceholder":240},[207,532,534,536,538,540,543,545,547],{"class":209,"line":533},31,[207,535,264],{"class":250},[207,537,333],{"class":257},[207,539,336],{"class":213},[207,541,542],{"class":217}," \"old_style: early return",[207,544,348],{"class":347},[207,546,351],{"class":217},[207,548,354],{"class":257},[207,550,552,555,558,561],{"class":209,"line":551},32,[207,553,554],{"class":213},"    return",[207,556,557],{"class":347}," false",[207,559,560],{"class":257},";",[207,562,564],{"class":563},"sJ8bj"," \u002F\u002F res 没有 delete，析构函数不会执行\n",[207,566,568],{"class":209,"line":567},33,[207,569,570],{"class":257},"}\n",[207,572,574],{"class":209,"line":573},34,[207,575,241],{"emptyLinePlaceholder":240},[207,577,579,581,584],{"class":209,"line":578},35,[207,580,475],{"class":213},[207,582,583],{"class":250}," modern_style",[207,585,374],{"class":257},[207,587,589],{"class":209,"line":588},36,[207,590,258],{"class":257},[207,592,594,597,599,601,603,605,608,611,614,617,620],{"class":209,"line":593},37,[207,595,596],{"class":213},"    auto",[207,598,497],{"class":257},[207,600,500],{"class":213},[207,602,296],{"class":250},[207,604,299],{"class":257},[207,606,607],{"class":250},"make_unique",[207,609,610],{"class":257},"\u003C",[207,612,613],{"class":250},"Resource",[207,615,616],{"class":257},">(",[207,618,619],{"class":217},"\"modern resource\"",[207,621,513],{"class":257},[207,623,625,627,629],{"class":209,"line":624},38,[207,626,519],{"class":257},[207,628,522],{"class":250},[207,630,525],{"class":257},[207,632,634],{"class":209,"line":633},39,[207,635,241],{"emptyLinePlaceholder":240},[207,637,639,641,643,645,648,650,652],{"class":209,"line":638},40,[207,640,264],{"class":250},[207,642,333],{"class":257},[207,644,336],{"class":213},[207,646,647],{"class":217}," \"modern_style: early return",[207,649,348],{"class":347},[207,651,351],{"class":217},[207,653,354],{"class":257},[207,655,657,659,661,663],{"class":209,"line":656},41,[207,658,554],{"class":213},[207,660,557],{"class":347},[207,662,560],{"class":257},[207,664,665],{"class":563}," \u002F\u002F res 离开作用域，自动 delete\n",[207,667,669],{"class":209,"line":668},42,[207,670,570],{"class":257},[207,672,674],{"class":209,"line":673},43,[207,675,241],{"emptyLinePlaceholder":240},[207,677,679,682,685],{"class":209,"line":678},44,[207,680,681],{"class":213},"int",[207,683,684],{"class":250}," main",[207,686,374],{"class":257},[207,688,690],{"class":209,"line":689},45,[207,691,258],{"class":257},[207,693,695,697,699,701,703],{"class":209,"line":694},46,[207,696,264],{"class":250},[207,698,333],{"class":257},[207,700,336],{"class":213},[207,702,296],{"class":250},[207,704,705],{"class":257},"::boolalpha;\n",[207,707,709],{"class":209,"line":708},47,[207,710,241],{"emptyLinePlaceholder":240},[207,712,714,717,720,722,724],{"class":209,"line":713},48,[207,715,716],{"class":213},"    bool",[207,718,719],{"class":257}," old_ok ",[207,721,500],{"class":213},[207,723,478],{"class":250},[207,725,525],{"class":257},[207,727,729,731,733,735,738,741,743,745,748,750,752],{"class":209,"line":728},49,[207,730,264],{"class":250},[207,732,333],{"class":257},[207,734,336],{"class":213},[207,736,737],{"class":217}," \"old_ok = \"",[207,739,740],{"class":213}," \u003C\u003C",[207,742,719],{"class":257},[207,744,336],{"class":213},[207,746,747],{"class":217}," \"",[207,749,348],{"class":347},[207,751,351],{"class":217},[207,753,354],{"class":257},[207,755,757],{"class":209,"line":756},50,[207,758,241],{"emptyLinePlaceholder":240},[207,760,762,764,766,768,771,773,775],{"class":209,"line":761},51,[207,763,264],{"class":250},[207,765,333],{"class":257},[207,767,336],{"class":213},[207,769,770],{"class":217}," \"---",[207,772,348],{"class":347},[207,774,351],{"class":217},[207,776,354],{"class":257},[207,778,780],{"class":209,"line":779},52,[207,781,241],{"emptyLinePlaceholder":240},[207,783,785,787,790,792,794],{"class":209,"line":784},53,[207,786,716],{"class":213},[207,788,789],{"class":257}," modern_ok ",[207,791,500],{"class":213},[207,793,583],{"class":250},[207,795,525],{"class":257},[207,797,799,801,803,805,808,810,812,814,816,818,820],{"class":209,"line":798},54,[207,800,264],{"class":250},[207,802,333],{"class":257},[207,804,336],{"class":213},[207,806,807],{"class":217}," \"modern_ok = \"",[207,809,740],{"class":213},[207,811,789],{"class":257},[207,813,336],{"class":213},[207,815,747],{"class":217},[207,817,348],{"class":347},[207,819,351],{"class":217},[207,821,354],{"class":257},[207,823,825],{"class":209,"line":824},55,[207,826,241],{"emptyLinePlaceholder":240},[207,828,830,832,835],{"class":209,"line":829},56,[207,831,554],{"class":213},[207,833,834],{"class":347}," 0",[207,836,354],{"class":257},[207,838,840],{"class":209,"line":839},57,[207,841,570],{"class":257},[15,843,844,848],{},[845,846,847],"strong",{},"Results","：",[198,850,855],{"className":851,"code":853,"language":854,"meta":203},[852],"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",[18,856,853],{"__ignoreMap":203},[15,858,859,860,863,864,866],{},"Note that in the first paragraph output, there is no ",[18,861,862],{},"old resource destroyed",", and this is the most common error that occurs with manual ",[18,865,20],{}," under complex paths.",[183,868,870],{"id":869},"example-2-unique_ptrs-exclusive-ownership-and-transfer","Example 2: unique_ptr's exclusive ownership and transfer",[15,872,873,875],{},[18,874,153],{}," cannot be copied, only moved. After being moved, the original pointer becomes a null pointer.",[198,877,879],{"className":200,"code":878,"language":202,"meta":203,"style":203},"#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",[18,880,881,887,893,899,906,910,917,921,927,931,935,962,966,991,995,999,1006,1010,1034,1038,1042,1061,1065,1073,1077,1081,1085,1090,1121,1125,1156,1160,1164,1172,1176,1181,1207,1211,1230,1277,1307,1311,1327,1367,1371,1379],{"__ignoreMap":203},[207,882,883,885],{"class":209,"line":210},[207,884,214],{"class":213},[207,886,218],{"class":217},[207,888,889,891],{"class":209,"line":221},[207,890,214],{"class":213},[207,892,226],{"class":217},[207,894,895,897],{"class":209,"line":229},[207,896,214],{"class":213},[207,898,234],{"class":217},[207,900,901,903],{"class":209,"line":237},[207,902,214],{"class":213},[207,904,905],{"class":217}," \u003Cutility>\n",[207,907,908],{"class":209,"line":244},[207,909,241],{"emptyLinePlaceholder":240},[207,911,912,914],{"class":209,"line":254},[207,913,247],{"class":213},[207,915,916],{"class":250}," Student\n",[207,918,919],{"class":209,"line":261},[207,920,258],{"class":257},[207,922,923,925],{"class":209,"line":270},[207,924,264],{"class":250},[207,926,267],{"class":257},[207,928,929],{"class":209,"line":275},[207,930,241],{"emptyLinePlaceholder":240},[207,932,933],{"class":209,"line":281},[207,934,278],{"class":213},[207,936,937,939,942,944,946,948,950,952,954,956,958,960],{"class":209,"line":321},[207,938,284],{"class":213},[207,940,941],{"class":250}," Student",[207,943,290],{"class":257},[207,945,293],{"class":213},[207,947,296],{"class":250},[207,949,299],{"class":257},[207,951,302],{"class":250},[207,953,305],{"class":213},[207,955,309],{"class":308},[207,957,312],{"class":257},[207,959,315],{"class":250},[207,961,318],{"class":257},[207,963,964],{"class":209,"line":327},[207,965,324],{"class":257},[207,967,968,970,972,974,977,979,981,983,985,987,989],{"class":209,"line":357},[207,969,330],{"class":250},[207,971,333],{"class":257},[207,973,336],{"class":213},[207,975,976],{"class":217}," \"Student \"",[207,978,740],{"class":213},[207,980,339],{"class":257},[207,982,336],{"class":213},[207,984,344],{"class":217},[207,986,348],{"class":347},[207,988,351],{"class":217},[207,990,354],{"class":257},[207,992,993],{"class":209,"line":363},[207,994,360],{"class":257},[207,996,997],{"class":209,"line":368},[207,998,241],{"emptyLinePlaceholder":240},[207,1000,1001,1004],{"class":209,"line":377},[207,1002,1003],{"class":250},"    ~Student",[207,1005,374],{"class":257},[207,1007,1008],{"class":209,"line":382},[207,1009,324],{"class":257},[207,1011,1012,1014,1016,1018,1020,1022,1024,1026,1028,1030,1032],{"class":209,"line":404},[207,1013,330],{"class":250},[207,1015,333],{"class":257},[207,1017,336],{"class":213},[207,1019,976],{"class":217},[207,1021,740],{"class":213},[207,1023,339],{"class":257},[207,1025,336],{"class":213},[207,1027,395],{"class":217},[207,1029,348],{"class":347},[207,1031,351],{"class":217},[207,1033,354],{"class":257},[207,1035,1036],{"class":209,"line":409},[207,1037,360],{"class":257},[207,1039,1040],{"class":209,"line":414},[207,1041,241],{"emptyLinePlaceholder":240},[207,1043,1044,1047,1049,1051,1053,1055,1057,1059],{"class":209,"line":429},[207,1045,1046],{"class":213},"    const",[207,1048,296],{"class":250},[207,1050,299],{"class":257},[207,1052,302],{"class":250},[207,1054,305],{"class":213},[207,1056,309],{"class":250},[207,1058,423],{"class":257},[207,1060,426],{"class":213},[207,1062,1063],{"class":209,"line":434},[207,1064,324],{"class":257},[207,1066,1067,1070],{"class":209,"line":456},[207,1068,1069],{"class":213},"        return",[207,1071,1072],{"class":257}," name_;\n",[207,1074,1075],{"class":209,"line":461},[207,1076,360],{"class":257},[207,1078,1079],{"class":209,"line":467},[207,1080,464],{"class":257},[207,1082,1083],{"class":209,"line":472},[207,1084,241],{"emptyLinePlaceholder":240},[207,1086,1087],{"class":209,"line":483},[207,1088,1089],{"class":563},"\u002F\u002F 智能指针负责管理对象生命周期，减少手动释放资源的风险。\n",[207,1091,1092,1095,1098,1100,1103,1105,1107,1109,1112,1115,1118],{"class":209,"line":488},[207,1093,1094],{"class":213},"void",[207,1096,1097],{"class":250}," take_ownership",[207,1099,290],{"class":257},[207,1101,1102],{"class":250},"std",[207,1104,299],{"class":257},[207,1106,153],{"class":250},[207,1108,610],{"class":257},[207,1110,1111],{"class":250},"Student",[207,1113,1114],{"class":257},"> ",[207,1116,1117],{"class":308},"student",[207,1119,1120],{"class":257},")\n",[207,1122,1123],{"class":209,"line":516},[207,1124,258],{"class":257},[207,1126,1127,1129,1131,1133,1136,1138,1141,1144,1146,1148,1150,1152,1154],{"class":209,"line":528},[207,1128,264],{"class":250},[207,1130,333],{"class":257},[207,1132,336],{"class":213},[207,1134,1135],{"class":217}," \"take ownership of \"",[207,1137,740],{"class":213},[207,1139,1140],{"class":257}," student->",[207,1142,1143],{"class":250},"name",[207,1145,423],{"class":257},[207,1147,336],{"class":213},[207,1149,747],{"class":217},[207,1151,348],{"class":347},[207,1153,351],{"class":217},[207,1155,354],{"class":257},[207,1157,1158],{"class":209,"line":533},[207,1159,570],{"class":257},[207,1161,1162],{"class":209,"line":551},[207,1163,241],{"emptyLinePlaceholder":240},[207,1165,1166,1168,1170],{"class":209,"line":567},[207,1167,681],{"class":213},[207,1169,684],{"class":250},[207,1171,374],{"class":257},[207,1173,1174],{"class":209,"line":573},[207,1175,258],{"class":257},[207,1177,1178],{"class":209,"line":578},[207,1179,1180],{"class":563},"    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n",[207,1182,1183,1185,1188,1190,1192,1194,1196,1198,1200,1202,1205],{"class":209,"line":588},[207,1184,596],{"class":213},[207,1186,1187],{"class":257}," p ",[207,1189,500],{"class":213},[207,1191,296],{"class":250},[207,1193,299],{"class":257},[207,1195,607],{"class":250},[207,1197,610],{"class":257},[207,1199,1111],{"class":250},[207,1201,616],{"class":257},[207,1203,1204],{"class":217},"\"Alice\"",[207,1206,513],{"class":257},[207,1208,1209],{"class":209,"line":593},[207,1210,241],{"emptyLinePlaceholder":240},[207,1212,1213,1215,1218,1220,1222,1224,1227],{"class":209,"line":624},[207,1214,596],{"class":213},[207,1216,1217],{"class":257}," owner ",[207,1219,500],{"class":213},[207,1221,296],{"class":250},[207,1223,299],{"class":257},[207,1225,1226],{"class":250},"move",[207,1228,1229],{"class":257},"(p);\n",[207,1231,1232,1234,1236,1238,1241,1243,1246,1249,1252,1255,1258,1261,1264,1267,1269,1271,1273,1275],{"class":209,"line":633},[207,1233,264],{"class":250},[207,1235,333],{"class":257},[207,1237,336],{"class":213},[207,1239,1240],{"class":217}," \"p is null? \"",[207,1242,740],{"class":213},[207,1244,1245],{"class":257}," (p ",[207,1247,1248],{"class":213},"==",[207,1250,1251],{"class":347}," nullptr",[207,1253,1254],{"class":213}," ?",[207,1256,1257],{"class":217}," \"yes\"",[207,1259,1260],{"class":213}," :",[207,1262,1263],{"class":217}," \"no\"",[207,1265,1266],{"class":257},") ",[207,1268,336],{"class":213},[207,1270,747],{"class":217},[207,1272,348],{"class":347},[207,1274,351],{"class":217},[207,1276,354],{"class":257},[207,1278,1279,1281,1283,1285,1288,1290,1293,1295,1297,1299,1301,1303,1305],{"class":209,"line":638},[207,1280,264],{"class":250},[207,1282,333],{"class":257},[207,1284,336],{"class":213},[207,1286,1287],{"class":217}," \"owner has \"",[207,1289,740],{"class":213},[207,1291,1292],{"class":257}," owner->",[207,1294,1143],{"class":250},[207,1296,423],{"class":257},[207,1298,336],{"class":213},[207,1300,747],{"class":217},[207,1302,348],{"class":347},[207,1304,351],{"class":217},[207,1306,354],{"class":257},[207,1308,1309],{"class":209,"line":656},[207,1310,241],{"emptyLinePlaceholder":240},[207,1312,1313,1316,1318,1320,1322,1324],{"class":209,"line":668},[207,1314,1315],{"class":250},"    take_ownership",[207,1317,290],{"class":257},[207,1319,1102],{"class":250},[207,1321,299],{"class":257},[207,1323,1226],{"class":250},[207,1325,1326],{"class":257},"(owner));\n",[207,1328,1329,1331,1333,1335,1338,1340,1343,1345,1347,1349,1351,1353,1355,1357,1359,1361,1363,1365],{"class":209,"line":673},[207,1330,264],{"class":250},[207,1332,333],{"class":257},[207,1334,336],{"class":213},[207,1336,1337],{"class":217}," \"owner is null? \"",[207,1339,740],{"class":213},[207,1341,1342],{"class":257}," (owner ",[207,1344,1248],{"class":213},[207,1346,1251],{"class":347},[207,1348,1254],{"class":213},[207,1350,1257],{"class":217},[207,1352,1260],{"class":213},[207,1354,1263],{"class":217},[207,1356,1266],{"class":257},[207,1358,336],{"class":213},[207,1360,747],{"class":217},[207,1362,348],{"class":347},[207,1364,351],{"class":217},[207,1366,354],{"class":257},[207,1368,1369],{"class":209,"line":678},[207,1370,241],{"emptyLinePlaceholder":240},[207,1372,1373,1375,1377],{"class":209,"line":689},[207,1374,554],{"class":213},[207,1376,834],{"class":347},[207,1378,354],{"class":257},[207,1380,1381],{"class":209,"line":694},[207,1382,570],{"class":257},[15,1384,1385,848],{},[845,1386,847],{},[198,1388,1391],{"className":1389,"code":1390,"language":854,"meta":203},[852],"Student Alice created\np is null? yes\nowner has Alice\ntake ownership of Alice\nStudent Alice destroyed\nowner is null? yes\n",[18,1392,1390],{"__ignoreMap":203},[183,1394,1396],{"id":1395},"example-3-shared-ownership-with-shared_ptr","Example 3: Shared Ownership with shared_ptr",[15,1398,1399,1401,1402,1404],{},[18,1400,89],{}," manages objects using reference counting. The object is released only after the last ",[18,1403,89],{}," is destroyed or reassigned.",[198,1406,1408],{"className":200,"code":1407,"language":202,"meta":203,"style":203},"#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",[18,1409,1410,1416,1422,1428,1432,1439,1443,1449,1453,1457,1484,1488,1514,1518,1522,1529,1533,1558,1562,1566,1577,1581,1606,1610,1614,1618,1626,1630,1634,1639,1667,1698,1702,1706,1719,1748,1758,1762,1766,1795,1799,1809,1849,1853,1861],{"__ignoreMap":203},[207,1411,1412,1414],{"class":209,"line":210},[207,1413,214],{"class":213},[207,1415,218],{"class":217},[207,1417,1418,1420],{"class":209,"line":221},[207,1419,214],{"class":213},[207,1421,226],{"class":217},[207,1423,1424,1426],{"class":209,"line":229},[207,1425,214],{"class":213},[207,1427,234],{"class":217},[207,1429,1430],{"class":209,"line":237},[207,1431,241],{"emptyLinePlaceholder":240},[207,1433,1434,1436],{"class":209,"line":244},[207,1435,247],{"class":213},[207,1437,1438],{"class":250}," File\n",[207,1440,1441],{"class":209,"line":254},[207,1442,258],{"class":257},[207,1444,1445,1447],{"class":209,"line":261},[207,1446,264],{"class":250},[207,1448,267],{"class":257},[207,1450,1451],{"class":209,"line":270},[207,1452,241],{"emptyLinePlaceholder":240},[207,1454,1455],{"class":209,"line":275},[207,1456,278],{"class":213},[207,1458,1459,1461,1464,1466,1468,1470,1472,1474,1476,1478,1480,1482],{"class":209,"line":281},[207,1460,284],{"class":213},[207,1462,1463],{"class":250}," File",[207,1465,290],{"class":257},[207,1467,293],{"class":213},[207,1469,296],{"class":250},[207,1471,299],{"class":257},[207,1473,302],{"class":250},[207,1475,305],{"class":213},[207,1477,309],{"class":308},[207,1479,312],{"class":257},[207,1481,315],{"class":250},[207,1483,318],{"class":257},[207,1485,1486],{"class":209,"line":321},[207,1487,324],{"class":257},[207,1489,1490,1492,1494,1496,1499,1501,1503,1505,1508,1510,1512],{"class":209,"line":327},[207,1491,330],{"class":250},[207,1493,333],{"class":257},[207,1495,336],{"class":213},[207,1497,1498],{"class":217}," \"File \"",[207,1500,740],{"class":213},[207,1502,339],{"class":257},[207,1504,336],{"class":213},[207,1506,1507],{"class":217}," \" opened",[207,1509,348],{"class":347},[207,1511,351],{"class":217},[207,1513,354],{"class":257},[207,1515,1516],{"class":209,"line":357},[207,1517,360],{"class":257},[207,1519,1520],{"class":209,"line":363},[207,1521,241],{"emptyLinePlaceholder":240},[207,1523,1524,1527],{"class":209,"line":368},[207,1525,1526],{"class":250},"    ~File",[207,1528,374],{"class":257},[207,1530,1531],{"class":209,"line":377},[207,1532,324],{"class":257},[207,1534,1535,1537,1539,1541,1543,1545,1547,1549,1552,1554,1556],{"class":209,"line":382},[207,1536,330],{"class":250},[207,1538,333],{"class":257},[207,1540,336],{"class":213},[207,1542,1498],{"class":217},[207,1544,740],{"class":213},[207,1546,339],{"class":257},[207,1548,336],{"class":213},[207,1550,1551],{"class":217}," \" closed",[207,1553,348],{"class":347},[207,1555,351],{"class":217},[207,1557,354],{"class":257},[207,1559,1560],{"class":209,"line":404},[207,1561,360],{"class":257},[207,1563,1564],{"class":209,"line":409},[207,1565,241],{"emptyLinePlaceholder":240},[207,1567,1568,1570,1573,1575],{"class":209,"line":414},[207,1569,417],{"class":213},[207,1571,1572],{"class":250}," read",[207,1574,423],{"class":257},[207,1576,426],{"class":213},[207,1578,1579],{"class":209,"line":429},[207,1580,324],{"class":257},[207,1582,1583,1585,1587,1589,1592,1594,1596,1598,1600,1602,1604],{"class":209,"line":434},[207,1584,330],{"class":250},[207,1586,333],{"class":257},[207,1588,336],{"class":213},[207,1590,1591],{"class":217}," \"read from \"",[207,1593,740],{"class":213},[207,1595,339],{"class":257},[207,1597,336],{"class":213},[207,1599,747],{"class":217},[207,1601,348],{"class":347},[207,1603,351],{"class":217},[207,1605,354],{"class":257},[207,1607,1608],{"class":209,"line":456},[207,1609,360],{"class":257},[207,1611,1612],{"class":209,"line":461},[207,1613,464],{"class":257},[207,1615,1616],{"class":209,"line":467},[207,1617,241],{"emptyLinePlaceholder":240},[207,1619,1620,1622,1624],{"class":209,"line":472},[207,1621,681],{"class":213},[207,1623,684],{"class":250},[207,1625,374],{"class":257},[207,1627,1628],{"class":209,"line":483},[207,1629,258],{"class":257},[207,1631,1632],{"class":209,"line":488},[207,1633,1180],{"class":563},[207,1635,1636],{"class":209,"line":516},[207,1637,1638],{"class":563},"    \u002F\u002F 智能指针负责管理对象生命周期，减少手动释放资源的风险。\n",[207,1640,1641,1643,1646,1648,1650,1652,1655,1657,1660,1662,1665],{"class":209,"line":528},[207,1642,596],{"class":213},[207,1644,1645],{"class":257}," file1 ",[207,1647,500],{"class":213},[207,1649,296],{"class":250},[207,1651,299],{"class":257},[207,1653,1654],{"class":250},"make_shared",[207,1656,610],{"class":257},[207,1658,1659],{"class":250},"File",[207,1661,616],{"class":257},[207,1663,1664],{"class":217},"\"log.txt\"",[207,1666,513],{"class":257},[207,1668,1669,1671,1673,1675,1678,1680,1683,1686,1688,1690,1692,1694,1696],{"class":209,"line":533},[207,1670,264],{"class":250},[207,1672,333],{"class":257},[207,1674,336],{"class":213},[207,1676,1677],{"class":217}," \"count after create = \"",[207,1679,740],{"class":213},[207,1681,1682],{"class":257}," file1.",[207,1684,1685],{"class":250},"use_count",[207,1687,423],{"class":257},[207,1689,336],{"class":213},[207,1691,747],{"class":217},[207,1693,348],{"class":347},[207,1695,351],{"class":217},[207,1697,354],{"class":257},[207,1699,1700],{"class":209,"line":551},[207,1701,241],{"emptyLinePlaceholder":240},[207,1703,1704],{"class":209,"line":567},[207,1705,324],{"class":257},[207,1707,1708,1711,1714,1716],{"class":209,"line":573},[207,1709,1710],{"class":213},"        auto",[207,1712,1713],{"class":257}," file2 ",[207,1715,500],{"class":213},[207,1717,1718],{"class":257}," file1;\n",[207,1720,1721,1723,1725,1727,1730,1732,1734,1736,1738,1740,1742,1744,1746],{"class":209,"line":578},[207,1722,330],{"class":250},[207,1724,333],{"class":257},[207,1726,336],{"class":213},[207,1728,1729],{"class":217}," \"count in scope = \"",[207,1731,740],{"class":213},[207,1733,1682],{"class":257},[207,1735,1685],{"class":250},[207,1737,423],{"class":257},[207,1739,336],{"class":213},[207,1741,747],{"class":217},[207,1743,348],{"class":347},[207,1745,351],{"class":217},[207,1747,354],{"class":257},[207,1749,1750,1753,1756],{"class":209,"line":588},[207,1751,1752],{"class":257},"        file2->",[207,1754,1755],{"class":250},"read",[207,1757,525],{"class":257},[207,1759,1760],{"class":209,"line":593},[207,1761,360],{"class":257},[207,1763,1764],{"class":209,"line":624},[207,1765,241],{"emptyLinePlaceholder":240},[207,1767,1768,1770,1772,1774,1777,1779,1781,1783,1785,1787,1789,1791,1793],{"class":209,"line":633},[207,1769,264],{"class":250},[207,1771,333],{"class":257},[207,1773,336],{"class":213},[207,1775,1776],{"class":217}," \"count after scope = \"",[207,1778,740],{"class":213},[207,1780,1682],{"class":257},[207,1782,1685],{"class":250},[207,1784,423],{"class":257},[207,1786,336],{"class":213},[207,1788,747],{"class":217},[207,1790,348],{"class":347},[207,1792,351],{"class":217},[207,1794,354],{"class":257},[207,1796,1797],{"class":209,"line":638},[207,1798,241],{"emptyLinePlaceholder":240},[207,1800,1801,1804,1807],{"class":209,"line":656},[207,1802,1803],{"class":257},"    file1.",[207,1805,1806],{"class":250},"reset",[207,1808,525],{"class":257},[207,1810,1811,1813,1815,1817,1820,1822,1825,1827,1829,1831,1833,1835,1837,1839,1841,1843,1845,1847],{"class":209,"line":668},[207,1812,264],{"class":250},[207,1814,333],{"class":257},[207,1816,336],{"class":213},[207,1818,1819],{"class":217}," \"file1 is empty? \"",[207,1821,740],{"class":213},[207,1823,1824],{"class":257}," (file1 ",[207,1826,1248],{"class":213},[207,1828,1251],{"class":347},[207,1830,1254],{"class":213},[207,1832,1257],{"class":217},[207,1834,1260],{"class":213},[207,1836,1263],{"class":217},[207,1838,1266],{"class":257},[207,1840,336],{"class":213},[207,1842,747],{"class":217},[207,1844,348],{"class":347},[207,1846,351],{"class":217},[207,1848,354],{"class":257},[207,1850,1851],{"class":209,"line":673},[207,1852,241],{"emptyLinePlaceholder":240},[207,1854,1855,1857,1859],{"class":209,"line":678},[207,1856,554],{"class":213},[207,1858,834],{"class":347},[207,1860,354],{"class":257},[207,1862,1863],{"class":209,"line":689},[207,1864,570],{"class":257},[15,1866,1867,848],{},[845,1868,847],{},[198,1870,1873],{"className":1871,"code":1872,"language":854,"meta":203},[852],"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",[18,1874,1872],{"__ignoreMap":203},[15,1876,1877,1879,1880,134],{},[18,1878,89],{}," is very convenient, but not \"a safer default pointer\". It has reference counting overhead and will also complicate ownership relationships. By default, prioritize ",[18,1881,153],{},[183,1883,1885],{"id":1884},"example-4-using-weak_ptr-to-break-circular-references-of-shared_ptr","Example 4: Using weak_ptr to break circular references of shared_ptr",[15,1887,1888,1889,1891,1892,1894,1895,1897],{},"If two objects reference each other using ",[18,1890,89],{},", their reference counts may never reach zero. A common practice is to use ",[18,1893,89],{}," for the primary direction and ",[18,1896,173],{}," for the reverse observation relationship.",[198,1899,1901],{"className":200,"code":1900,"language":202,"meta":203,"style":203},"#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",[18,1902,1903,1909,1915,1921,1925,1932,1936,1940,1947,1965,1981,1985,2014,2018,2044,2048,2052,2059,2063,2087,2091,2095,2099,2107,2111,2137,2163,2167,2180,2193,2197,2227,2257,2261,2285,2289,2315,2319,2323,2331],{"__ignoreMap":203},[207,1904,1905,1907],{"class":209,"line":210},[207,1906,214],{"class":213},[207,1908,218],{"class":217},[207,1910,1911,1913],{"class":209,"line":221},[207,1912,214],{"class":213},[207,1914,226],{"class":217},[207,1916,1917,1919],{"class":209,"line":229},[207,1918,214],{"class":213},[207,1920,234],{"class":217},[207,1922,1923],{"class":209,"line":237},[207,1924,241],{"emptyLinePlaceholder":240},[207,1926,1927,1929],{"class":209,"line":244},[207,1928,247],{"class":213},[207,1930,1931],{"class":250}," Node\n",[207,1933,1934],{"class":209,"line":254},[207,1935,258],{"class":257},[207,1937,1938],{"class":209,"line":261},[207,1939,278],{"class":213},[207,1941,1942,1944],{"class":209,"line":270},[207,1943,264],{"class":250},[207,1945,1946],{"class":257},"::string name;\n",[207,1948,1949,1951,1954,1956,1959,1962],{"class":209,"line":275},[207,1950,264],{"class":250},[207,1952,1953],{"class":257},"::shared_ptr",[207,1955,610],{"class":213},[207,1957,1958],{"class":257},"Node",[207,1960,1961],{"class":213},">",[207,1963,1964],{"class":257}," next;\n",[207,1966,1967,1969,1972,1974,1976,1978],{"class":209,"line":281},[207,1968,264],{"class":250},[207,1970,1971],{"class":257},"::weak_ptr",[207,1973,610],{"class":213},[207,1975,1958],{"class":257},[207,1977,1961],{"class":213},[207,1979,1980],{"class":257}," prev;\n",[207,1982,1983],{"class":209,"line":321},[207,1984,241],{"emptyLinePlaceholder":240},[207,1986,1987,1989,1992,1994,1996,1998,2000,2002,2004,2007,2009,2011],{"class":209,"line":327},[207,1988,284],{"class":213},[207,1990,1991],{"class":250}," Node",[207,1993,290],{"class":257},[207,1995,293],{"class":213},[207,1997,296],{"class":250},[207,1999,299],{"class":257},[207,2001,302],{"class":250},[207,2003,305],{"class":213},[207,2005,2006],{"class":308}," n",[207,2008,312],{"class":257},[207,2010,1143],{"class":250},[207,2012,2013],{"class":257},"(n)\n",[207,2015,2016],{"class":209,"line":357},[207,2017,324],{"class":257},[207,2019,2020,2022,2024,2026,2029,2031,2034,2036,2038,2040,2042],{"class":209,"line":363},[207,2021,330],{"class":250},[207,2023,333],{"class":257},[207,2025,336],{"class":213},[207,2027,2028],{"class":217}," \"Node \"",[207,2030,740],{"class":213},[207,2032,2033],{"class":257}," name ",[207,2035,336],{"class":213},[207,2037,344],{"class":217},[207,2039,348],{"class":347},[207,2041,351],{"class":217},[207,2043,354],{"class":257},[207,2045,2046],{"class":209,"line":368},[207,2047,360],{"class":257},[207,2049,2050],{"class":209,"line":377},[207,2051,241],{"emptyLinePlaceholder":240},[207,2053,2054,2057],{"class":209,"line":382},[207,2055,2056],{"class":250},"    ~Node",[207,2058,374],{"class":257},[207,2060,2061],{"class":209,"line":404},[207,2062,324],{"class":257},[207,2064,2065,2067,2069,2071,2073,2075,2077,2079,2081,2083,2085],{"class":209,"line":409},[207,2066,330],{"class":250},[207,2068,333],{"class":257},[207,2070,336],{"class":213},[207,2072,2028],{"class":217},[207,2074,740],{"class":213},[207,2076,2033],{"class":257},[207,2078,336],{"class":213},[207,2080,395],{"class":217},[207,2082,348],{"class":347},[207,2084,351],{"class":217},[207,2086,354],{"class":257},[207,2088,2089],{"class":209,"line":414},[207,2090,360],{"class":257},[207,2092,2093],{"class":209,"line":429},[207,2094,464],{"class":257},[207,2096,2097],{"class":209,"line":434},[207,2098,241],{"emptyLinePlaceholder":240},[207,2100,2101,2103,2105],{"class":209,"line":456},[207,2102,681],{"class":213},[207,2104,684],{"class":250},[207,2106,374],{"class":257},[207,2108,2109],{"class":209,"line":461},[207,2110,258],{"class":257},[207,2112,2113,2115,2118,2120,2122,2124,2126,2128,2130,2132,2135],{"class":209,"line":467},[207,2114,596],{"class":213},[207,2116,2117],{"class":257}," a ",[207,2119,500],{"class":213},[207,2121,296],{"class":250},[207,2123,299],{"class":257},[207,2125,1654],{"class":250},[207,2127,610],{"class":257},[207,2129,1958],{"class":250},[207,2131,616],{"class":257},[207,2133,2134],{"class":217},"\"A\"",[207,2136,513],{"class":257},[207,2138,2139,2141,2144,2146,2148,2150,2152,2154,2156,2158,2161],{"class":209,"line":472},[207,2140,596],{"class":213},[207,2142,2143],{"class":257}," b ",[207,2145,500],{"class":213},[207,2147,296],{"class":250},[207,2149,299],{"class":257},[207,2151,1654],{"class":250},[207,2153,610],{"class":257},[207,2155,1958],{"class":250},[207,2157,616],{"class":257},[207,2159,2160],{"class":217},"\"B\"",[207,2162,513],{"class":257},[207,2164,2165],{"class":209,"line":483},[207,2166,241],{"emptyLinePlaceholder":240},[207,2168,2169,2172,2174,2177],{"class":209,"line":488},[207,2170,2171],{"class":257},"    a->next ",[207,2173,500],{"class":213},[207,2175,2176],{"class":257}," b;",[207,2178,2179],{"class":563}," \u002F\u002F A 拥有下一个节点\n",[207,2181,2182,2185,2187,2190],{"class":209,"line":516},[207,2183,2184],{"class":257},"    b->prev ",[207,2186,500],{"class":213},[207,2188,2189],{"class":257}," a;",[207,2191,2192],{"class":563}," \u002F\u002F B 只观察前一个节点，不增加 A 的引用计数\n",[207,2194,2195],{"class":209,"line":528},[207,2196,241],{"emptyLinePlaceholder":240},[207,2198,2199,2201,2203,2205,2208,2210,2213,2215,2217,2219,2221,2223,2225],{"class":209,"line":533},[207,2200,264],{"class":250},[207,2202,333],{"class":257},[207,2204,336],{"class":213},[207,2206,2207],{"class":217}," \"a count = \"",[207,2209,740],{"class":213},[207,2211,2212],{"class":257}," a.",[207,2214,1685],{"class":250},[207,2216,423],{"class":257},[207,2218,336],{"class":213},[207,2220,747],{"class":217},[207,2222,348],{"class":347},[207,2224,351],{"class":217},[207,2226,354],{"class":257},[207,2228,2229,2231,2233,2235,2238,2240,2243,2245,2247,2249,2251,2253,2255],{"class":209,"line":551},[207,2230,264],{"class":250},[207,2232,333],{"class":257},[207,2234,336],{"class":213},[207,2236,2237],{"class":217}," \"b count = \"",[207,2239,740],{"class":213},[207,2241,2242],{"class":257}," b.",[207,2244,1685],{"class":250},[207,2246,423],{"class":257},[207,2248,336],{"class":213},[207,2250,747],{"class":217},[207,2252,348],{"class":347},[207,2254,351],{"class":217},[207,2256,354],{"class":257},[207,2258,2259],{"class":209,"line":567},[207,2260,241],{"emptyLinePlaceholder":240},[207,2262,2263,2266,2269,2272,2274,2276,2279,2282],{"class":209,"line":573},[207,2264,2265],{"class":213},"    if",[207,2267,2268],{"class":257}," (",[207,2270,2271],{"class":213},"auto",[207,2273,1187],{"class":257},[207,2275,500],{"class":213},[207,2277,2278],{"class":257}," b->prev.",[207,2280,2281],{"class":250},"lock",[207,2283,2284],{"class":257},"())\n",[207,2286,2287],{"class":209,"line":578},[207,2288,324],{"class":257},[207,2290,2291,2293,2295,2297,2300,2302,2305,2307,2309,2311,2313],{"class":209,"line":588},[207,2292,330],{"class":250},[207,2294,333],{"class":257},[207,2296,336],{"class":213},[207,2298,2299],{"class":217}," \"B prev is \"",[207,2301,740],{"class":213},[207,2303,2304],{"class":257}," p->name ",[207,2306,336],{"class":213},[207,2308,747],{"class":217},[207,2310,348],{"class":347},[207,2312,351],{"class":217},[207,2314,354],{"class":257},[207,2316,2317],{"class":209,"line":593},[207,2318,360],{"class":257},[207,2320,2321],{"class":209,"line":624},[207,2322,241],{"emptyLinePlaceholder":240},[207,2324,2325,2327,2329],{"class":209,"line":633},[207,2326,554],{"class":213},[207,2328,834],{"class":347},[207,2330,354],{"class":257},[207,2332,2333],{"class":209,"line":638},[207,2334,570],{"class":257},[15,2336,2337,848],{},[845,2338,847],{},[198,2340,2343],{"className":2341,"code":2342,"language":854,"meta":203},[852],"Node A created\nNode B created\na count = 1\nb count = 2\nB prev is A\nNode A destroyed\nNode B destroyed\n",[18,2344,2342],{"__ignoreMap":203},[15,2346,2347,2349,2350,2353,2354,2356,2357,2359],{},[18,2348,173],{}," cannot directly access the object; you must first call ",[18,2351,2352],{},"lock()",". If the object is still alive, ",[18,2355,2352],{}," returns a temporary ",[18,2358,89],{},"; if the object has already been released, it returns a null pointer.",[2361,2362,2363],"h4",{"id":2363},"这个例子表达了什么关系",[15,2365,2366],{},"这段代码可以看成一个只有两个节点的双向链表：",[198,2368,2371],{"className":2369,"code":2370,"language":854,"meta":203},[852],"A  ----next---->  B\nA  \u003C---prev-----  B\n",[18,2372,2370],{"__ignoreMap":203},[15,2374,2375,2376,848],{},"虽然两个节点都能找到对方，但两个方向的",[845,2377,2378],{},"所有权含义并不相同",[99,2380,2381],{},[102,2382,2383,2386,2387,2390,2391,2394,2395,2397,2398,2401],{},[18,2384,2385],{},"A"," 通过 ",[18,2388,2389],{},"next"," 拥有 ",[18,2392,2393],{},"B","，因此 ",[18,2396,2389],{}," 使用 ",[18,2399,2400],{},"std::shared_ptr\u003CNode>","。",[99,2403,2404],{},[102,2405,2406,2386,2408,2411,2412,2414,2415,2417,2418,2397,2420,2401],{},[18,2407,2393],{},[18,2409,2410],{},"prev"," 观察 ",[18,2413,2385],{},"，但不负责延长 ",[18,2416,2385],{}," 的生命周期，因此 ",[18,2419,2410],{},[18,2421,2422],{},"std::weak_ptr\u003CNode>",[15,2424,2425],{},"可以把它简单理解为：",[99,2427,2428],{},[102,2429,2430,2432],{},[18,2431,89],{}," 表示“我拥有这个对象，它暂时不能被销毁”。",[99,2434,2435],{},[102,2436,2437,2439],{},[18,2438,173],{}," 表示“我知道这个对象在哪里，但我不负责让它继续存活”。",[2361,2441,2442],{"id":2442},"引用计数是怎样变化的",[15,2444,2445],{},"刚创建两个节点时：",[198,2447,2449],{"className":200,"code":2448,"language":202,"meta":203,"style":203},"auto a = std::make_shared\u003CNode>(\"A\");\nauto b = std::make_shared\u003CNode>(\"B\");\n",[18,2450,2451,2475],{"__ignoreMap":203},[207,2452,2453,2455,2457,2459,2461,2463,2465,2467,2469,2471,2473],{"class":209,"line":210},[207,2454,2271],{"class":213},[207,2456,2117],{"class":257},[207,2458,500],{"class":213},[207,2460,296],{"class":250},[207,2462,299],{"class":257},[207,2464,1654],{"class":250},[207,2466,610],{"class":257},[207,2468,1958],{"class":250},[207,2470,616],{"class":257},[207,2472,2134],{"class":217},[207,2474,513],{"class":257},[207,2476,2477,2479,2481,2483,2485,2487,2489,2491,2493,2495,2497],{"class":209,"line":221},[207,2478,2271],{"class":213},[207,2480,2143],{"class":257},[207,2482,500],{"class":213},[207,2484,296],{"class":250},[207,2486,299],{"class":257},[207,2488,1654],{"class":250},[207,2490,610],{"class":257},[207,2492,1958],{"class":250},[207,2494,616],{"class":257},[207,2496,2160],{"class":217},[207,2498,513],{"class":257},[15,2500,2501,2502,2390,2505,2507,2508,2390,2511,848],{},"此时 ",[18,2503,2504],{},"a",[18,2506,2385],{},"，",[18,2509,2510],{},"b",[18,2512,2393],{},[15,2514,2515,2516,2518],{},"|对象|拥有它的 ",[18,2517,89],{},"|引用计数|",[15,2520,2521,2522,2524,2525,2527,2528,2524,2530,2532],{},"|:---|:---|:---:|\n|",[18,2523,2385],{},"|",[18,2526,2504],{},"|1|\n|",[18,2529,2393],{},[18,2531,2510],{},"|1|",[15,2534,2535],{},"执行：",[198,2537,2539],{"className":200,"code":2538,"language":202,"meta":203,"style":203},"a->next = b;\n",[18,2540,2541],{"__ignoreMap":203},[207,2542,2543,2546,2548],{"class":209,"line":210},[207,2544,2545],{"class":257},"a->next ",[207,2547,500],{"class":213},[207,2549,2550],{"class":257}," b;\n",[15,2552,2553,2556,2557,2559,2560,2562,2563,2565,2566,2568],{},[18,2554,2555],{},"a->next"," 也是一个 ",[18,2558,89],{},"，它和 ",[18,2561,2510],{}," 共同拥有 ",[18,2564,2393],{},"，所以 ",[18,2567,2393],{}," 的引用计数由 1 变成 2。",[15,2570,2571],{},"接着执行：",[198,2573,2575],{"className":200,"code":2574,"language":202,"meta":203,"style":203},"b->prev = a;\n",[18,2576,2577],{"__ignoreMap":203},[207,2578,2579,2582,2584],{"class":209,"line":210},[207,2580,2581],{"class":257},"b->prev ",[207,2583,500],{"class":213},[207,2585,2586],{"class":257}," a;\n",[15,2588,2589,2592,2593,2595,2596,2598],{},[18,2590,2591],{},"b->prev"," 是 ",[18,2594,173],{},"，只观察 ",[18,2597,2385],{},"，不会增加引用计数。因此最终输出为：",[198,2600,2603],{"className":2601,"code":2602,"language":854,"meta":203},[852],"a count = 1\nb count = 2\n",[18,2604,2602],{"__ignoreMap":203},[15,2606,2607],{},"对应关系是：",[15,2609,2515,2610,2518],{},[18,2611,89],{},[15,2613,2521,2614,2524,2616,2527,2618,2524,2620,2622,2623,2625],{},[18,2615,2385],{},[18,2617,2504],{},[18,2619,2393],{},[18,2621,2510],{},"、",[18,2624,2555],{},"|2|",[2361,2627,2629],{"id":2628},"为什么反向指针不能也使用-shared_ptr","为什么反向指针不能也使用 shared_ptr",[15,2631,2632],{},"假设把成员改成：",[198,2634,2636],{"className":200,"code":2635,"language":202,"meta":203,"style":203},"std::shared_ptr\u003CNode> prev;\n",[18,2637,2638],{"__ignoreMap":203},[207,2639,2640,2642,2644,2646,2648,2650],{"class":209,"line":210},[207,2641,1102],{"class":250},[207,2643,1953],{"class":257},[207,2645,610],{"class":213},[207,2647,1958],{"class":257},[207,2649,1961],{"class":213},[207,2651,1980],{"class":257},[15,2653,2654,2655,2386,2657,2390,2659,2507,2661,2663,2664,2390,2666,848],{},"那么 ",[18,2656,2385],{},[18,2658,2389],{},[18,2660,2393],{},[18,2662,2393],{}," 又通过 ",[18,2665,2410],{},[18,2667,2385],{},[198,2669,2672],{"className":2670,"code":2671,"language":854,"meta":203},[852],"A  ----shared_ptr---->  B\nA  \u003C---shared_ptr----  B\n",[18,2673,2671],{"__ignoreMap":203},[15,2675,2676,2677,2680,2681,2683,2684,2686],{},"当 ",[18,2678,2679],{},"main()"," 结束时，局部变量 ",[18,2682,2504],{}," 和 ",[18,2685,2510],{}," 虽然会销毁，但两个节点内部仍然互相持有：",[198,2688,2691],{"className":2689,"code":2690,"language":854,"meta":203},[852],"A 的引用计数至少为 1：来自 B.prev\nB 的引用计数至少为 1：来自 A.next\n",[18,2692,2690],{"__ignoreMap":203},[15,2694,2695,2696,2698,2699,2401],{},"它们的引用计数都无法降到 0，因此两个对象都不会析构，这就是 ",[18,2697,89],{}," 的",[845,2700,2701],{},"循环引用问题",[15,2703,2704,2705,2707,2708,2711,2712,2714],{},"使用 ",[18,2706,173],{}," 作为反向指针后，",[18,2709,2710],{},"B.prev"," 不参与 ",[18,2713,2385],{}," 的引用计数，循环所有权被打破，对象便可以正常释放。",[2361,2716,2718],{"id":2717},"lock-的作用是什么","lock() 的作用是什么",[15,2720,2721,2723],{},[18,2722,173],{}," 不拥有对象，因此它不能保证自己观察的对象仍然存在。也正因为如此，不能直接写：",[198,2725,2727],{"className":200,"code":2726,"language":202,"meta":203,"style":203},"\u002F\u002F 错误：weak_ptr 不支持直接使用 -> 访问对象\nstd::cout \u003C\u003C b->prev->name \u003C\u003C \"\\n\";\n",[18,2728,2729,2734],{"__ignoreMap":203},[207,2730,2731],{"class":209,"line":210},[207,2732,2733],{"class":563},"\u002F\u002F 错误：weak_ptr 不支持直接使用 -> 访问对象\n",[207,2735,2736,2738,2740,2742,2745,2747,2749,2751,2753],{"class":209,"line":221},[207,2737,1102],{"class":250},[207,2739,333],{"class":257},[207,2741,336],{"class":213},[207,2743,2744],{"class":257}," b->prev->name ",[207,2746,336],{"class":213},[207,2748,747],{"class":217},[207,2750,348],{"class":347},[207,2752,351],{"class":217},[207,2754,354],{"class":257},[15,2756,2757],{},"访问前必须调用：",[198,2759,2761],{"className":200,"code":2760,"language":202,"meta":203,"style":203},"b->prev.lock()\n",[18,2762,2763],{"__ignoreMap":203},[207,2764,2765,2768,2770],{"class":209,"line":210},[207,2766,2767],{"class":257},"b->prev.",[207,2769,2281],{"class":250},[207,2771,374],{"class":257},[15,2773,2774,2776,2777,2779,2780,848],{},[18,2775,2352],{}," 会尝试根据 ",[18,2778,173],{}," 得到一个 ",[18,2781,89],{},[99,2783,2784],{},[102,2785,2786,2787,2401],{},"如果对象仍然存在，返回一个有效的 ",[18,2788,89],{},[99,2790,2791],{},[102,2792,2793,2794,2401],{},"如果对象已经销毁，返回一个空的 ",[18,2795,89],{},[15,2797,2798],{},"因此原代码写成：",[198,2800,2802],{"className":200,"code":2801,"language":202,"meta":203,"style":203},"if (auto p = b->prev.lock())\n{\n    std::cout \u003C\u003C \"B prev is \" \u003C\u003C p->name \u003C\u003C \"\\n\";\n}\n",[18,2803,2804,2823,2827,2851],{"__ignoreMap":203},[207,2805,2806,2809,2811,2813,2815,2817,2819,2821],{"class":209,"line":210},[207,2807,2808],{"class":213},"if",[207,2810,2268],{"class":257},[207,2812,2271],{"class":213},[207,2814,1187],{"class":257},[207,2816,500],{"class":213},[207,2818,2278],{"class":257},[207,2820,2281],{"class":250},[207,2822,2284],{"class":257},[207,2824,2825],{"class":209,"line":221},[207,2826,258],{"class":257},[207,2828,2829,2831,2833,2835,2837,2839,2841,2843,2845,2847,2849],{"class":209,"line":229},[207,2830,264],{"class":250},[207,2832,333],{"class":257},[207,2834,336],{"class":213},[207,2836,2299],{"class":217},[207,2838,740],{"class":213},[207,2840,2304],{"class":257},[207,2842,336],{"class":213},[207,2844,747],{"class":217},[207,2846,348],{"class":347},[207,2848,351],{"class":217},[207,2850,354],{"class":257},[207,2852,2853],{"class":209,"line":237},[207,2854,570],{"class":257},[15,2856,2857],{},"这段代码可以分成三步理解：",[140,2859,2860],{},[102,2861,2862,2865,2866,2868,2869,2401],{},[18,2863,2864],{},"b->prev.lock()"," 尝试获得指向 ",[18,2867,2385],{}," 的 ",[18,2870,89],{},[140,2872,2873],{"start":221},[102,2874,2875,2876,2878],{},"返回值保存到局部变量 ",[18,2877,15],{}," 中。",[140,2880,2881],{"start":229},[102,2882,2883,2885,2886,2888],{},[18,2884,2808],{}," 检查 ",[18,2887,15],{}," 是否非空，只有对象仍然存在时才进入代码块。",[15,2890,2891,2892,2894,2895,2897,2898,2900,2901,2903,2904,2906],{},"在这个例子中，",[18,2893,2385],{}," 仍然由变量 ",[18,2896,2504],{}," 管理，所以 ",[18,2899,2352],{}," 成功，",[18,2902,15],{}," 指向 ",[18,2905,2385],{},"，可以安全访问：",[198,2908,2910],{"className":200,"code":2909,"language":202,"meta":203,"style":203},"p->name\n",[18,2911,2912],{"__ignoreMap":203},[207,2913,2914],{"class":209,"line":210},[207,2915,2909],{"class":257},[15,2917,2918,2919,2921,2922,2394,2924,2926,2927,2929,2930,2932],{},"在 ",[18,2920,15],{}," 存活期间，它也会暂时拥有 ",[18,2923,2385],{},[18,2925,2385],{}," 的引用计数会临时从 1 变成 2。离开 ",[18,2928,2808],{}," 代码块后，",[18,2931,15],{}," 被销毁，引用计数再从 2 变回 1。",[2361,2934,2936],{"id":2935},"lock-失败时会怎样","lock() 失败时会怎样",[15,2938,2939,2940,2942,2943,2945],{},"下面的例子中，",[18,2941,2385],{}," 被销毁以后，",[18,2944,173],{}," 本身仍然可以存在，但它已经处于过期状态：",[198,2947,2949],{"className":200,"code":2948,"language":202,"meta":203,"style":203},"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",[18,2950,2951,2966,2970,2974,2998,3008,3016,3020,3039,3043,3063,3067,3072,3076,3093],{"__ignoreMap":203},[207,2952,2953,2955,2957,2959,2961,2963],{"class":209,"line":210},[207,2954,1102],{"class":250},[207,2956,1971],{"class":257},[207,2958,610],{"class":213},[207,2960,1958],{"class":257},[207,2962,1961],{"class":213},[207,2964,2965],{"class":257}," observer;\n",[207,2967,2968],{"class":209,"line":221},[207,2969,241],{"emptyLinePlaceholder":240},[207,2971,2972],{"class":209,"line":229},[207,2973,258],{"class":257},[207,2975,2976,2978,2980,2982,2984,2986,2988,2990,2992,2994,2996],{"class":209,"line":237},[207,2977,596],{"class":213},[207,2979,1217],{"class":257},[207,2981,500],{"class":213},[207,2983,296],{"class":250},[207,2985,299],{"class":257},[207,2987,1654],{"class":250},[207,2989,610],{"class":257},[207,2991,1958],{"class":250},[207,2993,616],{"class":257},[207,2995,2134],{"class":217},[207,2997,513],{"class":257},[207,2999,3000,3003,3005],{"class":209,"line":244},[207,3001,3002],{"class":257},"    observer ",[207,3004,500],{"class":213},[207,3006,3007],{"class":257}," owner;\n",[207,3009,3010,3013],{"class":209,"line":254},[207,3011,3012],{"class":257},"}",[207,3014,3015],{"class":563}," \u002F\u002F owner 销毁，A 的引用计数变成 0，A 被释放\n",[207,3017,3018],{"class":209,"line":261},[207,3019,241],{"emptyLinePlaceholder":240},[207,3021,3022,3024,3026,3028,3030,3032,3035,3037],{"class":209,"line":270},[207,3023,2808],{"class":213},[207,3025,2268],{"class":257},[207,3027,2271],{"class":213},[207,3029,1187],{"class":257},[207,3031,500],{"class":213},[207,3033,3034],{"class":257}," observer.",[207,3036,2281],{"class":250},[207,3038,2284],{"class":257},[207,3040,3041],{"class":209,"line":275},[207,3042,258],{"class":257},[207,3044,3045,3047,3049,3051,3053,3055,3057,3059,3061],{"class":209,"line":281},[207,3046,264],{"class":250},[207,3048,333],{"class":257},[207,3050,336],{"class":213},[207,3052,2304],{"class":257},[207,3054,336],{"class":213},[207,3056,747],{"class":217},[207,3058,348],{"class":347},[207,3060,351],{"class":217},[207,3062,354],{"class":257},[207,3064,3065],{"class":209,"line":321},[207,3066,570],{"class":257},[207,3068,3069],{"class":209,"line":327},[207,3070,3071],{"class":213},"else\n",[207,3073,3074],{"class":209,"line":357},[207,3075,258],{"class":257},[207,3077,3078,3080,3082,3084,3087,3089,3091],{"class":209,"line":363},[207,3079,264],{"class":250},[207,3081,333],{"class":257},[207,3083,336],{"class":213},[207,3085,3086],{"class":217}," \"observed object has been destroyed",[207,3088,348],{"class":347},[207,3090,351],{"class":217},[207,3092,354],{"class":257},[207,3094,3095],{"class":209,"line":368},[207,3096,570],{"class":257},[15,3098,3099,3100,3103,3104,3106,3107,3110],{},"这时 ",[18,3101,3102],{},"observer.lock()"," 返回空的 ",[18,3105,89],{},"，程序进入 ",[18,3108,3109],{},"else","，不会访问已经销毁的对象。",[15,3112,3113,3114,3117],{},"也可以先使用 ",[18,3115,3116],{},"expired()"," 判断：",[198,3119,3121],{"className":200,"code":3120,"language":202,"meta":203,"style":203},"if (!observer.expired())\n{\n    \u002F\u002F 对象可能仍然存在\n}\n",[18,3122,3123,3140,3144,3149],{"__ignoreMap":203},[207,3124,3125,3127,3129,3132,3135,3138],{"class":209,"line":210},[207,3126,2808],{"class":213},[207,3128,2268],{"class":257},[207,3130,3131],{"class":213},"!",[207,3133,3134],{"class":257},"observer.",[207,3136,3137],{"class":250},"expired",[207,3139,2284],{"class":257},[207,3141,3142],{"class":209,"line":221},[207,3143,258],{"class":257},[207,3145,3146],{"class":209,"line":229},[207,3147,3148],{"class":563},"    \u002F\u002F 对象可能仍然存在\n",[207,3150,3151],{"class":209,"line":237},[207,3152,570],{"class":257},[15,3154,3155,3156,3158,3159,3161,3162,3164,3165,3167],{},"不过需要真正访问对象时，仍然应该直接使用 ",[18,3157,2352],{}," 并检查返回值。因为从调用 ",[18,3160,3116],{}," 到调用 ",[18,3163,2352],{}," 之间，对象的生命周期仍可能发生变化；",[18,3166,2352],{}," 能把“检查对象是否存在”和“临时取得所有权”合并为一次安全操作。",[2361,3169,3170],{"id":3170},"程序结束时为什么两个节点都能析构",[15,3172,3173,3175,3176,3178,3179,848],{},[18,3174,2679],{}," 结束时，局部变量按照创建顺序的相反方向销毁，因此先销毁 ",[18,3177,2510],{},"，再销毁 ",[18,3180,2504],{},[140,3182,3183],{},[102,3184,3185,3187,3188,3190,3191,3193,3194,2401],{},[18,3186,2510],{}," 销毁后，",[18,3189,2393],{}," 的引用计数从 2 变成 1，因为 ",[18,3192,2555],{}," 仍然拥有 ",[18,3195,2393],{},[140,3197,3198],{"start":221},[102,3199,3200,3187,3202,3204,3205,3207],{},[18,3201,2504],{},[18,3203,2385],{}," 的引用计数从 1 变成 0，于是 ",[18,3206,2385],{}," 被析构。",[140,3209,3210],{"start":229},[102,3211,3212,3214,3215,3217,3218,3220],{},[18,3213,2385],{}," 被销毁时，它的成员 ",[18,3216,2389],{}," 也随之销毁，",[18,3219,2393],{}," 的引用计数从 1 变成 0。",[140,3222,3223],{"start":237},[102,3224,3225,3226,3207],{},"最后 ",[18,3227,2393],{},[15,3229,3230],{},"所以最终可以看到：",[198,3232,3235],{"className":3233,"code":3234,"language":854,"meta":203},[852],"Node A destroyed\nNode B destroyed\n",[18,3236,3234],{"__ignoreMap":203},[15,3238,3239,3240],{},"这里最关键的不是“前后指针必须分别使用哪一种智能指针”，而是要先判断所有权关系：",[845,3241,3242,3243,3245,3246,2401],{},"真正负责对象生命周期的一方使用 ",[18,3244,89],{},"，只负责观察的一方使用 ",[18,3247,173],{},[183,3249,3251],{"id":3250},"example-5-dont-overuse-shared_ptr-as-function-parameters","Example 5: Don't overuse shared_ptr as function parameters",[15,3253,3254],{},"Function parameters should express true semantics:",[99,3256,3257,3267,3276,3281],{},[102,3258,3259,3260,3263,3264,134],{},"For temporary use of objects: use ",[18,3261,3262],{},"T&"," or ",[18,3265,3266],{},"const T&",[102,3268,3269,3270,3263,3273,134],{},"Functions might not have objects: use ",[18,3271,3272],{},"T*",[18,3274,3275],{},"const T*",[102,3277,3278,3279,134],{},"The function should take over the object: using ",[18,3280,54],{},[102,3282,3283,3284,134],{},"Functions need to share objects: use ",[18,3285,67],{},[198,3287,3289],{"className":200,"code":3288,"language":202,"meta":203,"style":203},"#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",[18,3290,3291,3297,3303,3309,3315,3319,3326,3330,3336,3340,3344,3376,3380,3398,3402,3408,3412,3416,3420,3440,3444,3474,3478,3482,3486,3513,3517,3547,3551,3555,3580,3584,3613,3617,3621,3629,3633,3637,3663,3675,3691,3731,3735,3761,3791,3799,3828,3832,3840],{"__ignoreMap":203},[207,3292,3293,3295],{"class":209,"line":210},[207,3294,214],{"class":213},[207,3296,218],{"class":217},[207,3298,3299,3301],{"class":209,"line":221},[207,3300,214],{"class":213},[207,3302,226],{"class":217},[207,3304,3305,3307],{"class":209,"line":229},[207,3306,214],{"class":213},[207,3308,234],{"class":217},[207,3310,3311,3313],{"class":209,"line":237},[207,3312,214],{"class":213},[207,3314,905],{"class":217},[207,3316,3317],{"class":209,"line":244},[207,3318,241],{"emptyLinePlaceholder":240},[207,3320,3321,3323],{"class":209,"line":254},[207,3322,247],{"class":213},[207,3324,3325],{"class":250}," Robot\n",[207,3327,3328],{"class":209,"line":261},[207,3329,258],{"class":257},[207,3331,3332,3334],{"class":209,"line":270},[207,3333,264],{"class":250},[207,3335,267],{"class":257},[207,3337,3338],{"class":209,"line":275},[207,3339,241],{"emptyLinePlaceholder":240},[207,3341,3342],{"class":209,"line":281},[207,3343,278],{"class":213},[207,3345,3346,3348,3351,3353,3355,3357,3359,3361,3363,3365,3367,3369,3371,3373],{"class":209,"line":321},[207,3347,284],{"class":213},[207,3349,3350],{"class":250}," Robot",[207,3352,290],{"class":257},[207,3354,1102],{"class":250},[207,3356,299],{"class":257},[207,3358,302],{"class":250},[207,3360,309],{"class":308},[207,3362,312],{"class":257},[207,3364,315],{"class":250},[207,3366,290],{"class":257},[207,3368,1102],{"class":250},[207,3370,299],{"class":257},[207,3372,1226],{"class":250},[207,3374,3375],{"class":257},"(name)) {}\n",[207,3377,3378],{"class":209,"line":327},[207,3379,241],{"emptyLinePlaceholder":240},[207,3381,3382,3384,3386,3388,3390,3392,3394,3396],{"class":209,"line":357},[207,3383,1046],{"class":213},[207,3385,296],{"class":250},[207,3387,299],{"class":257},[207,3389,302],{"class":250},[207,3391,305],{"class":213},[207,3393,309],{"class":250},[207,3395,423],{"class":257},[207,3397,426],{"class":213},[207,3399,3400],{"class":209,"line":363},[207,3401,324],{"class":257},[207,3403,3404,3406],{"class":209,"line":368},[207,3405,1069],{"class":213},[207,3407,1072],{"class":257},[207,3409,3410],{"class":209,"line":377},[207,3411,360],{"class":257},[207,3413,3414],{"class":209,"line":382},[207,3415,464],{"class":257},[207,3417,3418],{"class":209,"line":404},[207,3419,241],{"emptyLinePlaceholder":240},[207,3421,3422,3424,3427,3429,3431,3433,3435,3438],{"class":209,"line":409},[207,3423,1094],{"class":213},[207,3425,3426],{"class":250}," print_robot",[207,3428,290],{"class":257},[207,3430,293],{"class":213},[207,3432,3350],{"class":250},[207,3434,305],{"class":213},[207,3436,3437],{"class":308}," robot",[207,3439,1120],{"class":257},[207,3441,3442],{"class":209,"line":414},[207,3443,258],{"class":257},[207,3445,3446,3448,3450,3452,3455,3457,3460,3462,3464,3466,3468,3470,3472],{"class":209,"line":429},[207,3447,264],{"class":250},[207,3449,333],{"class":257},[207,3451,336],{"class":213},[207,3453,3454],{"class":217}," \"borrow: \"",[207,3456,740],{"class":213},[207,3458,3459],{"class":257}," robot.",[207,3461,1143],{"class":250},[207,3463,423],{"class":257},[207,3465,336],{"class":213},[207,3467,747],{"class":217},[207,3469,348],{"class":347},[207,3471,351],{"class":217},[207,3473,354],{"class":257},[207,3475,3476],{"class":209,"line":434},[207,3477,570],{"class":257},[207,3479,3480],{"class":209,"line":456},[207,3481,241],{"emptyLinePlaceholder":240},[207,3483,3484],{"class":209,"line":461},[207,3485,1089],{"class":563},[207,3487,3488,3490,3493,3495,3497,3499,3501,3503,3506,3508,3511],{"class":209,"line":467},[207,3489,1094],{"class":213},[207,3491,3492],{"class":250}," take_robot",[207,3494,290],{"class":257},[207,3496,1102],{"class":250},[207,3498,299],{"class":257},[207,3500,153],{"class":250},[207,3502,610],{"class":257},[207,3504,3505],{"class":250},"Robot",[207,3507,1114],{"class":257},[207,3509,3510],{"class":308},"robot",[207,3512,1120],{"class":257},[207,3514,3515],{"class":209,"line":472},[207,3516,258],{"class":257},[207,3518,3519,3521,3523,3525,3528,3530,3533,3535,3537,3539,3541,3543,3545],{"class":209,"line":483},[207,3520,264],{"class":250},[207,3522,333],{"class":257},[207,3524,336],{"class":213},[207,3526,3527],{"class":217}," \"take: \"",[207,3529,740],{"class":213},[207,3531,3532],{"class":257}," robot->",[207,3534,1143],{"class":250},[207,3536,423],{"class":257},[207,3538,336],{"class":213},[207,3540,747],{"class":217},[207,3542,348],{"class":347},[207,3544,351],{"class":217},[207,3546,354],{"class":257},[207,3548,3549],{"class":209,"line":488},[207,3550,570],{"class":257},[207,3552,3553],{"class":209,"line":516},[207,3554,241],{"emptyLinePlaceholder":240},[207,3556,3557,3559,3562,3564,3566,3568,3570,3572,3574,3576,3578],{"class":209,"line":528},[207,3558,1094],{"class":213},[207,3560,3561],{"class":250}," share_robot",[207,3563,290],{"class":257},[207,3565,1102],{"class":250},[207,3567,299],{"class":257},[207,3569,89],{"class":250},[207,3571,610],{"class":257},[207,3573,3505],{"class":250},[207,3575,1114],{"class":257},[207,3577,3510],{"class":308},[207,3579,1120],{"class":257},[207,3581,3582],{"class":209,"line":533},[207,3583,258],{"class":257},[207,3585,3586,3588,3590,3592,3595,3597,3599,3601,3603,3605,3607,3609,3611],{"class":209,"line":551},[207,3587,264],{"class":250},[207,3589,333],{"class":257},[207,3591,336],{"class":213},[207,3593,3594],{"class":217}," \"share count inside = \"",[207,3596,740],{"class":213},[207,3598,3459],{"class":257},[207,3600,1685],{"class":250},[207,3602,423],{"class":257},[207,3604,336],{"class":213},[207,3606,747],{"class":217},[207,3608,348],{"class":347},[207,3610,351],{"class":217},[207,3612,354],{"class":257},[207,3614,3615],{"class":209,"line":567},[207,3616,570],{"class":257},[207,3618,3619],{"class":209,"line":573},[207,3620,241],{"emptyLinePlaceholder":240},[207,3622,3623,3625,3627],{"class":209,"line":578},[207,3624,681],{"class":213},[207,3626,684],{"class":250},[207,3628,374],{"class":257},[207,3630,3631],{"class":209,"line":588},[207,3632,258],{"class":257},[207,3634,3635],{"class":209,"line":593},[207,3636,1180],{"class":563},[207,3638,3639,3641,3644,3646,3648,3650,3652,3654,3656,3658,3661],{"class":209,"line":624},[207,3640,596],{"class":213},[207,3642,3643],{"class":257}," robot ",[207,3645,500],{"class":213},[207,3647,296],{"class":250},[207,3649,299],{"class":257},[207,3651,607],{"class":250},[207,3653,610],{"class":257},[207,3655,3505],{"class":250},[207,3657,616],{"class":257},[207,3659,3660],{"class":217},"\"R1\"",[207,3662,513],{"class":257},[207,3664,3665,3668,3670,3672],{"class":209,"line":633},[207,3666,3667],{"class":250},"    print_robot",[207,3669,290],{"class":257},[207,3671,494],{"class":213},[207,3673,3674],{"class":257},"robot);\n",[207,3676,3677,3680,3682,3684,3686,3688],{"class":209,"line":638},[207,3678,3679],{"class":250},"    take_robot",[207,3681,290],{"class":257},[207,3683,1102],{"class":250},[207,3685,299],{"class":257},[207,3687,1226],{"class":250},[207,3689,3690],{"class":257},"(robot));\n",[207,3692,3693,3695,3697,3699,3702,3704,3707,3709,3711,3713,3715,3717,3719,3721,3723,3725,3727,3729],{"class":209,"line":656},[207,3694,264],{"class":250},[207,3696,333],{"class":257},[207,3698,336],{"class":213},[207,3700,3701],{"class":217}," \"robot is null? \"",[207,3703,740],{"class":213},[207,3705,3706],{"class":257}," (robot ",[207,3708,1248],{"class":213},[207,3710,1251],{"class":347},[207,3712,1254],{"class":213},[207,3714,1257],{"class":217},[207,3716,1260],{"class":213},[207,3718,1263],{"class":217},[207,3720,1266],{"class":257},[207,3722,336],{"class":213},[207,3724,747],{"class":217},[207,3726,348],{"class":347},[207,3728,351],{"class":217},[207,3730,354],{"class":257},[207,3732,3733],{"class":209,"line":668},[207,3734,241],{"emptyLinePlaceholder":240},[207,3736,3737,3739,3742,3744,3746,3748,3750,3752,3754,3756,3759],{"class":209,"line":673},[207,3738,596],{"class":213},[207,3740,3741],{"class":257}," shared_robot ",[207,3743,500],{"class":213},[207,3745,296],{"class":250},[207,3747,299],{"class":257},[207,3749,1654],{"class":250},[207,3751,610],{"class":257},[207,3753,3505],{"class":250},[207,3755,616],{"class":257},[207,3757,3758],{"class":217},"\"R2\"",[207,3760,513],{"class":257},[207,3762,3763,3765,3767,3769,3772,3774,3777,3779,3781,3783,3785,3787,3789],{"class":209,"line":678},[207,3764,264],{"class":250},[207,3766,333],{"class":257},[207,3768,336],{"class":213},[207,3770,3771],{"class":217}," \"share count before = \"",[207,3773,740],{"class":213},[207,3775,3776],{"class":257}," shared_robot.",[207,3778,1685],{"class":250},[207,3780,423],{"class":257},[207,3782,336],{"class":213},[207,3784,747],{"class":217},[207,3786,348],{"class":347},[207,3788,351],{"class":217},[207,3790,354],{"class":257},[207,3792,3793,3796],{"class":209,"line":689},[207,3794,3795],{"class":250},"    share_robot",[207,3797,3798],{"class":257},"(shared_robot);\n",[207,3800,3801,3803,3805,3807,3810,3812,3814,3816,3818,3820,3822,3824,3826],{"class":209,"line":694},[207,3802,264],{"class":250},[207,3804,333],{"class":257},[207,3806,336],{"class":213},[207,3808,3809],{"class":217}," \"share count after = \"",[207,3811,740],{"class":213},[207,3813,3776],{"class":257},[207,3815,1685],{"class":250},[207,3817,423],{"class":257},[207,3819,336],{"class":213},[207,3821,747],{"class":217},[207,3823,348],{"class":347},[207,3825,351],{"class":217},[207,3827,354],{"class":257},[207,3829,3830],{"class":209,"line":708},[207,3831,241],{"emptyLinePlaceholder":240},[207,3833,3834,3836,3838],{"class":209,"line":713},[207,3835,554],{"class":213},[207,3837,834],{"class":347},[207,3839,354],{"class":257},[207,3841,3842],{"class":209,"line":728},[207,3843,570],{"class":257},[15,3845,3846,848],{},[845,3847,847],{},[198,3849,3852],{"className":3850,"code":3851,"language":854,"meta":203},[852],"borrow: R1\ntake: R1\nrobot is null? yes\nshare count before = 1\nshare count inside = 2\nshare count after = 1\n",[18,3853,3851],{"__ignoreMap":203},[10,3855,3857],{"id":3856},"key-grammar-explanation","Key Grammar Explanation",[26,3859,3860,3873],{},[29,3861,3862],{},[32,3863,3864,3867,3870],{},[35,3865,3866],{"align":37},"writing method",[35,3868,3869],{"align":37},"Meaning",[35,3871,3872],{"align":37},"Precautions",[45,3874,3875,3888,3903,3916,3929,3943],{},[32,3876,3877,3882,3885],{},[50,3878,3879],{"align":37},[18,3880,3881],{},"std::make_unique\u003CT>(...)",[50,3883,3884],{"align":37},"Create exclusive ownership objects",[50,3886,3887],{"align":37},"Available since C++14",[32,3889,3890,3895,3900],{},[50,3891,3892],{"align":37},[18,3893,3894],{},"std::move(p)",[50,3896,3897,3898,134],{"align":37},"Transfer the ownership of ",[18,3899,153],{},[50,3901,3902],{"align":37},"The original pointer usually becomes null after being moved.",[32,3904,3905,3910,3913],{},[50,3906,3907],{"align":37},[18,3908,3909],{},"std::make_shared\u003CT>(...)",[50,3911,3912],{"align":37},"Create shared ownership objects",[50,3914,3915],{"align":37},"Reference counting has overhead.",[32,3917,3918,3923,3926],{},[50,3919,3920],{"align":37},[18,3921,3922],{},"sp.use_count()",[50,3924,3925],{"align":37},"View shared reference count",[50,3927,3928],{"align":37},"For teaching and debugging purposes, but business logic should not depend on it.",[32,3930,3931,3935,3938],{},[50,3932,3933],{"align":37},[18,3934,80],{},[50,3936,3937],{"align":37},"Weak reference, does not increment the reference count",[50,3939,3940,3941],{"align":37},"Access requires ",[18,3942,2352],{},[32,3944,3945,3950,3953],{},[50,3946,3947],{"align":37},[18,3948,3949],{},"p.reset()",[50,3951,3952],{"align":37},"Release the currently managed object.",[50,3954,3955,3956,3958],{"align":37},"For ",[18,3957,89],{},", it decrements the reference count by one.",[10,3960,3962],{"id":3961},"common-errors","Common Errors",[140,3964,3965,3974,3980,3989,3995],{},[102,3966,3967,3968,3970,3971,3973],{},"Treat ",[18,3969,153],{}," as an ordinary pointer and copy it. ",[18,3972,153],{}," can only be moved, not copied.",[102,3975,3976,3977,3979],{},"The parameter is written as ",[18,3978,89],{},", which is clearly just a borrowed object. This implies that the function also participates in shared ownership.",[102,3981,3982,3983,3985,3986,3988],{},"Create another ",[18,3984,89],{}," from a raw pointer of ",[18,3987,89],{},". This results in two control blocks, which may eventually lead to duplicate releases.",[102,3990,3991,3992,3994],{},"Two objects hold references to each other using ",[18,3993,89],{},", resulting in circular references.",[102,3996,3997,3998,4000],{},"Using smart pointers to manage stack objects is problematic. For instance, if the address of a local variable is passed to ",[18,3999,153],{},", it will incorrectly deallocate the stack memory when leaving the scope.",[10,4002,4003],{"id":4003},"使用建议",[99,4005,4006,4009,4012,4015,4018],{},[102,4007,4008],{},"明确目标：在开始前确定您的具体需求，以便选择最合适的工具或教程。",[102,4010,4011],{},"充分利用资源：参考官方文档、教程和博客，这些资料能帮助您快速上手并解决问题。",[102,4013,4014],{},"实践应用：通过动手操作项目或编写代码来巩固学习成果，提升实际操作能力。",[102,4016,4017],{},"问题解决：遇到困难时，查阅参考资料或寻求社区支持，逐步培养独立解决问题的能力。",[102,4019,4020],{},"分享经验：完成项目后，可以撰写文章或博客分享心得，帮助其他学习者。",[15,4022,4023],{},"如果需要针对特定领域（如单片机、机器人或环境搭建）的进一步建议，请提供更多信息，我将为您细化内容。",[140,4025,4026,4029,4034,4039,4047,4055],{},[102,4027,4028],{},"Avoid using pointers when possible; prioritize regular objects and references.",[102,4030,4031,4032,134],{},"When dynamic ownership is needed, prioritize using ",[18,4033,153],{},[102,4035,165,4036,4038],{},[18,4037,89],{}," when there are indeed multiple owners.",[102,4040,4041,4042,4044,4045,134],{},"When only observing objects managed by ",[18,4043,89],{},", use ",[18,4046,173],{},[102,4048,4049,4050,4052,4053,134],{},"When creating smart pointers, prefer ",[18,4051,607],{}," and ",[18,4054,1654],{},[102,4056,4057],{},"Function parameters must convey semantics: borrowing, transferring, and sharing should not be mixed.",[10,4059,4061],{"id":4060},"summary","Summary",[99,4063,4064,4067,4072,4077,4082],{},[102,4065,4066],{},"Smart pointers are a typical application of RAII.",[102,4068,4069,4071],{},[18,4070,153],{}," conveys exclusive ownership and is the default and preferred choice.",[102,4073,4074,4076],{},[18,4075,89],{}," expresses shared ownership, don't overuse it just for convenience.",[102,4078,4079,4081],{},[18,4080,173],{}," does not own objects, and is often used to resolve circular references.",[102,4083,4084],{},"The most important thing about smart pointers isn't \"automatic delete,\" but clearly defining the ownership relationships.",[4086,4087,4088],"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":203,"searchDepth":221,"depth":221,"links":4090},[4091,4092,4093,4094,4101,4102,4103,4104],{"id":12,"depth":221,"text":13},{"id":96,"depth":221,"text":97},{"id":137,"depth":221,"text":138},{"id":180,"depth":221,"text":181,"children":4095},[4096,4097,4098,4099,4100],{"id":185,"depth":229,"text":186},{"id":869,"depth":229,"text":870},{"id":1395,"depth":229,"text":1396},{"id":1884,"depth":229,"text":1885},{"id":3250,"depth":229,"text":3251},{"id":3856,"depth":221,"text":3857},{"id":3961,"depth":221,"text":3962},{"id":4003,"depth":221,"text":4003},{"id":4060,"depth":221,"text":4061},"\u002Fen-us\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","en-us:2023-10-05-cplusplus-jiao-xue","\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针",false,null,"en-US","en-us",{},{"title":5,"description":203},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","MwOOYE85W4pKvGDoAWoixMYqFQC-Ppo6LntthHceToQ",[4124,4130,4135,4140,4145,4150,4155,4160,4165,4170,4175,4180,4185,4190,4195,4200,4205,4210,4215,4220,4225,4230,4235,4240,4245,4250,4255,4260,4265,4270,4275,4280,4285,4290,4295,4300,4305,4310,4314,4319,4324,4329,4334,4339,4344,4349,4350,4355,4360,4365,4370,4375,4380,4385,4390,4395,4400,4405,4410,4415,4420,4425,4430,4435,4440,4445,4450,4455,4460,4465,4470,4475,4480,4485,4490,4495,4500,4505,4510,4515,4520,4525],{"path":4125,"stem":4126,"title":4127,"date":4107,"chapterOrder":4128,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++ Development Environment Setup and Testing","0100",0,{"path":4131,"stem":4132,"title":4133,"date":4107,"chapterOrder":4134,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++ Basics","0200",{"path":4136,"stem":4137,"title":4138,"date":4107,"chapterOrder":4139,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","Data Types and Data Storage","0300",{"path":4141,"stem":4142,"title":4143,"date":4107,"chapterOrder":4144,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","Input and Output","0400",{"path":4146,"stem":4147,"title":4148,"date":4107,"chapterOrder":4149,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","operator","0500",{"path":4151,"stem":4152,"title":4153,"date":4107,"chapterOrder":4154,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","program flow structure","0600",{"path":4156,"stem":4157,"title":4158,"date":4107,"chapterOrder":4159,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","array","0700",{"path":4161,"stem":4162,"title":4163,"date":4107,"chapterOrder":4164,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","Functions and Header Files","0800",{"path":4166,"stem":4167,"title":4168,"date":4107,"chapterOrder":4169,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","pointer","0900",{"path":4171,"stem":4172,"title":4173,"date":4107,"chapterOrder":4174,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","Structures and Unions","1000",{"path":4176,"stem":4177,"title":4178,"date":4107,"chapterOrder":4179,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","Memory Partitioning and Lifecycle","1100",{"path":4181,"stem":4182,"title":4183,"date":4107,"chapterOrder":4184,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","reference","1200",{"path":4186,"stem":4187,"title":4188,"date":4107,"chapterOrder":4189,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao-yu-ming-ming-kong-jian","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高与命名空间","Advanced Functions and Namespaces","1300",{"path":4191,"stem":4192,"title":4193,"date":4107,"chapterOrder":4194,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","encapsulation","1400-0100",{"path":4196,"stem":4197,"title":4198,"date":4107,"chapterOrder":4199,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","Object initialization and cleanup","1400-0200",{"path":4201,"stem":4202,"title":4203,"date":4107,"chapterOrder":4204,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","Object Model and the `this` Pointer","1400-0300",{"path":4206,"stem":4207,"title":4208,"date":4107,"chapterOrder":4209,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","Friends and operator overloading","1400-0400",{"path":4211,"stem":4212,"title":4213,"date":4107,"chapterOrder":4214,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","inheritance","1400-0500",{"path":4216,"stem":4217,"title":4218,"date":4107,"chapterOrder":4219,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","polymorphism","1400-0600",{"path":4221,"stem":4222,"title":4223,"date":4107,"chapterOrder":4224,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","Classes and Objects","1400",{"path":4226,"stem":4227,"title":4228,"date":4107,"chapterOrder":4229,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","File operations","1500",{"path":4231,"stem":4232,"title":4233,"date":4107,"chapterOrder":4234,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","异常处理","1600",{"path":4236,"stem":4237,"title":4238,"date":4107,"chapterOrder":4239,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","template","1700",{"path":4241,"stem":4242,"title":4243,"date":4107,"chapterOrder":4244,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","Introduction to STL","1800-0100",{"path":4246,"stem":4247,"title":4248,"date":4107,"chapterOrder":4249,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array","1800-0200",{"path":4251,"stem":4252,"title":4253,"date":4107,"chapterOrder":4254,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string container","1800-0300",{"path":4256,"stem":4257,"title":4258,"date":4107,"chapterOrder":4259,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器","1800-0400",{"path":4261,"stem":4262,"title":4263,"date":4107,"chapterOrder":4264,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器","1800-0500",{"path":4266,"stem":4267,"title":4268,"date":4107,"chapterOrder":4269,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器","1800-0600",{"path":4271,"stem":4272,"title":4273,"date":4107,"chapterOrder":4274,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue container","1800-0700",{"path":4276,"stem":4277,"title":4278,"date":4107,"chapterOrder":4279,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器","1800-0800",{"path":4281,"stem":4282,"title":4283,"date":4107,"chapterOrder":4284,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器","1800-0900",{"path":4286,"stem":4287,"title":4288,"date":4107,"chapterOrder":4289,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器","1800-1000",{"path":4291,"stem":4292,"title":4293,"date":4107,"chapterOrder":4294,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","Function objects and predicates","1800-1100",{"path":4296,"stem":4297,"title":4298,"date":4107,"chapterOrder":4299,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","Common algorithms","1800-1200",{"path":4301,"stem":4302,"title":4303,"date":4107,"chapterOrder":4304,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","Level up your programming with STL.","1800",{"path":4306,"stem":4307,"title":4308,"date":4107,"chapterOrder":4309,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++ Type Casting","1900",{"path":4311,"stem":4312,"title":2271,"date":4107,"chapterOrder":4313,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","2000-0100",{"path":4315,"stem":4316,"title":4317,"date":4107,"chapterOrder":4318,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr","2000-0200",{"path":4320,"stem":4321,"title":4322,"date":4107,"chapterOrder":4323,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","using","2000-0300",{"path":4325,"stem":4326,"title":4327,"date":4107,"chapterOrder":4328,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class","2000-0400",{"path":4330,"stem":4331,"title":4332,"date":4107,"chapterOrder":4333,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","range-based for loop","2000-0500",{"path":4335,"stem":4336,"title":4337,"date":4107,"chapterOrder":4338,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","structured binding","2000-0600",{"path":4340,"stem":4341,"title":4342,"date":4107,"chapterOrder":4343,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr","2000-0700",{"path":4345,"stem":4346,"title":4347,"date":4107,"chapterOrder":4348,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII","2000-0800",{"path":4105,"stem":4121,"title":5,"date":4107,"chapterOrder":4106,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},{"path":4351,"stem":4352,"title":4353,"date":4107,"chapterOrder":4354,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","Rvalue references and move semantics","2000-1000",{"path":4356,"stem":4357,"title":4358,"date":4107,"chapterOrder":4359,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda expression","2000-1100",{"path":4361,"stem":4362,"title":4363,"date":4107,"chapterOrder":4364,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function","2000-1200",{"path":4366,"stem":4367,"title":4368,"date":4107,"chapterOrder":4369,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind","2000-1300",{"path":4371,"stem":4372,"title":4373,"date":4107,"chapterOrder":4374,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional","2000-1400",{"path":4376,"stem":4377,"title":4378,"date":4107,"chapterOrder":4379,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant","2000-1500",{"path":4381,"stem":4382,"title":4383,"date":4107,"chapterOrder":4384,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span","2000-1600",{"path":4386,"stem":4387,"title":4388,"date":4107,"chapterOrder":4389,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print","2000-1700",{"path":4391,"stem":4392,"title":4393,"date":4107,"chapterOrder":4394,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono","2000-1800",{"path":4396,"stem":4397,"title":4398,"date":4107,"chapterOrder":4399,"chapterDepth":221,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread","std::thread and join","2000-1900-0100",{"path":4401,"stem":4402,"title":4403,"date":4107,"chapterOrder":4404,"chapterDepth":221,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-mutex-lock-guard","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-mutex-lock-guard","mutex 与 lock_guard","2000-1900-0200",{"path":4406,"stem":4407,"title":4408,"date":4107,"chapterOrder":4409,"chapterDepth":221,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-std-atomic","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-std-atomic","std::atomic","2000-1900-0300",{"path":4411,"stem":4412,"title":4413,"date":4107,"chapterOrder":4414,"chapterDepth":221,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0400-condition-variable","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0400-condition-variable","condition_variable","2000-1900-0400",{"path":4416,"stem":4417,"title":4418,"date":4107,"chapterOrder":4419,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bian-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发编程","Concurrent programming","2000-1900",{"path":4421,"stem":4422,"title":4423,"date":4107,"chapterOrder":4424,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem","2000-2000",{"path":4426,"stem":4427,"title":4428,"date":4107,"chapterOrder":4429,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","Modules Introduction","2000-2100",{"path":4431,"stem":4432,"title":4433,"date":4107,"chapterOrder":4434,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","Modern C++","2000",{"path":4436,"stem":4437,"title":4438,"date":4107,"chapterOrder":4439,"chapterDepth":221,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","Timers and Asynchronous I\u002FO","2100-0100-0100",{"path":4441,"stem":4442,"title":4443,"date":4107,"chapterOrder":4444,"chapterDepth":221,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Boost.Asio Basics","2100-0100-0200",{"path":4446,"stem":4447,"title":4448,"date":4107,"chapterOrder":4449,"chapterDepth":221,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","serial communication","2100-0100-0300",{"path":4451,"stem":4452,"title":4453,"date":4107,"chapterOrder":4454,"chapterDepth":221,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP communication","2100-0100-0400",{"path":4456,"stem":4457,"title":4458,"date":4107,"chapterOrder":4459,"chapterDepth":221,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP communication","2100-0100-0500",{"path":4461,"stem":4462,"title":4463,"date":4107,"chapterOrder":4464,"chapterDepth":221,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","Robot Engineering Approach and ROS2 Integration","2100-0100-0600",{"path":4466,"stem":4467,"title":4468,"date":4107,"chapterOrder":4469,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio asynchronous IO library","2100-0100",{"path":4471,"stem":4472,"title":4473,"date":4107,"chapterOrder":4474,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen linear algebra library","2100-0200",{"path":4476,"stem":4477,"title":4478,"date":4107,"chapterOrder":4479,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV Computer Vision Library","2100-0300",{"path":4481,"stem":4482,"title":4483,"date":4107,"chapterOrder":4484,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL Point Cloud Library","2100-0400",{"path":4486,"stem":4487,"title":4488,"date":4107,"chapterOrder":4489,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus Lie group and Lie algebra library","2100-0500",{"path":4491,"stem":4492,"title":4493,"date":4107,"chapterOrder":4494,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","Learning Common Libraries","2100",{"path":4496,"stem":4497,"title":4498,"date":4107,"chapterOrder":4499,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets and Build Installation","2200-0100",{"path":4501,"stem":4502,"title":4503,"date":4107,"chapterOrder":4504,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","Top-level CMake and Public Compilation Options","2200-0200",{"path":4506,"stem":4507,"title":4508,"date":4107,"chapterOrder":4509,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","Detailed CMake Explanation for src and lib Modules","2200-0300",{"path":4511,"stem":4512,"title":4513,"date":4107,"chapterOrder":4514,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","How to write third-party library dependencies","2200-0400",{"path":4516,"stem":4517,"title":4518,"date":4107,"chapterOrder":4519,"chapterDepth":210,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","Template Extensions and FAQ","2200-0500",{"path":4521,"stem":4522,"title":4523,"date":4107,"chapterOrder":4524,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":4114},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake Project Template","2200",{"path":4110,"stem":4526,"title":4527,"date":4107,"chapterOrder":4115,"chapterDepth":4129,"docKey":4109,"docRoot":4110,"docTitle":4111,"isWikiDoc":240,"isWikiIndex":240},"_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++ tutorial",{"variants":4529},[4530,4531,4534,4537,4540],{"path":4105,"localeSlug":4117,"i18nKey":4113},{"path":4532,"localeSlug":4533,"i18nKey":4113},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","zh-hant",{"path":4535,"localeSlug":4536,"i18nKey":4113},"\u002Fzh-hk\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","zh-hk",{"path":4538,"localeSlug":4539,"i18nKey":4113},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","zh-tw",{"path":4541,"localeSlug":4542,"i18nKey":4113},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","zh-cn",[4105,4120,4532,4120,4535,4120,4538,4120,4541,4120],1784646867817]