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