[{"data":1,"prerenderedAt":2963},["ShallowReactive",2],{"wiki-page-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii":3,"wiki-doc-items-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii":2541,"language-switcher-data-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii":2947,"wiki-i18n-paths-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii":2962},{"id":4,"title":5,"body":6,"canonicalPath":2523,"chapterDepth":32,"chapterOrder":2524,"date":2525,"description":24,"docI18nKey":2526,"docKey":2527,"docRoot":2528,"docTitle":2529,"extension":2530,"i18nKey":2531,"isBlogPost":2532,"isWikiDoc":216,"isWikiIndex":2532,"layout":2533,"legacyPath":2533,"locale":2534,"localeSlug":2535,"meta":2536,"navigation":216,"path":2523,"seo":2537,"sourcePath":2538,"sourceStem":2531,"stem":2539,"wikiDepth":32,"__hash__":2540},"content\u002F_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII.md","RAII",{"type":7,"value":8,"toc":2504},"minimark",[9,14,18,86,100,108,112,115,139,146,150,157,161,176,180,260,264,373,377,382,879,885,893,897,1263,1267,1273,1277,1542,1546,1552,1556,1559,2105,2109,2115,2119,2122,2126,2129,2132,2236,2240,2245,2278,2285,2290,2329,2332,2337,2396,2399,2402,2419,2422,2466,2470,2500],[10,11,13],"h2",{"id":12},"what-problem-does-this-section-solve","What problem does this section solve?",[15,16,17],"p",{},"In C programming, we often encounter this type of code:",[19,20,25],"pre",{"className":21,"code":22,"language":23,"meta":24,"style":24},"language-cpp shiki shiki-themes github-light github-dark","FILE* f = fopen(\"data.txt\", \"r\");\n\u002F\u002F ... 使用文件 ...\nfclose(f);  \u002F\u002F 容易忘记！\n","cpp","",[26,27,28,67,74],"code",{"__ignoreMap":24},[29,30,33,37,41,44,47,51,54,58,61,64],"span",{"class":31,"line":32},"line",1,[29,34,36],{"class":35},"sVt8B","FILE",[29,38,40],{"class":39},"szBVR","*",[29,42,43],{"class":35}," f ",[29,45,46],{"class":39},"=",[29,48,50],{"class":49},"sScJk"," fopen",[29,52,53],{"class":35},"(",[29,55,57],{"class":56},"sZZnC","\"data.txt\"",[29,59,60],{"class":35},", ",[29,62,63],{"class":56},"\"r\"",[29,65,66],{"class":35},");\n",[29,68,70],{"class":31,"line":69},2,[29,71,73],{"class":72},"sJ8bj","\u002F\u002F ... 使用文件 ...\n",[29,75,77,80,83],{"class":31,"line":76},3,[29,78,79],{"class":49},"fclose",[29,81,82],{"class":35},"(f);",[29,84,85],{"class":72},"  \u002F\u002F 容易忘记！\n",[15,87,88,89,91,92,95,96,99],{},"If there's an early return in the middle or an exception is thrown, ",[26,90,79],{}," won't execute, causing a resource leak. Similar issues arise with memory (",[26,93,94],{},"malloc\u002Ffree","), locks (",[26,97,98],{},"lock\u002Funlock","), sockets, and all other resources that require an \"acquire-release\" pattern.",[15,101,102,103,107],{},"RAII leverages the deterministic lifecycle of C++ objects to ",[104,105,106],"strong",{},"automatically manage resources",", freeing you from manual cleanup.",[10,109,111],{"id":110},"what-is-this-feature","What is this feature?",[15,113,114],{},"RAII (Resource Acquisition Is Initialization) is the most important resource management idiom in C++.",[116,117,118,126,132],"ul",{},[119,120,121,122,125],"li",{},"Getting resources in the ",[104,123,124],{},"constructor",".",[119,127,128,131],{},[104,129,130],{},"Release resources"," in the destructor.",[119,133,134,135,138],{},"When an object goes out of scope, its destructor is ",[104,136,137],{},"always"," called.",[15,140,141,142,145],{},"This is one of the ",[104,143,144],{},"core design philosophies"," that distinguishes C++ from C and other languages, with smart pointers, lock_guard, and fstream being implementations of RAII.",[10,147,149],{"id":148},"c-standard-version","C++ standard version",[15,151,152,153,156],{},"C++98 (RAII has existed since the inception of C++, with modern RAII tools like smart pointers and ",[26,154,155],{},"lock_guard"," maturing in C++11).",[10,158,160],{"id":159},"required-header-files","Required header files",[15,162,163,164,167,168,171,172,175],{},"RAII is a programming concept that does not require specific header files. However, the implementation of RAII is scattered in various places: ",[26,165,166],{},"\u003Cmemory>"," (smart pointers), ",[26,169,170],{},"\u003Cmutex>"," (locks), ",[26,173,174],{},"\u003Cfstream>"," (file streams), etc.",[10,177,179],{"id":178},"basic-syntax","Basic Syntax",[19,181,183],{"className":21,"code":182,"language":23,"meta":24,"style":24},"class RAIIExample\n{\n    Resource* res;  \u002F\u002F 管理的资源\n\npublic:\n    RAIIExample() : res(获取资源) { }   \u002F\u002F 构造：获取资源\n    ~RAIIExample() { 释放资源; }        \u002F\u002F 析构：释放资源\n};\n",[26,184,185,193,198,211,218,224,242,254],{"__ignoreMap":24},[29,186,187,190],{"class":31,"line":32},[29,188,189],{"class":39},"class",[29,191,192],{"class":49}," RAIIExample\n",[29,194,195],{"class":31,"line":69},[29,196,197],{"class":35},"{\n",[29,199,200,203,205,208],{"class":31,"line":76},[29,201,202],{"class":35},"    Resource",[29,204,40],{"class":39},[29,206,207],{"class":35}," res;",[29,209,210],{"class":72},"  \u002F\u002F 管理的资源\n",[29,212,214],{"class":31,"line":213},4,[29,215,217],{"emptyLinePlaceholder":216},true,"\n",[29,219,221],{"class":31,"line":220},5,[29,222,223],{"class":39},"public:\n",[29,225,227,230,233,236,239],{"class":31,"line":226},6,[29,228,229],{"class":49},"    RAIIExample",[29,231,232],{"class":35},"() : ",[29,234,235],{"class":49},"res",[29,237,238],{"class":35},"(获取资源) { }",[29,240,241],{"class":72},"   \u002F\u002F 构造：获取资源\n",[29,243,245,248,251],{"class":31,"line":244},7,[29,246,247],{"class":49},"    ~RAIIExample",[29,249,250],{"class":35},"() { 释放资源; }",[29,252,253],{"class":72},"        \u002F\u002F 析构：释放资源\n",[29,255,257],{"class":31,"line":256},8,[29,258,259],{"class":35},"};\n",[10,261,263],{"id":262},"common-raii-implementations","Common RAII Implementations",[265,266,267,284],"table",{},[268,269,270],"thead",{},[271,272,273,278,281],"tr",{},[274,275,277],"th",{"align":276},"left","RAII types",[274,279,280],{"align":276},"resource management",[274,282,283],{"align":276},"Header file",[285,286,287,302,316,330,344,358],"tbody",{},[271,288,289,295,298],{},[290,291,292],"td",{"align":276},[26,293,294],{},"std::unique_ptr",[290,296,297],{"align":276},"Dynamic memory",[290,299,300],{"align":276},[26,301,166],{},[271,303,304,309,312],{},[290,305,306],{"align":276},[26,307,308],{},"std::shared_ptr",[290,310,311],{"align":276},"Dynamic Memory (Shared)",[290,313,314],{"align":276},[26,315,166],{},[271,317,318,323,326],{},[290,319,320],{"align":276},[26,321,322],{},"std::lock_guard",[290,324,325],{"align":276},"Mutex",[290,327,328],{"align":276},[26,329,170],{},[271,331,332,337,340],{},[290,333,334],{"align":276},[26,335,336],{},"std::unique_lock",[290,338,339],{"align":276},"Mutex (Flexible)",[290,341,342],{"align":276},[26,343,170],{},[271,345,346,351,354],{},[290,347,348],{"align":276},[26,349,350],{},"std::fstream",[290,352,353],{"align":276},"file handle",[290,355,356],{"align":276},[26,357,174],{},[271,359,360,365,368],{},[290,361,362],{"align":276},[26,363,364],{},"std::thread",[290,366,367],{"align":276},"Thread (requires join\u002Fdetach)",[290,369,370],{"align":276},[26,371,372],{},"\u003Cthread>",[10,374,376],{"id":375},"example-code","Example code",[378,379,381],"h3",{"id":380},"example-1-problems-without-raii-vs-with-raii","Example 1: Problems Without RAII vs. With RAII",[19,383,385],{"className":21,"code":384,"language":23,"meta":24,"style":24},"#include \u003Ciostream>\n\n\u002F\u002F 模拟一个资源\nclass Resource\n{\npublic:\n    void open()  { std::cout \u003C\u003C \"Resource opened\\n\"; }\n    void close() { std::cout \u003C\u003C \"Resource closed\\n\"; }\n    void use()   { std::cout \u003C\u003C \"Resource used\\n\"; }\n};\n\n\u002F\u002F ❌ 手动管理：容易忘记 close\nvoid no_raii()\n{\n    Resource r;\n    r.open();\n    r.use();\n    \u002F\u002F 如果这里抛异常或提前 return，close 不会执行！\n    r.close();\n}\n\n\u002F\u002F ✅ RAII：利用析构函数自动释放\nclass ResourceGuard\n{\n    Resource& r;\npublic:\n    ResourceGuard(Resource& res) : r(res)\n    {\n        r.open();  \u002F\u002F 构造时获取资源\n    }\n    ~ResourceGuard()\n    {\n        r.close(); \u002F\u002F 析构时释放资源\n    }\n};\n\nvoid with_raii()\n{\n    Resource r;\n    ResourceGuard guard(r);  \u002F\u002F 构造时 open\n    r.use();\n    \u002F\u002F guard 离开作用域，析构函数自动 close\n}\n\nint main()\n{\n    std::cout \u003C\u003C \"=== no_raii ===\\n\";\n    no_raii();\n\n    std::cout \u003C\u003C \"\\n=== with_raii ===\\n\";\n    with_raii();\n\n    return 0;\n}\n",[26,386,387,395,399,404,411,415,419,452,477,503,508,513,519,531,536,542,554,564,570,580,586,591,597,605,610,621,626,652,658,672,678,686,691,703,708,713,718,728,733,738,753,762,768,773,778,789,794,814,822,827,850,858,863,874],{"__ignoreMap":24},[29,388,389,392],{"class":31,"line":32},[29,390,391],{"class":39},"#include",[29,393,394],{"class":56}," \u003Ciostream>\n",[29,396,397],{"class":31,"line":69},[29,398,217],{"emptyLinePlaceholder":216},[29,400,401],{"class":31,"line":76},[29,402,403],{"class":72},"\u002F\u002F 模拟一个资源\n",[29,405,406,408],{"class":31,"line":213},[29,407,189],{"class":39},[29,409,410],{"class":49}," Resource\n",[29,412,413],{"class":31,"line":220},[29,414,197],{"class":35},[29,416,417],{"class":31,"line":226},[29,418,223],{"class":39},[29,420,421,424,427,430,433,436,439,442,446,449],{"class":31,"line":244},[29,422,423],{"class":39},"    void",[29,425,426],{"class":49}," open",[29,428,429],{"class":35},"()  { ",[29,431,432],{"class":49},"std",[29,434,435],{"class":35},"::cout ",[29,437,438],{"class":39},"\u003C\u003C",[29,440,441],{"class":56}," \"Resource opened",[29,443,445],{"class":444},"sj4cs","\\n",[29,447,448],{"class":56},"\"",[29,450,451],{"class":35},"; }\n",[29,453,454,456,459,462,464,466,468,471,473,475],{"class":31,"line":256},[29,455,423],{"class":39},[29,457,458],{"class":49}," close",[29,460,461],{"class":35},"() { ",[29,463,432],{"class":49},[29,465,435],{"class":35},[29,467,438],{"class":39},[29,469,470],{"class":56}," \"Resource closed",[29,472,445],{"class":444},[29,474,448],{"class":56},[29,476,451],{"class":35},[29,478,480,482,485,488,490,492,494,497,499,501],{"class":31,"line":479},9,[29,481,423],{"class":39},[29,483,484],{"class":49}," use",[29,486,487],{"class":35},"()   { ",[29,489,432],{"class":49},[29,491,435],{"class":35},[29,493,438],{"class":39},[29,495,496],{"class":56}," \"Resource used",[29,498,445],{"class":444},[29,500,448],{"class":56},[29,502,451],{"class":35},[29,504,506],{"class":31,"line":505},10,[29,507,259],{"class":35},[29,509,511],{"class":31,"line":510},11,[29,512,217],{"emptyLinePlaceholder":216},[29,514,516],{"class":31,"line":515},12,[29,517,518],{"class":72},"\u002F\u002F ❌ 手动管理：容易忘记 close\n",[29,520,522,525,528],{"class":31,"line":521},13,[29,523,524],{"class":39},"void",[29,526,527],{"class":49}," no_raii",[29,529,530],{"class":35},"()\n",[29,532,534],{"class":31,"line":533},14,[29,535,197],{"class":35},[29,537,539],{"class":31,"line":538},15,[29,540,541],{"class":35},"    Resource r;\n",[29,543,545,548,551],{"class":31,"line":544},16,[29,546,547],{"class":35},"    r.",[29,549,550],{"class":49},"open",[29,552,553],{"class":35},"();\n",[29,555,557,559,562],{"class":31,"line":556},17,[29,558,547],{"class":35},[29,560,561],{"class":49},"use",[29,563,553],{"class":35},[29,565,567],{"class":31,"line":566},18,[29,568,569],{"class":72},"    \u002F\u002F 如果这里抛异常或提前 return，close 不会执行！\n",[29,571,573,575,578],{"class":31,"line":572},19,[29,574,547],{"class":35},[29,576,577],{"class":49},"close",[29,579,553],{"class":35},[29,581,583],{"class":31,"line":582},20,[29,584,585],{"class":35},"}\n",[29,587,589],{"class":31,"line":588},21,[29,590,217],{"emptyLinePlaceholder":216},[29,592,594],{"class":31,"line":593},22,[29,595,596],{"class":72},"\u002F\u002F ✅ RAII：利用析构函数自动释放\n",[29,598,600,602],{"class":31,"line":599},23,[29,601,189],{"class":39},[29,603,604],{"class":49}," ResourceGuard\n",[29,606,608],{"class":31,"line":607},24,[29,609,197],{"class":35},[29,611,613,615,618],{"class":31,"line":612},25,[29,614,202],{"class":35},[29,616,617],{"class":39},"&",[29,619,620],{"class":35}," r;\n",[29,622,624],{"class":31,"line":623},26,[29,625,223],{"class":39},[29,627,629,632,634,637,639,643,646,649],{"class":31,"line":628},27,[29,630,631],{"class":49},"    ResourceGuard",[29,633,53],{"class":35},[29,635,636],{"class":49},"Resource",[29,638,617],{"class":39},[29,640,642],{"class":641},"s4XuR"," res",[29,644,645],{"class":35},") : ",[29,647,648],{"class":49},"r",[29,650,651],{"class":35},"(res)\n",[29,653,655],{"class":31,"line":654},28,[29,656,657],{"class":35},"    {\n",[29,659,661,664,666,669],{"class":31,"line":660},29,[29,662,663],{"class":35},"        r.",[29,665,550],{"class":49},[29,667,668],{"class":35},"();",[29,670,671],{"class":72},"  \u002F\u002F 构造时获取资源\n",[29,673,675],{"class":31,"line":674},30,[29,676,677],{"class":35},"    }\n",[29,679,681,684],{"class":31,"line":680},31,[29,682,683],{"class":49},"    ~ResourceGuard",[29,685,530],{"class":35},[29,687,689],{"class":31,"line":688},32,[29,690,657],{"class":35},[29,692,694,696,698,700],{"class":31,"line":693},33,[29,695,663],{"class":35},[29,697,577],{"class":49},[29,699,668],{"class":35},[29,701,702],{"class":72}," \u002F\u002F 析构时释放资源\n",[29,704,706],{"class":31,"line":705},34,[29,707,677],{"class":35},[29,709,711],{"class":31,"line":710},35,[29,712,259],{"class":35},[29,714,716],{"class":31,"line":715},36,[29,717,217],{"emptyLinePlaceholder":216},[29,719,721,723,726],{"class":31,"line":720},37,[29,722,524],{"class":39},[29,724,725],{"class":49}," with_raii",[29,727,530],{"class":35},[29,729,731],{"class":31,"line":730},38,[29,732,197],{"class":35},[29,734,736],{"class":31,"line":735},39,[29,737,541],{"class":35},[29,739,741,744,747,750],{"class":31,"line":740},40,[29,742,743],{"class":35},"    ResourceGuard ",[29,745,746],{"class":49},"guard",[29,748,749],{"class":35},"(r);",[29,751,752],{"class":72},"  \u002F\u002F 构造时 open\n",[29,754,756,758,760],{"class":31,"line":755},41,[29,757,547],{"class":35},[29,759,561],{"class":49},[29,761,553],{"class":35},[29,763,765],{"class":31,"line":764},42,[29,766,767],{"class":72},"    \u002F\u002F guard 离开作用域，析构函数自动 close\n",[29,769,771],{"class":31,"line":770},43,[29,772,585],{"class":35},[29,774,776],{"class":31,"line":775},44,[29,777,217],{"emptyLinePlaceholder":216},[29,779,781,784,787],{"class":31,"line":780},45,[29,782,783],{"class":39},"int",[29,785,786],{"class":49}," main",[29,788,530],{"class":35},[29,790,792],{"class":31,"line":791},46,[29,793,197],{"class":35},[29,795,797,800,802,804,807,809,811],{"class":31,"line":796},47,[29,798,799],{"class":49},"    std",[29,801,435],{"class":35},[29,803,438],{"class":39},[29,805,806],{"class":56}," \"=== no_raii ===",[29,808,445],{"class":444},[29,810,448],{"class":56},[29,812,813],{"class":35},";\n",[29,815,817,820],{"class":31,"line":816},48,[29,818,819],{"class":49},"    no_raii",[29,821,553],{"class":35},[29,823,825],{"class":31,"line":824},49,[29,826,217],{"emptyLinePlaceholder":216},[29,828,830,832,834,836,839,841,844,846,848],{"class":31,"line":829},50,[29,831,799],{"class":49},[29,833,435],{"class":35},[29,835,438],{"class":39},[29,837,838],{"class":56}," \"",[29,840,445],{"class":444},[29,842,843],{"class":56},"=== with_raii ===",[29,845,445],{"class":444},[29,847,448],{"class":56},[29,849,813],{"class":35},[29,851,853,856],{"class":31,"line":852},51,[29,854,855],{"class":49},"    with_raii",[29,857,553],{"class":35},[29,859,861],{"class":31,"line":860},52,[29,862,217],{"emptyLinePlaceholder":216},[29,864,866,869,872],{"class":31,"line":865},53,[29,867,868],{"class":39},"    return",[29,870,871],{"class":444}," 0",[29,873,813],{"class":35},[29,875,877],{"class":31,"line":876},54,[29,878,585],{"class":35},[15,880,881,884],{},[104,882,883],{},"Results","：",[19,886,891],{"className":887,"code":889,"language":890},[888],"language-text","=== no_raii ===\nResource opened\nResource used\nResource closed\n\n=== with_raii ===\nResource opened\nResource used\nResource closed\n","text",[26,892,889],{"__ignoreMap":24},[378,894,896],{"id":895},"example-2-building-on-example-1-using-lock_guard-to-understand-raii-lock-management","Example 2: Building on Example 1, using lock_guard to understand RAII lock management",[19,898,900],{"className":21,"code":899,"language":23,"meta":24,"style":24},"#include \u003Ciostream>\n#include \u003Cmutex>\n#include \u003Cthread>\n\nstd::mutex mtx;  \u002F\u002F 共享互斥量\nint counter = 0;\n\n\u002F\u002F ❌ 手动加锁解锁（容易出问题）\nvoid manual_lock()\n{\n    mtx.lock();\n    ++counter;\n    \u002F\u002F 如果这里抛异常，unlock 永远不会被执行！\n    mtx.unlock();\n}\n\n\u002F\u002F ✅ RAII 风格：lock_guard 自动管理锁\nvoid raii_lock()\n{\n    std::lock_guard\u003Cstd::mutex> lock(mtx);  \u002F\u002F 构造时 lock\n    ++counter;\n    \u002F\u002F lock 离开作用域，析构函数自动 unlock\n}\n\nint main()\n{\n    std::thread t1([] {\n        for (int i = 0; i \u003C 1000; ++i)\n            raii_lock();\n    });\n    std::thread t2([] {\n        for (int i = 0; i \u003C 1000; ++i)\n            raii_lock();\n    });\n\n    t1.join();\n    t2.join();\n\n    std::cout \u003C\u003C \"counter = \" \u003C\u003C counter \u003C\u003C \" (expected 2000)\\n\";\n\n    return 0;\n}\n",[26,901,902,908,915,922,926,936,949,953,958,967,971,981,989,994,1003,1007,1011,1016,1025,1029,1056,1062,1067,1071,1075,1083,1087,1100,1134,1141,1146,1157,1183,1189,1193,1197,1207,1216,1220,1247,1251,1259],{"__ignoreMap":24},[29,903,904,906],{"class":31,"line":32},[29,905,391],{"class":39},[29,907,394],{"class":56},[29,909,910,912],{"class":31,"line":69},[29,911,391],{"class":39},[29,913,914],{"class":56}," \u003Cmutex>\n",[29,916,917,919],{"class":31,"line":76},[29,918,391],{"class":39},[29,920,921],{"class":56}," \u003Cthread>\n",[29,923,924],{"class":31,"line":213},[29,925,217],{"emptyLinePlaceholder":216},[29,927,928,930,933],{"class":31,"line":220},[29,929,432],{"class":49},[29,931,932],{"class":35},"::mutex mtx;",[29,934,935],{"class":72},"  \u002F\u002F 共享互斥量\n",[29,937,938,940,943,945,947],{"class":31,"line":226},[29,939,783],{"class":39},[29,941,942],{"class":35}," counter ",[29,944,46],{"class":39},[29,946,871],{"class":444},[29,948,813],{"class":35},[29,950,951],{"class":31,"line":244},[29,952,217],{"emptyLinePlaceholder":216},[29,954,955],{"class":31,"line":256},[29,956,957],{"class":72},"\u002F\u002F ❌ 手动加锁解锁（容易出问题）\n",[29,959,960,962,965],{"class":31,"line":479},[29,961,524],{"class":39},[29,963,964],{"class":49}," manual_lock",[29,966,530],{"class":35},[29,968,969],{"class":31,"line":505},[29,970,197],{"class":35},[29,972,973,976,979],{"class":31,"line":510},[29,974,975],{"class":35},"    mtx.",[29,977,978],{"class":49},"lock",[29,980,553],{"class":35},[29,982,983,986],{"class":31,"line":515},[29,984,985],{"class":39},"    ++",[29,987,988],{"class":35},"counter;\n",[29,990,991],{"class":31,"line":521},[29,992,993],{"class":72},"    \u002F\u002F 如果这里抛异常，unlock 永远不会被执行！\n",[29,995,996,998,1001],{"class":31,"line":533},[29,997,975],{"class":35},[29,999,1000],{"class":49},"unlock",[29,1002,553],{"class":35},[29,1004,1005],{"class":31,"line":538},[29,1006,585],{"class":35},[29,1008,1009],{"class":31,"line":544},[29,1010,217],{"emptyLinePlaceholder":216},[29,1012,1013],{"class":31,"line":556},[29,1014,1015],{"class":72},"\u002F\u002F ✅ RAII 风格：lock_guard 自动管理锁\n",[29,1017,1018,1020,1023],{"class":31,"line":566},[29,1019,524],{"class":39},[29,1021,1022],{"class":49}," raii_lock",[29,1024,530],{"class":35},[29,1026,1027],{"class":31,"line":572},[29,1028,197],{"class":35},[29,1030,1031,1033,1036,1039,1041,1044,1047,1050,1053],{"class":31,"line":582},[29,1032,799],{"class":49},[29,1034,1035],{"class":35},"::lock_guard",[29,1037,1038],{"class":39},"\u003C",[29,1040,432],{"class":49},[29,1042,1043],{"class":35},"::mutex",[29,1045,1046],{"class":39},">",[29,1048,1049],{"class":49}," lock",[29,1051,1052],{"class":35},"(mtx);",[29,1054,1055],{"class":72},"  \u002F\u002F 构造时 lock\n",[29,1057,1058,1060],{"class":31,"line":588},[29,1059,985],{"class":39},[29,1061,988],{"class":35},[29,1063,1064],{"class":31,"line":593},[29,1065,1066],{"class":72},"    \u002F\u002F lock 离开作用域，析构函数自动 unlock\n",[29,1068,1069],{"class":31,"line":599},[29,1070,585],{"class":35},[29,1072,1073],{"class":31,"line":607},[29,1074,217],{"emptyLinePlaceholder":216},[29,1076,1077,1079,1081],{"class":31,"line":612},[29,1078,783],{"class":39},[29,1080,786],{"class":49},[29,1082,530],{"class":35},[29,1084,1085],{"class":31,"line":623},[29,1086,197],{"class":35},[29,1088,1089,1091,1094,1097],{"class":31,"line":628},[29,1090,799],{"class":49},[29,1092,1093],{"class":35},"::thread ",[29,1095,1096],{"class":49},"t1",[29,1098,1099],{"class":35},"([] {\n",[29,1101,1102,1105,1108,1110,1113,1115,1117,1120,1122,1125,1128,1131],{"class":31,"line":654},[29,1103,1104],{"class":39},"        for",[29,1106,1107],{"class":35}," (",[29,1109,783],{"class":39},[29,1111,1112],{"class":35}," i ",[29,1114,46],{"class":39},[29,1116,871],{"class":444},[29,1118,1119],{"class":35},"; i ",[29,1121,1038],{"class":39},[29,1123,1124],{"class":444}," 1000",[29,1126,1127],{"class":35},"; ",[29,1129,1130],{"class":39},"++",[29,1132,1133],{"class":35},"i)\n",[29,1135,1136,1139],{"class":31,"line":660},[29,1137,1138],{"class":49},"            raii_lock",[29,1140,553],{"class":35},[29,1142,1143],{"class":31,"line":674},[29,1144,1145],{"class":35},"    });\n",[29,1147,1148,1150,1152,1155],{"class":31,"line":680},[29,1149,799],{"class":49},[29,1151,1093],{"class":35},[29,1153,1154],{"class":49},"t2",[29,1156,1099],{"class":35},[29,1158,1159,1161,1163,1165,1167,1169,1171,1173,1175,1177,1179,1181],{"class":31,"line":688},[29,1160,1104],{"class":39},[29,1162,1107],{"class":35},[29,1164,783],{"class":39},[29,1166,1112],{"class":35},[29,1168,46],{"class":39},[29,1170,871],{"class":444},[29,1172,1119],{"class":35},[29,1174,1038],{"class":39},[29,1176,1124],{"class":444},[29,1178,1127],{"class":35},[29,1180,1130],{"class":39},[29,1182,1133],{"class":35},[29,1184,1185,1187],{"class":31,"line":693},[29,1186,1138],{"class":49},[29,1188,553],{"class":35},[29,1190,1191],{"class":31,"line":705},[29,1192,1145],{"class":35},[29,1194,1195],{"class":31,"line":710},[29,1196,217],{"emptyLinePlaceholder":216},[29,1198,1199,1202,1205],{"class":31,"line":715},[29,1200,1201],{"class":35},"    t1.",[29,1203,1204],{"class":49},"join",[29,1206,553],{"class":35},[29,1208,1209,1212,1214],{"class":31,"line":720},[29,1210,1211],{"class":35},"    t2.",[29,1213,1204],{"class":49},[29,1215,553],{"class":35},[29,1217,1218],{"class":31,"line":730},[29,1219,217],{"emptyLinePlaceholder":216},[29,1221,1222,1224,1226,1228,1231,1234,1236,1238,1241,1243,1245],{"class":31,"line":735},[29,1223,799],{"class":49},[29,1225,435],{"class":35},[29,1227,438],{"class":39},[29,1229,1230],{"class":56}," \"counter = \"",[29,1232,1233],{"class":39}," \u003C\u003C",[29,1235,942],{"class":35},[29,1237,438],{"class":39},[29,1239,1240],{"class":56}," \" (expected 2000)",[29,1242,445],{"class":444},[29,1244,448],{"class":56},[29,1246,813],{"class":35},[29,1248,1249],{"class":31,"line":740},[29,1250,217],{"emptyLinePlaceholder":216},[29,1252,1253,1255,1257],{"class":31,"line":755},[29,1254,868],{"class":39},[29,1256,871],{"class":444},[29,1258,813],{"class":35},[29,1260,1261],{"class":31,"line":764},[29,1262,585],{"class":35},[15,1264,1265,884],{},[104,1266,883],{},[19,1268,1271],{"className":1269,"code":1270,"language":890},[888],"counter = 2000 (expected 2000)\n",[26,1272,1270],{"__ignoreMap":24},[378,1274,1276],{"id":1275},"example-3-building-on-example-2-understanding-file-raii-using-fstream","Example 3: Building on Example 2, understanding file RAII using fstream.",[19,1278,1280],{"className":21,"code":1279,"language":23,"meta":24,"style":24},"#include \u003Ciostream>\n#include \u003Cfstream>\n#include \u003Cstring>\n\n\u002F\u002F RAII：fstream 在析构时会自动关闭文件\nvoid write_and_read()\n{\n    \u002F\u002F 写文件\n    {\n        std::ofstream out(\"raii_test.txt\");\n        out \u003C\u003C \"Hello RAII!\\n\";\n        out \u003C\u003C \"This is line 2.\\n\";\n        \u002F\u002F out 离开作用域，文件自动关闭\n    }\n\n    \u002F\u002F 读文件\n    {\n        std::ifstream in(\"raii_test.txt\");\n        std::string line;\n        while (std::getline(in, line))\n        {\n            std::cout \u003C\u003C line \u003C\u003C \"\\n\";\n        }\n        \u002F\u002F in 离开作用域，文件自动关闭\n    }\n}\n\nint main()\n{\n    write_and_read();\n    std::cout \u003C\u003C \"File was automatically closed by RAII\\n\";\n    return 0;\n}\n",[26,1281,1282,1288,1295,1302,1306,1311,1320,1324,1329,1333,1351,1367,1382,1387,1391,1395,1400,1404,1420,1427,1445,1450,1472,1477,1482,1486,1490,1494,1502,1506,1513,1530,1538],{"__ignoreMap":24},[29,1283,1284,1286],{"class":31,"line":32},[29,1285,391],{"class":39},[29,1287,394],{"class":56},[29,1289,1290,1292],{"class":31,"line":69},[29,1291,391],{"class":39},[29,1293,1294],{"class":56}," \u003Cfstream>\n",[29,1296,1297,1299],{"class":31,"line":76},[29,1298,391],{"class":39},[29,1300,1301],{"class":56}," \u003Cstring>\n",[29,1303,1304],{"class":31,"line":213},[29,1305,217],{"emptyLinePlaceholder":216},[29,1307,1308],{"class":31,"line":220},[29,1309,1310],{"class":72},"\u002F\u002F RAII：fstream 在析构时会自动关闭文件\n",[29,1312,1313,1315,1318],{"class":31,"line":226},[29,1314,524],{"class":39},[29,1316,1317],{"class":49}," write_and_read",[29,1319,530],{"class":35},[29,1321,1322],{"class":31,"line":244},[29,1323,197],{"class":35},[29,1325,1326],{"class":31,"line":256},[29,1327,1328],{"class":72},"    \u002F\u002F 写文件\n",[29,1330,1331],{"class":31,"line":479},[29,1332,657],{"class":35},[29,1334,1335,1338,1341,1344,1346,1349],{"class":31,"line":505},[29,1336,1337],{"class":49},"        std",[29,1339,1340],{"class":35},"::ofstream ",[29,1342,1343],{"class":49},"out",[29,1345,53],{"class":35},[29,1347,1348],{"class":56},"\"raii_test.txt\"",[29,1350,66],{"class":35},[29,1352,1353,1356,1358,1361,1363,1365],{"class":31,"line":510},[29,1354,1355],{"class":35},"        out ",[29,1357,438],{"class":39},[29,1359,1360],{"class":56}," \"Hello RAII!",[29,1362,445],{"class":444},[29,1364,448],{"class":56},[29,1366,813],{"class":35},[29,1368,1369,1371,1373,1376,1378,1380],{"class":31,"line":515},[29,1370,1355],{"class":35},[29,1372,438],{"class":39},[29,1374,1375],{"class":56}," \"This is line 2.",[29,1377,445],{"class":444},[29,1379,448],{"class":56},[29,1381,813],{"class":35},[29,1383,1384],{"class":31,"line":521},[29,1385,1386],{"class":72},"        \u002F\u002F out 离开作用域，文件自动关闭\n",[29,1388,1389],{"class":31,"line":533},[29,1390,677],{"class":35},[29,1392,1393],{"class":31,"line":538},[29,1394,217],{"emptyLinePlaceholder":216},[29,1396,1397],{"class":31,"line":544},[29,1398,1399],{"class":72},"    \u002F\u002F 读文件\n",[29,1401,1402],{"class":31,"line":556},[29,1403,657],{"class":35},[29,1405,1406,1408,1411,1414,1416,1418],{"class":31,"line":566},[29,1407,1337],{"class":49},[29,1409,1410],{"class":35},"::ifstream ",[29,1412,1413],{"class":49},"in",[29,1415,53],{"class":35},[29,1417,1348],{"class":56},[29,1419,66],{"class":35},[29,1421,1422,1424],{"class":31,"line":572},[29,1423,1337],{"class":49},[29,1425,1426],{"class":35},"::string line;\n",[29,1428,1429,1432,1434,1436,1439,1442],{"class":31,"line":582},[29,1430,1431],{"class":39},"        while",[29,1433,1107],{"class":35},[29,1435,432],{"class":49},[29,1437,1438],{"class":35},"::",[29,1440,1441],{"class":49},"getline",[29,1443,1444],{"class":35},"(in, line))\n",[29,1446,1447],{"class":31,"line":588},[29,1448,1449],{"class":35},"        {\n",[29,1451,1452,1455,1457,1459,1462,1464,1466,1468,1470],{"class":31,"line":593},[29,1453,1454],{"class":49},"            std",[29,1456,435],{"class":35},[29,1458,438],{"class":39},[29,1460,1461],{"class":35}," line ",[29,1463,438],{"class":39},[29,1465,838],{"class":56},[29,1467,445],{"class":444},[29,1469,448],{"class":56},[29,1471,813],{"class":35},[29,1473,1474],{"class":31,"line":599},[29,1475,1476],{"class":35},"        }\n",[29,1478,1479],{"class":31,"line":607},[29,1480,1481],{"class":72},"        \u002F\u002F in 离开作用域，文件自动关闭\n",[29,1483,1484],{"class":31,"line":612},[29,1485,677],{"class":35},[29,1487,1488],{"class":31,"line":623},[29,1489,585],{"class":35},[29,1491,1492],{"class":31,"line":628},[29,1493,217],{"emptyLinePlaceholder":216},[29,1495,1496,1498,1500],{"class":31,"line":654},[29,1497,783],{"class":39},[29,1499,786],{"class":49},[29,1501,530],{"class":35},[29,1503,1504],{"class":31,"line":660},[29,1505,197],{"class":35},[29,1507,1508,1511],{"class":31,"line":674},[29,1509,1510],{"class":49},"    write_and_read",[29,1512,553],{"class":35},[29,1514,1515,1517,1519,1521,1524,1526,1528],{"class":31,"line":680},[29,1516,799],{"class":49},[29,1518,435],{"class":35},[29,1520,438],{"class":39},[29,1522,1523],{"class":56}," \"File was automatically closed by RAII",[29,1525,445],{"class":444},[29,1527,448],{"class":56},[29,1529,813],{"class":35},[29,1531,1532,1534,1536],{"class":31,"line":688},[29,1533,868],{"class":39},[29,1535,871],{"class":444},[29,1537,813],{"class":35},[29,1539,1540],{"class":31,"line":693},[29,1541,585],{"class":35},[15,1543,1544,884],{},[104,1545,883],{},[19,1547,1550],{"className":1548,"code":1549,"language":890},[888],"Hello RAII!\nThis is line 2.\nFile was automatically closed by RAII\n",[26,1551,1549],{"__ignoreMap":24},[378,1553,1555],{"id":1554},"example-4-building-on-example-3-the-value-of-raii-becomes-apparent-only-when-theres-an-early-return","Example 4: Building on Example 3, the value of RAII becomes apparent only when there's an early return.",[15,1557,1558],{},"This example deliberately simulates \"discovering invalid data during processing and making an early return.\" In a normal flow, manual release and RAII look similar, but once there are multiple return paths, the difference becomes obvious.",[19,1560,1562],{"className":21,"code":1561,"language":23,"meta":24,"style":24},"#include \u003Ciostream>\n#include \u003Cstring>\n#include \u003Cutility>\n#include \u003Cvector>\n\nclass Connection\n{\n    std::string name_;\n\npublic:\n    explicit Connection(std::string name) : name_(std::move(name))\n    {\n        std::cout \u003C\u003C name_ \u003C\u003C \" connected\\n\";\n    }\n\n    ~Connection()\n    {\n        std::cout \u003C\u003C name_ \u003C\u003C \" disconnected\\n\";\n    }\n\n    void send(const std::string& msg)\n    {\n        std::cout \u003C\u003C name_ \u003C\u003C \" send: \" \u003C\u003C msg \u003C\u003C \"\\n\";\n    }\n};\n\nbool upload_with_raii(const std::vector\u003Cstd::string>& lines)\n{\n    Connection conn(\"server\"); \u002F\u002F 构造时连接，函数结束时自动断开\n\n    for (const auto& line : lines)\n    {\n        if (line.empty())\n        {\n            std::cout \u003C\u003C \"empty line, stop upload\\n\";\n            return false; \u002F\u002F conn 仍然会析构\n        }\n\n        conn.send(line);\n    }\n\n    return true; \u002F\u002F conn 也会析构\n}\n\nint main()\n{\n    std::vector\u003Cstd::string> data = {\"hello\", \"world\", \"\", \"after error\"};\n\n    bool ok = upload_with_raii(data);\n    std::cout \u003C\u003C \"upload ok = \" \u003C\u003C std::boolalpha \u003C\u003C ok \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[26,1563,1564,1570,1576,1583,1590,1594,1601,1605,1612,1616,1620,1657,1661,1683,1687,1691,1698,1702,1723,1727,1731,1758,1762,1792,1796,1800,1804,1840,1844,1863,1867,1882,1886,1900,1904,1921,1935,1939,1943,1954,1958,1962,1974,1978,1982,1990,1994,2038,2042,2057,2089,2093,2101],{"__ignoreMap":24},[29,1565,1566,1568],{"class":31,"line":32},[29,1567,391],{"class":39},[29,1569,394],{"class":56},[29,1571,1572,1574],{"class":31,"line":69},[29,1573,391],{"class":39},[29,1575,1301],{"class":56},[29,1577,1578,1580],{"class":31,"line":76},[29,1579,391],{"class":39},[29,1581,1582],{"class":56}," \u003Cutility>\n",[29,1584,1585,1587],{"class":31,"line":213},[29,1586,391],{"class":39},[29,1588,1589],{"class":56}," \u003Cvector>\n",[29,1591,1592],{"class":31,"line":220},[29,1593,217],{"emptyLinePlaceholder":216},[29,1595,1596,1598],{"class":31,"line":226},[29,1597,189],{"class":39},[29,1599,1600],{"class":49}," Connection\n",[29,1602,1603],{"class":31,"line":244},[29,1604,197],{"class":35},[29,1606,1607,1609],{"class":31,"line":256},[29,1608,799],{"class":49},[29,1610,1611],{"class":35},"::string name_;\n",[29,1613,1614],{"class":31,"line":479},[29,1615,217],{"emptyLinePlaceholder":216},[29,1617,1618],{"class":31,"line":505},[29,1619,223],{"class":39},[29,1621,1622,1625,1628,1630,1632,1634,1637,1640,1642,1645,1647,1649,1651,1654],{"class":31,"line":510},[29,1623,1624],{"class":39},"    explicit",[29,1626,1627],{"class":49}," Connection",[29,1629,53],{"class":35},[29,1631,432],{"class":49},[29,1633,1438],{"class":35},[29,1635,1636],{"class":49},"string",[29,1638,1639],{"class":641}," name",[29,1641,645],{"class":35},[29,1643,1644],{"class":49},"name_",[29,1646,53],{"class":35},[29,1648,432],{"class":49},[29,1650,1438],{"class":35},[29,1652,1653],{"class":49},"move",[29,1655,1656],{"class":35},"(name))\n",[29,1658,1659],{"class":31,"line":515},[29,1660,657],{"class":35},[29,1662,1663,1665,1667,1669,1672,1674,1677,1679,1681],{"class":31,"line":521},[29,1664,1337],{"class":49},[29,1666,435],{"class":35},[29,1668,438],{"class":39},[29,1670,1671],{"class":35}," name_ ",[29,1673,438],{"class":39},[29,1675,1676],{"class":56}," \" connected",[29,1678,445],{"class":444},[29,1680,448],{"class":56},[29,1682,813],{"class":35},[29,1684,1685],{"class":31,"line":533},[29,1686,677],{"class":35},[29,1688,1689],{"class":31,"line":538},[29,1690,217],{"emptyLinePlaceholder":216},[29,1692,1693,1696],{"class":31,"line":544},[29,1694,1695],{"class":49},"    ~Connection",[29,1697,530],{"class":35},[29,1699,1700],{"class":31,"line":556},[29,1701,657],{"class":35},[29,1703,1704,1706,1708,1710,1712,1714,1717,1719,1721],{"class":31,"line":566},[29,1705,1337],{"class":49},[29,1707,435],{"class":35},[29,1709,438],{"class":39},[29,1711,1671],{"class":35},[29,1713,438],{"class":39},[29,1715,1716],{"class":56}," \" disconnected",[29,1718,445],{"class":444},[29,1720,448],{"class":56},[29,1722,813],{"class":35},[29,1724,1725],{"class":31,"line":572},[29,1726,677],{"class":35},[29,1728,1729],{"class":31,"line":582},[29,1730,217],{"emptyLinePlaceholder":216},[29,1732,1733,1735,1738,1740,1743,1746,1748,1750,1752,1755],{"class":31,"line":588},[29,1734,423],{"class":39},[29,1736,1737],{"class":49}," send",[29,1739,53],{"class":35},[29,1741,1742],{"class":39},"const",[29,1744,1745],{"class":49}," std",[29,1747,1438],{"class":35},[29,1749,1636],{"class":49},[29,1751,617],{"class":39},[29,1753,1754],{"class":641}," msg",[29,1756,1757],{"class":35},")\n",[29,1759,1760],{"class":31,"line":593},[29,1761,657],{"class":35},[29,1763,1764,1766,1768,1770,1772,1774,1777,1779,1782,1784,1786,1788,1790],{"class":31,"line":599},[29,1765,1337],{"class":49},[29,1767,435],{"class":35},[29,1769,438],{"class":39},[29,1771,1671],{"class":35},[29,1773,438],{"class":39},[29,1775,1776],{"class":56}," \" send: \"",[29,1778,1233],{"class":39},[29,1780,1781],{"class":35}," msg ",[29,1783,438],{"class":39},[29,1785,838],{"class":56},[29,1787,445],{"class":444},[29,1789,448],{"class":56},[29,1791,813],{"class":35},[29,1793,1794],{"class":31,"line":607},[29,1795,677],{"class":35},[29,1797,1798],{"class":31,"line":612},[29,1799,259],{"class":35},[29,1801,1802],{"class":31,"line":623},[29,1803,217],{"emptyLinePlaceholder":216},[29,1805,1806,1809,1812,1814,1816,1818,1820,1823,1825,1827,1829,1831,1833,1835,1838],{"class":31,"line":628},[29,1807,1808],{"class":39},"bool",[29,1810,1811],{"class":49}," upload_with_raii",[29,1813,53],{"class":35},[29,1815,1742],{"class":39},[29,1817,1745],{"class":49},[29,1819,1438],{"class":35},[29,1821,1822],{"class":49},"vector",[29,1824,1038],{"class":35},[29,1826,432],{"class":49},[29,1828,1438],{"class":35},[29,1830,1636],{"class":49},[29,1832,1046],{"class":35},[29,1834,617],{"class":39},[29,1836,1837],{"class":641}," lines",[29,1839,1757],{"class":35},[29,1841,1842],{"class":31,"line":654},[29,1843,197],{"class":35},[29,1845,1846,1849,1852,1854,1857,1860],{"class":31,"line":660},[29,1847,1848],{"class":35},"    Connection ",[29,1850,1851],{"class":49},"conn",[29,1853,53],{"class":35},[29,1855,1856],{"class":56},"\"server\"",[29,1858,1859],{"class":35},");",[29,1861,1862],{"class":72}," \u002F\u002F 构造时连接，函数结束时自动断开\n",[29,1864,1865],{"class":31,"line":674},[29,1866,217],{"emptyLinePlaceholder":216},[29,1868,1869,1872,1874,1876,1879],{"class":31,"line":680},[29,1870,1871],{"class":39},"    for",[29,1873,1107],{"class":35},[29,1875,1742],{"class":39},[29,1877,1878],{"class":39}," auto&",[29,1880,1881],{"class":35}," line : lines)\n",[29,1883,1884],{"class":31,"line":688},[29,1885,657],{"class":35},[29,1887,1888,1891,1894,1897],{"class":31,"line":693},[29,1889,1890],{"class":39},"        if",[29,1892,1893],{"class":35}," (line.",[29,1895,1896],{"class":49},"empty",[29,1898,1899],{"class":35},"())\n",[29,1901,1902],{"class":31,"line":705},[29,1903,1449],{"class":35},[29,1905,1906,1908,1910,1912,1915,1917,1919],{"class":31,"line":710},[29,1907,1454],{"class":49},[29,1909,435],{"class":35},[29,1911,438],{"class":39},[29,1913,1914],{"class":56}," \"empty line, stop upload",[29,1916,445],{"class":444},[29,1918,448],{"class":56},[29,1920,813],{"class":35},[29,1922,1923,1926,1929,1932],{"class":31,"line":715},[29,1924,1925],{"class":39},"            return",[29,1927,1928],{"class":444}," false",[29,1930,1931],{"class":35},";",[29,1933,1934],{"class":72}," \u002F\u002F conn 仍然会析构\n",[29,1936,1937],{"class":31,"line":720},[29,1938,1476],{"class":35},[29,1940,1941],{"class":31,"line":730},[29,1942,217],{"emptyLinePlaceholder":216},[29,1944,1945,1948,1951],{"class":31,"line":735},[29,1946,1947],{"class":35},"        conn.",[29,1949,1950],{"class":49},"send",[29,1952,1953],{"class":35},"(line);\n",[29,1955,1956],{"class":31,"line":740},[29,1957,677],{"class":35},[29,1959,1960],{"class":31,"line":755},[29,1961,217],{"emptyLinePlaceholder":216},[29,1963,1964,1966,1969,1971],{"class":31,"line":764},[29,1965,868],{"class":39},[29,1967,1968],{"class":444}," true",[29,1970,1931],{"class":35},[29,1972,1973],{"class":72}," \u002F\u002F conn 也会析构\n",[29,1975,1976],{"class":31,"line":770},[29,1977,585],{"class":35},[29,1979,1980],{"class":31,"line":775},[29,1981,217],{"emptyLinePlaceholder":216},[29,1983,1984,1986,1988],{"class":31,"line":780},[29,1985,783],{"class":39},[29,1987,786],{"class":49},[29,1989,530],{"class":35},[29,1991,1992],{"class":31,"line":791},[29,1993,197],{"class":35},[29,1995,1996,1998,2001,2003,2005,2008,2010,2013,2015,2018,2021,2023,2026,2028,2031,2033,2036],{"class":31,"line":796},[29,1997,799],{"class":49},[29,1999,2000],{"class":35},"::vector",[29,2002,1038],{"class":39},[29,2004,432],{"class":49},[29,2006,2007],{"class":35},"::string",[29,2009,1046],{"class":39},[29,2011,2012],{"class":35}," data ",[29,2014,46],{"class":39},[29,2016,2017],{"class":35}," {",[29,2019,2020],{"class":56},"\"hello\"",[29,2022,60],{"class":35},[29,2024,2025],{"class":56},"\"world\"",[29,2027,60],{"class":35},[29,2029,2030],{"class":56},"\"\"",[29,2032,60],{"class":35},[29,2034,2035],{"class":56},"\"after error\"",[29,2037,259],{"class":35},[29,2039,2040],{"class":31,"line":816},[29,2041,217],{"emptyLinePlaceholder":216},[29,2043,2044,2047,2050,2052,2054],{"class":31,"line":824},[29,2045,2046],{"class":39},"    bool",[29,2048,2049],{"class":35}," ok ",[29,2051,46],{"class":39},[29,2053,1811],{"class":49},[29,2055,2056],{"class":35},"(data);\n",[29,2058,2059,2061,2063,2065,2068,2070,2072,2075,2077,2079,2081,2083,2085,2087],{"class":31,"line":829},[29,2060,799],{"class":49},[29,2062,435],{"class":35},[29,2064,438],{"class":39},[29,2066,2067],{"class":56}," \"upload ok = \"",[29,2069,1233],{"class":39},[29,2071,1745],{"class":49},[29,2073,2074],{"class":35},"::boolalpha ",[29,2076,438],{"class":39},[29,2078,2049],{"class":35},[29,2080,438],{"class":39},[29,2082,838],{"class":56},[29,2084,445],{"class":444},[29,2086,448],{"class":56},[29,2088,813],{"class":35},[29,2090,2091],{"class":31,"line":852},[29,2092,217],{"emptyLinePlaceholder":216},[29,2094,2095,2097,2099],{"class":31,"line":860},[29,2096,868],{"class":39},[29,2098,871],{"class":444},[29,2100,813],{"class":35},[29,2102,2103],{"class":31,"line":865},[29,2104,585],{"class":35},[15,2106,2107,884],{},[104,2108,883],{},[19,2110,2113],{"className":2111,"code":2112,"language":890},[888],"server connected\nserver send: hello\nserver send: world\nempty line, stop upload\nserver disconnected\nupload ok = false\n",[26,2114,2112],{"__ignoreMap":24},[10,2116,2118],{"id":2117},"runtime-results","runtime results",[15,2120,2121],{},"See the \"running results\" for each example above.",[10,2123,2125],{"id":2124},"key-syntax-explanation-in-the-example","Key syntax explanation in the example",[15,2127,2128],{},"|Here is the translation of the provided Simplified Chinese Markdown fragment into natural American English, following all specified rules.",[2130,2131],"hr",{},[265,2133,2134,2155],{},[268,2135,2136],{},[271,2137,2138,2143,2146,2149,2152],{},[274,2139,2140],{"align":276},[104,2141,2142],{},"Example",[274,2144,2145],{"align":276},"Discusses what",[274,2147,2148],{"align":276},"Newly emerged syntax",[274,2150,2151],{"align":276},"Why write it this way",[274,2153,2154],{"align":276},"Precautions",[285,2156,2157,2174,2193,2216],{},[271,2158,2159,2162,2165,2168,2171],{},[290,2160,2161],{"align":276},"Example 1",[290,2163,2164],{"align":276},"RAII Fundamentals",[290,2166,2167],{"align":276},"Constructors acquire, destructors release.",[290,2169,2170],{"align":276},"Demonstrates the problems of manual management and RAII solutions",[290,2172,2173],{"align":276},"RAII's \"guaranteed destructor execution\" is a core guarantee of C++.",[271,2175,2176,2179,2182,2187,2190],{},[290,2177,2178],{"align":276},"Example 2",[290,2180,2181],{"align":276},"lock_guard is RAII",[290,2183,2184],{"align":276},[26,2185,2186],{},"std::lock_guard\u003Cstd::mutex>",[290,2188,2189],{"align":276},"Lock on construction, unlock on destruction, exception safety",[290,2191,2192],{"align":276},"Much safer than manual lock\u002Funlock",[271,2194,2195,2198,2201,2210,2213],{},[290,2196,2197],{"align":276},"Example 3",[290,2199,2200],{"align":276},"fstream is an example of RAII.",[290,2202,2203,2206,2207],{"align":276},[26,2204,2205],{},"std::ofstream","、",[26,2208,2209],{},"std::ifstream",[290,2211,2212],{"align":276},"Open the file in the constructor, close it in the destructor.",[290,2214,2215],{"align":276},"No need to explicitly write close",[271,2217,2218,2221,2224,2230,2233],{},[290,2219,2220],{"align":276},"Example 4",[290,2222,2223],{"align":276},"RAII in multiple return paths",[290,2225,2226,2227],{"align":276},"Constructor\u002FDestructor, advanced ",[26,2228,2229],{},"return",[290,2231,2232],{"align":276},"In real-world engineering, early returns are common, and RAII ensures that resources are still properly released.",[290,2234,2235],{"align":276},"Resource objects should be placed in the correct scope.",[10,2237,2239],{"id":2238},"common-errors","Common Errors",[15,2241,2242],{},[104,2243,2244],{},"Error 1: Throwing exceptions in destructors",[19,2246,2248],{"className":21,"code":2247,"language":23,"meta":24,"style":24},"~MyRAII()\n{\n    cleanup();  \u002F\u002F 如果 cleanup 抛异常...\n}\n",[26,2249,2250,2260,2264,2274],{"__ignoreMap":24},[29,2251,2252,2255,2258],{"class":31,"line":32},[29,2253,2254],{"class":39},"~",[29,2256,2257],{"class":49},"MyRAII",[29,2259,530],{"class":35},[29,2261,2262],{"class":31,"line":69},[29,2263,197],{"class":35},[29,2265,2266,2269,2271],{"class":31,"line":76},[29,2267,2268],{"class":49},"    cleanup",[29,2270,668],{"class":35},[29,2272,2273],{"class":72},"  \u002F\u002F 如果 cleanup 抛异常...\n",[29,2275,2276],{"class":31,"line":213},[29,2277,585],{"class":35},[15,2279,2280,2281,2284],{},"If a destructor throws an exception while another exception is already propagating, the program will simply crash. Destructors should be marked as ",[26,2282,2283],{},"noexcept"," and catch all exceptions.",[15,2286,2287],{},[104,2288,2289],{},"Error 2: Creating RAII objects on the heap",[19,2291,2293],{"className":21,"code":2292,"language":23,"meta":24,"style":24},"auto* guard = new std::lock_guard\u003Cstd::mutex>(mtx);  \u002F\u002F ❌ 永远不会自动析构！\n",[26,2294,2295],{"__ignoreMap":24},[29,2296,2297,2300,2303,2305,2308,2310,2312,2314,2316,2318,2320,2323,2326],{"class":31,"line":32},[29,2298,2299],{"class":39},"auto*",[29,2301,2302],{"class":35}," guard ",[29,2304,46],{"class":39},[29,2306,2307],{"class":39}," new",[29,2309,1745],{"class":49},[29,2311,1438],{"class":35},[29,2313,155],{"class":49},[29,2315,1038],{"class":35},[29,2317,432],{"class":49},[29,2319,1438],{"class":35},[29,2321,2322],{"class":49},"mutex",[29,2324,2325],{"class":35},">(mtx);",[29,2327,2328],{"class":72},"  \u002F\u002F ❌ 永远不会自动析构！\n",[15,2330,2331],{},"Correct practice: RAII objects must be created on the stack to leverage the characteristic of automatic destruction when going out of scope.",[15,2333,2334],{},[104,2335,2336],{},"Error 3: Forgetting the scope of RAII objects",[19,2338,2340],{"className":21,"code":2339,"language":23,"meta":24,"style":24},"void func()\n{\n    std::lock_guard\u003Cstd::mutex> lock(mtx);\n    \u002F\u002F 锁在这里面生效\n}  \u002F\u002F 离开作用域，解锁\n\n\u002F\u002F 在外面访问共享数据没有保护！\n",[26,2341,2342,2351,2355,2374,2379,2387,2391],{"__ignoreMap":24},[29,2343,2344,2346,2349],{"class":31,"line":32},[29,2345,524],{"class":39},[29,2347,2348],{"class":49}," func",[29,2350,530],{"class":35},[29,2352,2353],{"class":31,"line":69},[29,2354,197],{"class":35},[29,2356,2357,2359,2361,2363,2365,2367,2369,2371],{"class":31,"line":76},[29,2358,799],{"class":49},[29,2360,1035],{"class":35},[29,2362,1038],{"class":39},[29,2364,432],{"class":49},[29,2366,1043],{"class":35},[29,2368,1046],{"class":39},[29,2370,1049],{"class":49},[29,2372,2373],{"class":35},"(mtx);\n",[29,2375,2376],{"class":31,"line":213},[29,2377,2378],{"class":72},"    \u002F\u002F 锁在这里面生效\n",[29,2380,2381,2384],{"class":31,"line":220},[29,2382,2383],{"class":35},"}",[29,2385,2386],{"class":72},"  \u002F\u002F 离开作用域，解锁\n",[29,2388,2389],{"class":31,"line":226},[29,2390,217],{"emptyLinePlaceholder":216},[29,2392,2393],{"class":31,"line":244},[29,2394,2395],{"class":72},"\u002F\u002F 在外面访问共享数据没有保护！\n",[15,2397,2398],{},"Best Practice: Ensure that shared data is accessed within the lock's scope.",[10,2400,2401],{"id":2401},"使用建议",[116,2403,2404,2407,2410,2413,2416],{},[119,2405,2406],{},"明确目标：在开始前确定您的具体需求，以便选择最合适的工具或教程。",[119,2408,2409],{},"充分利用资源：参考官方文档、教程和博客，这些资料能帮助您快速上手并解决问题。",[119,2411,2412],{},"实践应用：通过动手操作项目或编写代码来巩固学习成果，提升实际操作能力。",[119,2414,2415],{},"问题解决：遇到困难时，查阅参考资料或寻求社区支持，逐步培养独立解决问题的能力。",[119,2417,2418],{},"分享经验：完成项目后，可以撰写文章或博客分享心得，帮助其他学习者。",[15,2420,2421],{},"如果需要针对特定领域（如单片机、机器人或环境搭建）的进一步建议，请提供更多信息，我将为您细化内容。",[2423,2424,2425,2431,2436,2442,2450,2456],"ol",{},[119,2426,2427,2430],{},[104,2428,2429],{},"\"Use RAII for acquire\u002Frelease pairs\"",": This is the fundamental principle of resource management in C++.",[119,2432,2433],{},[104,2434,2435],{},"Never manually new\u002Fdelete, lock\u002Funlock, open\u002Fclose: use smart pointers, lock_guard, fstream.",[119,2437,2438,2441],{},[104,2439,2440],{},"RAII objects must be on the stack",": Use scope to automatically trigger destruction.",[119,2443,2444,2447,2448,125],{},[104,2445,2446],{},"Destructors must never throw exceptions",": marked with ",[26,2449,2283],{},[119,2451,2452,2455],{},[104,2453,2454],{},"Understanding RAII is to understand C++'s core design philosophy",": later smart pointers and concurrent programming are all built upon RAII.",[119,2457,2458,2461,2462,2465],{},[104,2459,2460],{},"To control resource holding time using scope",": If you want to release resources earlier, place the RAII object in a smaller ",[26,2463,2464],{},"{}"," scope.",[10,2467,2469],{"id":2468},"summary","Summary",[116,2471,2472,2475,2478,2488,2494,2497],{},[119,2473,2474],{},"RAII = Resource Acquisition Is Initialization, is the most core resource management idiom in C++.",[119,2476,2477],{},"Acquire resources at construction, release them at destruction, and guarantee release when leaving the scope.",[119,2479,2480,60,2482,2484,2485,2487],{},[26,2481,294],{},[26,2483,322],{},", and ",[26,2486,350],{}," are all RAII.",[119,2489,2490,2491,2493],{},"The value of RAII is most apparent in cases with multiple ",[26,2492,2229],{},", exceptions, and complex branches.",[119,2495,2496],{},"Never throw exceptions in destructors.",[119,2498,2499],{},"Understanding RAII lays the foundation for comprehending smart pointers and concurrent programming.",[2501,2502,2503],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}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);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":24,"searchDepth":69,"depth":69,"links":2505},[2506,2507,2508,2509,2510,2511,2512,2518,2519,2520,2521,2522],{"id":12,"depth":69,"text":13},{"id":110,"depth":69,"text":111},{"id":148,"depth":69,"text":149},{"id":159,"depth":69,"text":160},{"id":178,"depth":69,"text":179},{"id":262,"depth":69,"text":263},{"id":375,"depth":69,"text":376,"children":2513},[2514,2515,2516,2517],{"id":380,"depth":76,"text":381},{"id":895,"depth":76,"text":896},{"id":1275,"depth":76,"text":1276},{"id":1554,"depth":76,"text":1555},{"id":2117,"depth":69,"text":2118},{"id":2124,"depth":69,"text":2125},{"id":2238,"depth":69,"text":2239},{"id":2401,"depth":69,"text":2401},{"id":2468,"depth":69,"text":2469},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","2000-0800","2023-10-05","wiki\u002F2023-10-05-cplusplus-jiao-xue","en-us:2023-10-05-cplusplus-jiao-xue","\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII",false,null,"en-US","en-us",{},{"title":5,"description":24},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","KBC82-kW8LaLdGnB4mlxfyzxz8jTZpm86QLGCfcyJDs",[2542,2548,2553,2558,2563,2568,2573,2578,2583,2588,2593,2598,2603,2608,2613,2618,2623,2628,2633,2638,2643,2648,2653,2658,2663,2668,2673,2678,2683,2688,2693,2698,2703,2708,2713,2718,2723,2728,2733,2738,2743,2748,2753,2758,2763,2764,2769,2774,2779,2784,2789,2794,2799,2804,2809,2814,2819,2824,2829,2834,2839,2844,2849,2854,2859,2864,2869,2874,2879,2884,2889,2894,2899,2904,2909,2914,2919,2924,2929,2934,2939,2944],{"path":2543,"stem":2544,"title":2545,"date":2525,"chapterOrder":2546,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++ Development Environment Setup and Testing","0100",0,{"path":2549,"stem":2550,"title":2551,"date":2525,"chapterOrder":2552,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++ Basics","0200",{"path":2554,"stem":2555,"title":2556,"date":2525,"chapterOrder":2557,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","Data Types and Data Storage","0300",{"path":2559,"stem":2560,"title":2561,"date":2525,"chapterOrder":2562,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","Input and Output","0400",{"path":2564,"stem":2565,"title":2566,"date":2525,"chapterOrder":2567,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","operator","0500",{"path":2569,"stem":2570,"title":2571,"date":2525,"chapterOrder":2572,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","program flow structure","0600",{"path":2574,"stem":2575,"title":2576,"date":2525,"chapterOrder":2577,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","array","0700",{"path":2579,"stem":2580,"title":2581,"date":2525,"chapterOrder":2582,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","Functions and Header Files","0800",{"path":2584,"stem":2585,"title":2586,"date":2525,"chapterOrder":2587,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","pointer","0900",{"path":2589,"stem":2590,"title":2591,"date":2525,"chapterOrder":2592,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","Structures and Unions","1000",{"path":2594,"stem":2595,"title":2596,"date":2525,"chapterOrder":2597,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","Memory Partitioning and Lifecycle","1100",{"path":2599,"stem":2600,"title":2601,"date":2525,"chapterOrder":2602,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","reference","1200",{"path":2604,"stem":2605,"title":2606,"date":2525,"chapterOrder":2607,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao-yu-ming-ming-kong-jian","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高与命名空间","Advanced Functions and Namespaces","1300",{"path":2609,"stem":2610,"title":2611,"date":2525,"chapterOrder":2612,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","encapsulation","1400-0100",{"path":2614,"stem":2615,"title":2616,"date":2525,"chapterOrder":2617,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","Object initialization and cleanup","1400-0200",{"path":2619,"stem":2620,"title":2621,"date":2525,"chapterOrder":2622,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","Object Model and the `this` Pointer","1400-0300",{"path":2624,"stem":2625,"title":2626,"date":2525,"chapterOrder":2627,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","Friends and operator overloading","1400-0400",{"path":2629,"stem":2630,"title":2631,"date":2525,"chapterOrder":2632,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","inheritance","1400-0500",{"path":2634,"stem":2635,"title":2636,"date":2525,"chapterOrder":2637,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","polymorphism","1400-0600",{"path":2639,"stem":2640,"title":2641,"date":2525,"chapterOrder":2642,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","Classes and Objects","1400",{"path":2644,"stem":2645,"title":2646,"date":2525,"chapterOrder":2647,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","File operations","1500",{"path":2649,"stem":2650,"title":2651,"date":2525,"chapterOrder":2652,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","异常处理","1600",{"path":2654,"stem":2655,"title":2656,"date":2525,"chapterOrder":2657,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","template","1700",{"path":2659,"stem":2660,"title":2661,"date":2525,"chapterOrder":2662,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","Introduction to STL","1800-0100",{"path":2664,"stem":2665,"title":2666,"date":2525,"chapterOrder":2667,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array","1800-0200",{"path":2669,"stem":2670,"title":2671,"date":2525,"chapterOrder":2672,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string container","1800-0300",{"path":2674,"stem":2675,"title":2676,"date":2525,"chapterOrder":2677,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器","1800-0400",{"path":2679,"stem":2680,"title":2681,"date":2525,"chapterOrder":2682,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器","1800-0500",{"path":2684,"stem":2685,"title":2686,"date":2525,"chapterOrder":2687,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器","1800-0600",{"path":2689,"stem":2690,"title":2691,"date":2525,"chapterOrder":2692,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue container","1800-0700",{"path":2694,"stem":2695,"title":2696,"date":2525,"chapterOrder":2697,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器","1800-0800",{"path":2699,"stem":2700,"title":2701,"date":2525,"chapterOrder":2702,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器","1800-0900",{"path":2704,"stem":2705,"title":2706,"date":2525,"chapterOrder":2707,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器","1800-1000",{"path":2709,"stem":2710,"title":2711,"date":2525,"chapterOrder":2712,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","Function objects and predicates","1800-1100",{"path":2714,"stem":2715,"title":2716,"date":2525,"chapterOrder":2717,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","Common algorithms","1800-1200",{"path":2719,"stem":2720,"title":2721,"date":2525,"chapterOrder":2722,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","Level up your programming with STL.","1800",{"path":2724,"stem":2725,"title":2726,"date":2525,"chapterOrder":2727,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++ Type Casting","1900",{"path":2729,"stem":2730,"title":2731,"date":2525,"chapterOrder":2732,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","auto","2000-0100",{"path":2734,"stem":2735,"title":2736,"date":2525,"chapterOrder":2737,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr","2000-0200",{"path":2739,"stem":2740,"title":2741,"date":2525,"chapterOrder":2742,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","using","2000-0300",{"path":2744,"stem":2745,"title":2746,"date":2525,"chapterOrder":2747,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class","2000-0400",{"path":2749,"stem":2750,"title":2751,"date":2525,"chapterOrder":2752,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","range-based for loop","2000-0500",{"path":2754,"stem":2755,"title":2756,"date":2525,"chapterOrder":2757,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","structured binding","2000-0600",{"path":2759,"stem":2760,"title":2761,"date":2525,"chapterOrder":2762,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr","2000-0700",{"path":2523,"stem":2539,"title":5,"date":2525,"chapterOrder":2524,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},{"path":2765,"stem":2766,"title":2767,"date":2525,"chapterOrder":2768,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","Smart pointer","2000-0900",{"path":2770,"stem":2771,"title":2772,"date":2525,"chapterOrder":2773,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","Rvalue references and move semantics","2000-1000",{"path":2775,"stem":2776,"title":2777,"date":2525,"chapterOrder":2778,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda expression","2000-1100",{"path":2780,"stem":2781,"title":2782,"date":2525,"chapterOrder":2783,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function","2000-1200",{"path":2785,"stem":2786,"title":2787,"date":2525,"chapterOrder":2788,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind","2000-1300",{"path":2790,"stem":2791,"title":2792,"date":2525,"chapterOrder":2793,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional","2000-1400",{"path":2795,"stem":2796,"title":2797,"date":2525,"chapterOrder":2798,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant","2000-1500",{"path":2800,"stem":2801,"title":2802,"date":2525,"chapterOrder":2803,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span","2000-1600",{"path":2805,"stem":2806,"title":2807,"date":2525,"chapterOrder":2808,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print","2000-1700",{"path":2810,"stem":2811,"title":2812,"date":2525,"chapterOrder":2813,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono","2000-1800",{"path":2815,"stem":2816,"title":2817,"date":2525,"chapterOrder":2818,"chapterDepth":69,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread","std::thread and join","2000-1900-0100",{"path":2820,"stem":2821,"title":2822,"date":2525,"chapterOrder":2823,"chapterDepth":69,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-mutex-lock-guard","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-mutex-lock-guard","mutex 与 lock_guard","2000-1900-0200",{"path":2825,"stem":2826,"title":2827,"date":2525,"chapterOrder":2828,"chapterDepth":69,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-std-atomic","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-std-atomic","std::atomic","2000-1900-0300",{"path":2830,"stem":2831,"title":2832,"date":2525,"chapterOrder":2833,"chapterDepth":69,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0400-condition-variable","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0400-condition-variable","condition_variable","2000-1900-0400",{"path":2835,"stem":2836,"title":2837,"date":2525,"chapterOrder":2838,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bian-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发编程","Concurrent programming","2000-1900",{"path":2840,"stem":2841,"title":2842,"date":2525,"chapterOrder":2843,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem","2000-2000",{"path":2845,"stem":2846,"title":2847,"date":2525,"chapterOrder":2848,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","Modules Introduction","2000-2100",{"path":2850,"stem":2851,"title":2852,"date":2525,"chapterOrder":2853,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","Modern C++","2000",{"path":2855,"stem":2856,"title":2857,"date":2525,"chapterOrder":2858,"chapterDepth":69,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","Timers and Asynchronous I\u002FO","2100-0100-0100",{"path":2860,"stem":2861,"title":2862,"date":2525,"chapterOrder":2863,"chapterDepth":69,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Boost.Asio Basics","2100-0100-0200",{"path":2865,"stem":2866,"title":2867,"date":2525,"chapterOrder":2868,"chapterDepth":69,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","serial communication","2100-0100-0300",{"path":2870,"stem":2871,"title":2872,"date":2525,"chapterOrder":2873,"chapterDepth":69,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP communication","2100-0100-0400",{"path":2875,"stem":2876,"title":2877,"date":2525,"chapterOrder":2878,"chapterDepth":69,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP communication","2100-0100-0500",{"path":2880,"stem":2881,"title":2882,"date":2525,"chapterOrder":2883,"chapterDepth":69,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","Robot Engineering Approach and ROS2 Integration","2100-0100-0600",{"path":2885,"stem":2886,"title":2887,"date":2525,"chapterOrder":2888,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio asynchronous IO library","2100-0100",{"path":2890,"stem":2891,"title":2892,"date":2525,"chapterOrder":2893,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen linear algebra library","2100-0200",{"path":2895,"stem":2896,"title":2897,"date":2525,"chapterOrder":2898,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV Computer Vision Library","2100-0300",{"path":2900,"stem":2901,"title":2902,"date":2525,"chapterOrder":2903,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL Point Cloud Library","2100-0400",{"path":2905,"stem":2906,"title":2907,"date":2525,"chapterOrder":2908,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus Lie group and Lie algebra library","2100-0500",{"path":2910,"stem":2911,"title":2912,"date":2525,"chapterOrder":2913,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","Learning Common Libraries","2100",{"path":2915,"stem":2916,"title":2917,"date":2525,"chapterOrder":2918,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets and Build Installation","2200-0100",{"path":2920,"stem":2921,"title":2922,"date":2525,"chapterOrder":2923,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","Top-level CMake and Public Compilation Options","2200-0200",{"path":2925,"stem":2926,"title":2927,"date":2525,"chapterOrder":2928,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","Detailed CMake Explanation for src and lib Modules","2200-0300",{"path":2930,"stem":2931,"title":2932,"date":2525,"chapterOrder":2933,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","How to write third-party library dependencies","2200-0400",{"path":2935,"stem":2936,"title":2937,"date":2525,"chapterOrder":2938,"chapterDepth":32,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","Template Extensions and FAQ","2200-0500",{"path":2940,"stem":2941,"title":2942,"date":2525,"chapterOrder":2943,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":2532},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake Project Template","2200",{"path":2528,"stem":2945,"title":2946,"date":2525,"chapterOrder":2533,"chapterDepth":2547,"docKey":2527,"docRoot":2528,"docTitle":2529,"isWikiDoc":216,"isWikiIndex":216},"_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++ tutorial",{"variants":2948},[2949,2950,2953,2956,2959],{"path":2523,"localeSlug":2535,"i18nKey":2531},{"path":2951,"localeSlug":2952,"i18nKey":2531},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","zh-hant",{"path":2954,"localeSlug":2955,"i18nKey":2531},"\u002Fzh-hk\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","zh-hk",{"path":2957,"localeSlug":2958,"i18nKey":2531},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","zh-tw",{"path":2960,"localeSlug":2961,"i18nKey":2531},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","zh-cn",[2523,2538,2951,2538,2954,2538,2957,2538,2960,2538],1784646867540]