[{"data":1,"prerenderedAt":2934},["ShallowReactive",2],{"wiki-page-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-8-raii":3,"wiki-doc-items-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-8-raii":2504,"language-switcher-data-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-8-raii":2918,"wiki-i18n-paths-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-8-raii":2933},{"id":4,"title":5,"body":6,"canonicalPath":2486,"chapter":2487,"chapterSort":2488,"date":2489,"description":23,"docI18nKey":2490,"docKey":2491,"docRoot":2492,"docTitle":2493,"extension":2494,"i18nKey":2495,"isBlogPost":2496,"isWikiDoc":207,"isWikiIndex":2496,"layout":2497,"legacyPath":2498,"locale":2499,"localeSlug":2500,"meta":2501,"navigation":207,"path":2486,"seo":2502,"sourcePath":2498,"sourceStem":2495,"stem":2495,"wikiDepth":31,"__hash__":2503},"content/wiki/2023-10-05-Cplusplus教学/ch18-8-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// ... 使用文件 ...\nfclose(f);  // 容易忘记！\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","// ... 使用文件 ...\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},"  // 容易忘记！\n",[14,86,87,88,90,91,94,95,98],{},"如果中间提前 return，或是抛出了异常，",[25,89,78],{}," 就不会执行，造成资源泄漏。类似的问题也出现在内存（",[25,92,93],{},"malloc/free","）、锁（",[25,96,97],{},"lock/unlock","）、套接字等所有需要\"获取-释放\"的资源上。",[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;  // 管理的资源\n\npublic:\n    RAIIExample() : res(获取资源) { }   // 构造：获取资源\n    ~RAIIExample() { 释放资源; }        // 析构：释放资源\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},"  // 管理的资源\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},"   // 构造：获取资源\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},"        // 析构：释放资源\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/detach）",[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// 模拟一个资源\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// ❌ 手动管理：容易忘记 close\nvoid no_raii()\n{\n    Resource r;\n    r.open();\n    r.use();\n    // 如果这里抛异常或提前 return，close 不会执行！\n    r.close();\n}\n\n// ✅ RAII：利用析构函数自动释放\nclass ResourceGuard\n{\n    Resource& r;\npublic:\n    ResourceGuard(Resource& res) : r(res)\n    {\n        r.open();  // 构造时获取资源\n    }\n    ~ResourceGuard()\n    {\n        r.close(); // 析构时释放资源\n    }\n};\n\nvoid with_raii()\n{\n    Resource r;\n    ResourceGuard guard(r);  // 构造时 open\n    r.use();\n    // 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},"// 模拟一个资源\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},"// ❌ 手动管理：容易忘记 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},"    // 如果这里抛异常或提前 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},"// ✅ 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},"  // 构造时获取资源\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}," // 析构时释放资源\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},"  // 构造时 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},"    // 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;  // 共享互斥量\nint counter = 0;\n\n// ❌ 手动加锁解锁（容易出问题）\nvoid manual_lock()\n{\n    mtx.lock();\n    ++counter;\n    // 如果这里抛异常，unlock 永远不会被执行！\n    mtx.unlock();\n}\n\n// ✅ RAII 风格：lock_guard 自动管理锁\nvoid raii_lock()\n{\n    std::lock_guard\u003Cstd::mutex> lock(mtx);  // 构造时 lock\n    ++counter;\n    // 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},"  // 共享互斥量\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},"// ❌ 手动加锁解锁（容易出问题）\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},"    // 如果这里抛异常，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},"// ✅ 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},"  // 构造时 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},"    // 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// RAII：fstream 在析构时会自动关闭文件\nvoid write_and_read()\n{\n    // 写文件\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        // out 离开作用域，文件自动关闭\n    }\n\n    // 读文件\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        // 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},"// 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},"    // 写文件\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},"        // 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},"    // 读文件\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},"        // 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\"); // 构造时连接，函数结束时自动断开\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; // conn 仍然会析构\n        }\n\n        conn.send(line);\n    }\n\n    return true; // 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}," // 构造时连接，函数结束时自动断开\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}," // 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}," // 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/unlock 安全得多",[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},"构造/析构、提前 ",[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();  // 如果 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},"  // 如果 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);  // ❌ 永远不会自动析构！\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},"  // ❌ 永远不会自动析构！\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    // 锁在这里面生效\n}  // 离开作用域，解锁\n\n// 在外面访问共享数据没有保护！\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},"    // 锁在这里面生效\n",[28,2363,2364,2367],{"class":30,"line":211},[28,2365,2366],{"class":34},"}",[28,2368,2369],{"class":71},"  // 离开作用域，解锁\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},"// 在外面访问共享数据没有保护！\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],{},"\"需要配对的获取/释放\"就用 RAII","：这是 C++ 的资源管理第一原则。",[117,2395,2396,2399],{},[103,2397,2398],{},"永远不要手动 new/delete、lock/unlock、open/close","：用智能指针、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},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-8-raii","18.8",18080000,"2023-10-05","wiki/2023-10-05-cplusplus-jiao-xue","zh-cn:2023-10-05-cplusplus-jiao-xue","/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki/2023-10-05-Cplusplus教学/ch18-8-RAII",false,null,"/wiki/2023-10-05-cplusplus-jiao-xue/ch18-8-raii","zh-CN","zh-cn",{},{"title":5,"description":23},"Zdro6HUy_93nNGooFpZPGhHACWsHVcRxFWSMG1EpXdQ",[2505,2511,2517,2523,2529,2535,2541,2547,2553,2559,2565,2571,2577,2583,2589,2595,2601,2607,2613,2619,2625,2631,2637,2643,2649,2655,2661,2667,2673,2679,2685,2691,2697,2703,2709,2715,2721,2727,2733,2739,2745,2751,2757,2763,2769,2775,2781,2782,2788,2794,2800,2806,2812,2818,2824,2830,2836,2842,2848,2854,2860,2866,2872,2878,2884,2890,2896,2902,2908,2914],{"path":2506,"stem":2507,"title":2508,"date":2489,"chapter":2509,"chapterSort":2510,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch1-c-ji-chu-chu-shi","wiki/2023-10-05-Cplusplus教学/ch1-C++基础初识","C++基础初识","1",1000000,{"path":2512,"stem":2513,"title":2514,"date":2489,"chapter":2515,"chapterSort":2516,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch10-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","wiki/2023-10-05-Cplusplus教学/ch10-内存分区与生命周期","内存分区与生命周期","10",10000000,{"path":2518,"stem":2519,"title":2520,"date":2489,"chapter":2521,"chapterSort":2522,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch11-yin-yong","wiki/2023-10-05-Cplusplus教学/ch11-引用","引用","11",11000000,{"path":2524,"stem":2525,"title":2526,"date":2489,"chapter":2527,"chapterSort":2528,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch12-han-shu-ti-gao-yu-ming-ming-kong-jian","wiki/2023-10-05-Cplusplus教学/ch12-函数提高与命名空间","函数提高与命名空间","12",12000000,{"path":2530,"stem":2531,"title":2532,"date":2489,"chapter":2533,"chapterSort":2534,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-1-feng-zhuang","wiki/2023-10-05-Cplusplus教学/ch13-1-封装","封装","13.1",13010000,{"path":2536,"stem":2537,"title":2538,"date":2489,"chapter":2539,"chapterSort":2540,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-2-dui-xiang-chu-shi-hua-he-qing-li","wiki/2023-10-05-Cplusplus教学/ch13-2-对象初始化和清理","对象初始化和清理","13.2",13020000,{"path":2542,"stem":2543,"title":2544,"date":2489,"chapter":2545,"chapterSort":2546,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-3-dui-xiang-mo-xing-yu-this-zhi-zhen","wiki/2023-10-05-Cplusplus教学/ch13-3-对象模型与this指针","对象模型与this指针","13.3",13030000,{"path":2548,"stem":2549,"title":2550,"date":2489,"chapter":2551,"chapterSort":2552,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-4-you-yuan-yu-yun-suan-fu-zhong-zai","wiki/2023-10-05-Cplusplus教学/ch13-4-友元与运算符重载","友元与运算符重载","13.4",13040000,{"path":2554,"stem":2555,"title":2556,"date":2489,"chapter":2557,"chapterSort":2558,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-5-ji-cheng","wiki/2023-10-05-Cplusplus教学/ch13-5-继承","继承","13.5",13050000,{"path":2560,"stem":2561,"title":2562,"date":2489,"chapter":2563,"chapterSort":2564,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-6-duo-tai","wiki/2023-10-05-Cplusplus教学/ch13-6-多态","多态","13.6",13060000,{"path":2566,"stem":2567,"title":2568,"date":2489,"chapter":2569,"chapterSort":2570,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-lei-he-dui-xiang","wiki/2023-10-05-Cplusplus教学/ch13-类和对象","类和对象","13",13000000,{"path":2572,"stem":2573,"title":2574,"date":2489,"chapter":2575,"chapterSort":2576,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch14-wen-jian-cao-zuo","wiki/2023-10-05-Cplusplus教学/ch14-文件操作","文件操作","14",14000000,{"path":2578,"stem":2579,"title":2580,"date":2489,"chapter":2581,"chapterSort":2582,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch15-mu-ban","wiki/2023-10-05-Cplusplus教学/ch15-模板","模板","15",15000000,{"path":2584,"stem":2585,"title":2586,"date":2489,"chapter":2587,"chapterSort":2588,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-1-stl-chu-shi","wiki/2023-10-05-Cplusplus教学/ch16-1-STL初识","STL初识","16.1",16010000,{"path":2590,"stem":2591,"title":2592,"date":2489,"chapter":2593,"chapterSort":2594,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-2-std-array","wiki/2023-10-05-Cplusplus教学/ch16-2-std-array","std::array","16.2",16020000,{"path":2596,"stem":2597,"title":2598,"date":2489,"chapter":2599,"chapterSort":2600,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-3-string-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-3-string容器","string容器","16.3",16030000,{"path":2602,"stem":2603,"title":2604,"date":2489,"chapter":2605,"chapterSort":2606,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-4-vector-yu-deque-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-4-vector与deque容器","vector与deque容器","16.4",16040000,{"path":2608,"stem":2609,"title":2610,"date":2489,"chapter":2611,"chapterSort":2612,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-5-stack-queue-list-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-5-stack-queue-list容器","stack / queue / list 容器","16.5",16050000,{"path":2614,"stem":2615,"title":2616,"date":2489,"chapter":2617,"chapterSort":2618,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-6-set-map-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-6-set-map容器","set / map 容器","16.6",16060000,{"path":2620,"stem":2621,"title":2622,"date":2489,"chapter":2623,"chapterSort":2624,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-7-han-shu-dui-xiang-yu-wei-ci","wiki/2023-10-05-Cplusplus教学/ch16-7-函数对象与谓词","函数对象与谓词","16.7",16070000,{"path":2626,"stem":2627,"title":2628,"date":2489,"chapter":2629,"chapterSort":2630,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-8-chang-yong-suan-fa","wiki/2023-10-05-Cplusplus教学/ch16-8-常用算法","常用算法","16.8",16080000,{"path":2632,"stem":2633,"title":2634,"date":2489,"chapter":2635,"chapterSort":2636,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-stl-ti-gao-bian-cheng","wiki/2023-10-05-Cplusplus教学/ch16-STL提高编程","STL提高编程","16",16000000,{"path":2638,"stem":2639,"title":2640,"date":2489,"chapter":2641,"chapterSort":2642,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch17-c-lei-xing-zhuan-huan","wiki/2023-10-05-Cplusplus教学/ch17-C++类型转换","C++类型转换","17",17000000,{"path":2644,"stem":2645,"title":2646,"date":2489,"chapter":2647,"chapterSort":2648,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-1-auto","wiki/2023-10-05-Cplusplus教学/ch18-1-auto","auto","18.1",18010000,{"path":2650,"stem":2651,"title":2652,"date":2489,"chapter":2653,"chapterSort":2654,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-10-you-zhi-yin-yong-he-yi-dong-yu-yi","wiki/2023-10-05-Cplusplus教学/ch18-10-右值引用和移动语义","右值引用和移动语义","18.10",18100000,{"path":2656,"stem":2657,"title":2658,"date":2489,"chapter":2659,"chapterSort":2660,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-11-lambda-biao-da-shi","wiki/2023-10-05-Cplusplus教学/ch18-11-Lambda表达式","Lambda 表达式","18.11",18110000,{"path":2662,"stem":2663,"title":2664,"date":2489,"chapter":2665,"chapterSort":2666,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-12-std-function","wiki/2023-10-05-Cplusplus教学/ch18-12-std-function","std::function","18.12",18120000,{"path":2668,"stem":2669,"title":2670,"date":2489,"chapter":2671,"chapterSort":2672,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-13-std-bind","wiki/2023-10-05-Cplusplus教学/ch18-13-std-bind","std::bind","18.13",18130000,{"path":2674,"stem":2675,"title":2676,"date":2489,"chapter":2677,"chapterSort":2678,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-14-std-optional","wiki/2023-10-05-Cplusplus教学/ch18-14-std-optional","std::optional","18.14",18140000,{"path":2680,"stem":2681,"title":2682,"date":2489,"chapter":2683,"chapterSort":2684,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-15-std-variant","wiki/2023-10-05-Cplusplus教学/ch18-15-std-variant","std::variant","18.15",18150000,{"path":2686,"stem":2687,"title":2688,"date":2489,"chapter":2689,"chapterSort":2690,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-16-std-span","wiki/2023-10-05-Cplusplus教学/ch18-16-std-span","std::span","18.16",18160000,{"path":2692,"stem":2693,"title":2694,"date":2489,"chapter":2695,"chapterSort":2696,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-17-std-format-print","wiki/2023-10-05-Cplusplus教学/ch18-17-std-format-print","std::format / std::print","18.17",18170000,{"path":2698,"stem":2699,"title":2700,"date":2489,"chapter":2701,"chapterSort":2702,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-18-std-chrono","wiki/2023-10-05-Cplusplus教学/ch18-18-std-chrono","std::chrono","18.18",18180000,{"path":2704,"stem":2705,"title":2706,"date":2489,"chapter":2707,"chapterSort":2708,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-1-std-thread","wiki/2023-10-05-Cplusplus教学/ch18-19-1-std-thread","std::thread 与 join","18.19.1",18190100,{"path":2710,"stem":2711,"title":2712,"date":2489,"chapter":2713,"chapterSort":2714,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-2-mutex-lock-guard","wiki/2023-10-05-Cplusplus教学/ch18-19-2-mutex-lock-guard","mutex 与 lock_guard","18.19.2",18190200,{"path":2716,"stem":2717,"title":2718,"date":2489,"chapter":2719,"chapterSort":2720,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-3-std-atomic","wiki/2023-10-05-Cplusplus教学/ch18-19-3-std-atomic","std::atomic","18.19.3",18190300,{"path":2722,"stem":2723,"title":2724,"date":2489,"chapter":2725,"chapterSort":2726,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-4-condition-variable","wiki/2023-10-05-Cplusplus教学/ch18-19-4-condition-variable","condition_variable","18.19.4",18190400,{"path":2728,"stem":2729,"title":2730,"date":2489,"chapter":2731,"chapterSort":2732,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-bing-fa-bian-cheng","wiki/2023-10-05-Cplusplus教学/ch18-19-并发编程","并发编程","18.19",18190000,{"path":2734,"stem":2735,"title":2736,"date":2489,"chapter":2737,"chapterSort":2738,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-2-nullptr","wiki/2023-10-05-Cplusplus教学/ch18-2-nullptr","nullptr","18.2",18020000,{"path":2740,"stem":2741,"title":2742,"date":2489,"chapter":2743,"chapterSort":2744,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-20-std-filesystem","wiki/2023-10-05-Cplusplus教学/ch18-20-std-filesystem","std::filesystem","18.20",18200000,{"path":2746,"stem":2747,"title":2748,"date":2489,"chapter":2749,"chapterSort":2750,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-21-modules-jian-jie","wiki/2023-10-05-Cplusplus教学/ch18-21-modules简介","modules 简介","18.21",18210000,{"path":2752,"stem":2753,"title":2754,"date":2489,"chapter":2755,"chapterSort":2756,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-3-using","wiki/2023-10-05-Cplusplus教学/ch18-3-using","using","18.3",18030000,{"path":2758,"stem":2759,"title":2760,"date":2489,"chapter":2761,"chapterSort":2762,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-4-enum-class","wiki/2023-10-05-Cplusplus教学/ch18-4-enum-class","enum class","18.4",18040000,{"path":2764,"stem":2765,"title":2766,"date":2489,"chapter":2767,"chapterSort":2768,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-5-fan-wei-for-xun-huan","wiki/2023-10-05-Cplusplus教学/ch18-5-范围for循环","范围 for 循环","18.5",18050000,{"path":2770,"stem":2771,"title":2772,"date":2489,"chapter":2773,"chapterSort":2774,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-6-jie-gou-hua-bang-ding","wiki/2023-10-05-Cplusplus教学/ch18-6-结构化绑定","结构化绑定","18.6",18060000,{"path":2776,"stem":2777,"title":2778,"date":2489,"chapter":2779,"chapterSort":2780,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-7-constexpr","wiki/2023-10-05-Cplusplus教学/ch18-7-constexpr","constexpr","18.7",18070000,{"path":2486,"stem":2495,"title":5,"date":2489,"chapter":2487,"chapterSort":2488,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},{"path":2783,"stem":2784,"title":2785,"date":2489,"chapter":2786,"chapterSort":2787,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-9-zhi-neng-zhi-zhen","wiki/2023-10-05-Cplusplus教学/ch18-9-智能指针","智能指针","18.9",18090000,{"path":2789,"stem":2790,"title":2791,"date":2489,"chapter":2792,"chapterSort":2793,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-xian-dai-c","wiki/2023-10-05-Cplusplus教学/ch18-现代C++","现代C++","18",18000000,{"path":2795,"stem":2796,"title":2797,"date":2489,"chapter":2798,"chapterSort":2799,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-1-ding-shi-qi-yu-yi-bu-io","wiki/2023-10-05-Cplusplus教学/ch19-1-1-定时器与异步IO","定时器与异步 IO","19.1.1",19010100,{"path":2801,"stem":2802,"title":2803,"date":2489,"chapter":2804,"chapterSort":2805,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-2-boost-asio-ji-chu","wiki/2023-10-05-Cplusplus教学/ch19-1-2-Boost.Asio基础","Boost.Asio 基础","19.1.2",19010200,{"path":2807,"stem":2808,"title":2809,"date":2489,"chapter":2810,"chapterSort":2811,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-3-chuan-kou-tong-xin","wiki/2023-10-05-Cplusplus教学/ch19-1-3-串口通信","串口通信","19.1.3",19010300,{"path":2813,"stem":2814,"title":2815,"date":2489,"chapter":2816,"chapterSort":2817,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-4-tcp-tong-xin","wiki/2023-10-05-Cplusplus教学/ch19-1-4-TCP通信","TCP 通信","19.1.4",19010400,{"path":2819,"stem":2820,"title":2821,"date":2489,"chapter":2822,"chapterSort":2823,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-5-udp-tong-xin","wiki/2023-10-05-Cplusplus教学/ch19-1-5-UDP通信","UDP 通信","19.1.5",19010500,{"path":2825,"stem":2826,"title":2827,"date":2489,"chapter":2828,"chapterSort":2829,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-6-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","wiki/2023-10-05-Cplusplus教学/ch19-1-6-机器人工程写法与ROS2集成","机器人工程写法与 ROS2 集成","19.1.6",19010600,{"path":2831,"stem":2832,"title":2833,"date":2489,"chapter":2834,"chapterSort":2835,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-boost-asio-yi-bu-io-ku","wiki/2023-10-05-Cplusplus教学/ch19-1-Boost.Asio异步IO库","Boost.Asio异步IO库","19.1",19010000,{"path":2837,"stem":2838,"title":2839,"date":2489,"chapter":2840,"chapterSort":2841,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-2-eigen-xian-xing-dai-shu-ku","wiki/2023-10-05-Cplusplus教学/ch19-2-Eigen线性代数库","Eigen线性代数库","19.2",19020000,{"path":2843,"stem":2844,"title":2845,"date":2489,"chapter":2846,"chapterSort":2847,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-3-opencv-ji-suan-ji-shi-jue-ku","wiki/2023-10-05-Cplusplus教学/ch19-3-OpenCV计算机视觉库","OpenCV计算机视觉库","19.3",19030000,{"path":2849,"stem":2850,"title":2851,"date":2489,"chapter":2852,"chapterSort":2853,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-4-pcl-dian-yun-ku","wiki/2023-10-05-Cplusplus教学/ch19-4-PCL点云库","PCL点云库","19.4",19040000,{"path":2855,"stem":2856,"title":2857,"date":2489,"chapter":2858,"chapterSort":2859,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-5-sophus-li-qun-li-dai-shu-ku","wiki/2023-10-05-Cplusplus教学/ch19-5-Sophus李群李代数库","Sophus 李群李代数库","19.5",19050000,{"path":2861,"stem":2862,"title":2863,"date":2489,"chapter":2864,"chapterSort":2865,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-chang-yong-ku","wiki/2023-10-05-Cplusplus教学/ch19-常用库","常用库学习","19",19000000,{"path":2867,"stem":2868,"title":2869,"date":2489,"chapter":2870,"chapterSort":2871,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch2-shu-ju-lei-xing-yu-shu-ju-cun-fang","wiki/2023-10-05-Cplusplus教学/ch2-数据类型与数据存放","数据类型与数据存放","2",2000000,{"path":2873,"stem":2874,"title":2875,"date":2489,"chapter":2876,"chapterSort":2877,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch3-shu-ru-shu-chu","wiki/2023-10-05-Cplusplus教学/ch3-输入输出","输入输出","3",3000000,{"path":2879,"stem":2880,"title":2881,"date":2489,"chapter":2882,"chapterSort":2883,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch4-yun-suan-fu","wiki/2023-10-05-Cplusplus教学/ch4-运算符","运算符","4",4000000,{"path":2885,"stem":2886,"title":2887,"date":2489,"chapter":2888,"chapterSort":2889,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch5-cheng-xu-liu-cheng-jie-gou","wiki/2023-10-05-Cplusplus教学/ch5-程序流程结构","程序流程结构","5",5000000,{"path":2891,"stem":2892,"title":2893,"date":2489,"chapter":2894,"chapterSort":2895,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch6-shu-zu","wiki/2023-10-05-Cplusplus教学/ch6-数组","数组","6",6000000,{"path":2897,"stem":2898,"title":2899,"date":2489,"chapter":2900,"chapterSort":2901,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch7-han-shu-yu-tou-wen-jian","wiki/2023-10-05-Cplusplus教学/ch7-函数与头文件","函数与头文件","7",7000000,{"path":2903,"stem":2904,"title":2905,"date":2489,"chapter":2906,"chapterSort":2907,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch8-zhi-zhen","wiki/2023-10-05-Cplusplus教学/ch8-指针","指针","8",8000000,{"path":2909,"stem":2910,"title":2911,"date":2489,"chapter":2912,"chapterSort":2913,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":2496},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch9-jie-gou-ti-yu-gong-yong-ti","wiki/2023-10-05-Cplusplus教学/ch9-结构体与共用体","结构体与共用体","9",9000000,{"path":2492,"stem":2915,"title":2916,"date":2489,"chapter":2497,"chapterSort":2917,"docKey":2491,"docRoot":2492,"docTitle":2493,"isWikiDoc":207,"isWikiIndex":207},"wiki/2023-10-05-Cplusplus教学/index","C/C++教程",0,{"variants":2919},[2920,2923,2926,2929,2932],{"path":2921,"localeSlug":2922,"i18nKey":2495},"/en-us/wiki/2023-10-05-cplusplus-jiao-xue/ch18-8-raii","en-us",{"path":2924,"localeSlug":2925,"i18nKey":2495},"/zh-hant/wiki/2023-10-05-cplusplus-jiao-xue/ch18-8-raii","zh-hant",{"path":2927,"localeSlug":2928,"i18nKey":2495},"/zh-hk/wiki/2023-10-05-cplusplus-jiao-xue/ch18-8-raii","zh-hk",{"path":2930,"localeSlug":2931,"i18nKey":2495},"/zh-tw/wiki/2023-10-05-cplusplus-jiao-xue/ch18-8-raii","zh-tw",{"path":2486,"localeSlug":2500,"i18nKey":2495},[2921,2498,2924,2498,2927,2498,2930,2498,2486,2498],1780663035729]