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