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