{"id":7568,"date":"2026-08-01T00:48:21","date_gmt":"2026-07-31T16:48:21","guid":{"rendered":"https:\/\/i007.cc\/wordpress\/?p=7568"},"modified":"2026-08-01T00:48:21","modified_gmt":"2026-07-31T16:48:21","slug":"%e4%bb%8b%e7%bb%8d%e4%b8%8b-raii%ef%bc%8c%e6%88%91%e9%9c%80%e8%a6%81%e7%9f%a5%e9%81%93%e5%93%aa%e4%ba%9b%e7%9f%a5%e8%af%86%ef%bc%9f","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/7568","title":{"rendered":"\u4ecb\u7ecd\u4e0b RAII\uff0c\u6211\u9700\u8981\u77e5\u9053\u54ea\u4e9b\u77e5\u8bc6\uff1f"},"content":{"rendered":"<div data-rs-index=\"41\" data-index=\"41\">\n<div tabindex=\"0\" role=\"article\" aria-setsize=\"43\" aria-posinset=\"42\" aria-label=\"Message 42 of 43\">\n<div data-test-render-count=\"2\">\n<div class=\"mb-1 mt-[var(--msg-gap,1.5rem)] group group\/message-row\">\n<div class=\"flex flex-col items-end gap-1\">\n<div class=\"group relative inline-flex gap-2 bg-bg-300 dark:[[data-darker-default]_&amp;]:bg-bg-000 rounded-xl pl-2.5 py-[var(--msg-bubble-py,0.625rem)] break-words text-text-100 transition-all max-w-[75ch] flex-col !px-[var(--msg-bubble-px,1rem)] max-w-[85%]\" data-user-message-bubble=\"true\">\n<div class=\"flex flex-row gap-2 relative\">\n<div class=\"flex-1\">\n<div class=\"font-large !font-user-message py-0.5 grid grid-cols-1 gap-2 relative [&amp;_ul]:!space-y-0 [&amp;_ol]:!space-y-0 [&amp;_ul]:pl-8 [&amp;_ol]:pl-8\" data-testid=\"user-message\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div data-rs-index=\"42\" data-index=\"42\" data-last-message=\"true\">\n<div tabindex=\"-1\" role=\"article\" aria-setsize=\"43\" aria-posinset=\"43\" aria-label=\"Message 43 of 43\">\n<div data-test-render-count=\"1\">\n<div class=\"group group\/message-row\">\n<div class=\"group relative relative pb-[var(--msg-assistant-pb,0.75rem)]\" data-is-streaming=\"false\">\n<div class=\"font-claude-response relative leading-[1.65rem] [&amp;_pre&gt;div]:bg-bg-000\/50 [&amp;_pre&gt;div]:border-0.5 [&amp;_pre&gt;div]:border-border-400 [&amp;_.ignore-pre-bg&gt;div]:bg-transparent [&amp;_.standard-markdown_:is(p,blockquote,h1,h2,h3,h4,h5,h6)]:pl-2 [&amp;_.standard-markdown_:is(p,blockquote,ul,ol,h1,h2,h3,h4,h5,h6)]:pr-8 [&amp;_.progressive-markdown_:is(p,blockquote,h1,h2,h3,h4,h5,h6)]:pl-2 [&amp;_.progressive-markdown_:is(p,blockquote,ul,ol,h1,h2,h3,h4,h5,h6)]:pr-8\">\n<div class=\"grid grid-rows-[auto_auto] min-w-0\">\n<div class=\"row-start-2 col-start-1 relative grid grid-rows-[auto_auto] isolate min-w-0\">\n<div class=\"row-start-1 col-start-1 relative z-[2] min-w-0\">\n<div class=\"standard-markdown grid-cols-1 grid [&amp;_&gt;_*]:min-w-0 gap-3 [&amp;_&gt;_*:last-child]:mb-0 print:block print:[&amp;_&gt;_*_+_*]:mt-3 standard-markdown\">\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">RAII \u662f C++ \u6700\u91cd\u8981\u7684\u7f16\u7a0b\u60ef\u7528\u6cd5\uff0c\u7406\u89e3\u5b83\u662f\u7406\u89e3\u6574\u4e2a C++ \u8d44\u6e90\u7ba1\u7406\u4f53\u7cfb\u7684\u57fa\u7840\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u6838\u5fc3\u601d\u60f3\uff1a\u8d44\u6e90\u751f\u547d\u5468\u671f = \u5bf9\u8c61\u751f\u547d\u5468\u671f<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">RAII \u5168\u79f0\u00a0<strong>Resource Acquisition Is Initialization<\/strong>\uff0c\u7ffb\u8bd1\u8fc7\u6765\u662f&#8221;\u8d44\u6e90\u83b7\u53d6\u5373\u521d\u59cb\u5316&#8221;\uff0c\u4f46\u8fd9\u4e2a\u540d\u5b57\u4e0d\u592a\u76f4\u89c2\u3002\u66f4\u51c6\u786e\u7684\u7406\u89e3\u662f\uff1a<\/p>\n<blockquote class=\"ml-2 border-l-4 border-[hsl(var(--border-300)\/0.1)] pl-4 text-text-300\">\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u628a\u8d44\u6e90\u7684\u83b7\u53d6\u653e\u5728\u6784\u9020\u51fd\u6570\u91cc\uff0c\u628a\u8d44\u6e90\u7684\u91ca\u653e\u653e\u5728\u6790\u6784\u51fd\u6570\u91cc\uff0c\u5229\u7528 C++ \u5bf9\u8c61\u7684\u786e\u5b9a\u6027\u6790\u6784\u6765\u4fdd\u8bc1\u8d44\u6e90\u4e00\u5b9a\u88ab\u91ca\u653e\u3002<\/strong><\/p>\n<\/blockquote>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u5148\u770b\u6ca1\u6709 RAII \u65f6\u7684\u4ee3\u7801\u6709\u591a\u8106\u5f31\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/\/ \u6ca1\u6709 RAII\uff1a\u624b\u52a8\u7ba1\u7406\uff0c\u5230\u5904\u662f\u9677\u9631\r\nvoid process_file(const char* path) {\r\n    FILE* f = fopen(path, \"r\");\r\n    if (!f) return;\r\n\r\n    char* buffer = new char[1024];\r\n\r\n    if (some_condition()) {\r\n        delete[] buffer;    \/\/ \u5fc5\u987b\u8bb0\u5f97\u91ca\u653e\r\n        fclose(f);          \/\/ \u5fc5\u987b\u8bb0\u5f97\u5173\u95ed\r\n        return;             \/\/ \u5982\u679c\u5fd8\u4e86\u5176\u4e2d\u4e00\u4e2a\uff0c\u5c31\u662f resource leak\r\n    }\r\n\r\n    \/\/ \u5982\u679c\u8fd9\u91cc\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u9762\u4e24\u884c\u6c38\u8fdc\u4e0d\u4f1a\u6267\u884c\r\n    do_something_that_may_throw(f, buffer);\r\n\r\n    delete[] buffer;        \/\/ \u53ef\u80fd\u6267\u884c\u4e0d\u5230\r\n    fclose(f);              \/\/ \u53ef\u80fd\u6267\u884c\u4e0d\u5230\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u6bcf\u4e00\u4e2a\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">return<\/code>\u3001\u6bcf\u4e00\u4e2a\u5f02\u5e38\u8def\u5f84\uff0c\u90fd\u9700\u8981\u624b\u52a8\u91ca\u653e\u6240\u6709\u8d44\u6e90\uff0c\u9057\u6f0f\u4e00\u5904\u5c31\u662f bug\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">RAII \u5982\u4f55\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898<\/h3>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/\/ \u6709 RAII\uff1a\u5bf9\u8c61\u6790\u6784\u65f6\u81ea\u52a8\u91ca\u653e\r\nvoid process_file(const char* path) {\r\n    std::ifstream f(path);          \/\/ \u6784\u9020\u65f6\u6253\u5f00\u6587\u4ef6\r\n    if (!f) return;\r\n\r\n    auto buffer = std::make_unique&lt;char[]&gt;(1024);  \/\/ \u6784\u9020\u65f6\u5206\u914d\u5185\u5b58\r\n\r\n    if (some_condition()) {\r\n        return;   \/\/ \u51fd\u6570\u9000\u51fa\uff0cf \u548c buffer \u81ea\u52a8\u6790\u6784\uff0c\u8d44\u6e90\u81ea\u52a8\u91ca\u653e\r\n    }\r\n\r\n    do_something_that_may_throw(f, buffer.get());\r\n    \/\/ \u5373\u4f7f\u8fd9\u91cc\u629b\u5f02\u5e38\uff0c\u6808\u5c55\u5f00\uff08stack unwinding\uff09\u4f1a\u8c03\u7528\u6240\u6709\u5c40\u90e8\u5bf9\u8c61\u7684\u6790\u6784\u51fd\u6570\r\n    \/\/ f \u548c buffer \u7684\u8d44\u6e90\u4f9d\u7136\u4fdd\u8bc1\u88ab\u91ca\u653e\r\n\r\n}   \/\/ \u51fd\u6570\u6b63\u5e38\u9000\u51fa\uff0cf \u548c buffer \u5728\u8fd9\u91cc\u81ea\u52a8\u6790\u6784<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u5173\u952e\u673a\u5236\uff1aC++ \u4fdd\u8bc1\uff0c\u65e0\u8bba\u51fd\u6570\u5982\u4f55\u9000\u51fa\uff08\u6b63\u5e38 return\u3001\u5f02\u5e38\uff09\uff0c\u6240\u6709\u5df2\u6784\u9020\u7684\u5c40\u90e8\u5bf9\u8c61\u90fd\u4f1a\u6309\u7167\u6784\u9020\u7684\u9006\u5e8f\u88ab\u6790\u6784\u3002<\/strong>\u00a0RAII \u5c31\u662f\u628a\u8d44\u6e90\u6e05\u7406\u6302\u5728\u8fd9\u4e2a\u4fdd\u8bc1\u4e0a\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a RAII \u7c7b<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u7406\u89e3\u6807\u51c6\u5e93\u4e4b\u524d\uff0c\u5148\u770b\u5982\u4f55\u624b\u5199\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/\/ \u5305\u88c5 FILE* \u7684 RAII \u7c7b\r\nclass FileHandle {\r\n    FILE* file_ = nullptr;\r\n\r\npublic:\r\n    \/\/ \u6784\u9020\uff1a\u83b7\u53d6\u8d44\u6e90\r\n    explicit FileHandle(const char* path, const char* mode) {\r\n        file_ = fopen(path, mode);\r\n        if (!file_)\r\n            throw std::runtime_error(\"Failed to open file\");\r\n    }\r\n\r\n    \/\/ \u6790\u6784\uff1a\u91ca\u653e\u8d44\u6e90\uff08\u4e00\u5b9a\u4f1a\u88ab\u8c03\u7528\uff09\r\n    ~FileHandle() {\r\n        if (file_) {\r\n            fclose(file_);\r\n            file_ = nullptr;\r\n        }\r\n    }\r\n\r\n    \/\/ \u7981\u6b62\u62f7\u8d1d\uff1aFILE* \u4e0d\u80fd\u6709\u4e24\u4e2a\u6240\u6709\u8005\r\n    FileHandle(const FileHandle&amp;)            = delete;\r\n    FileHandle&amp; operator=(const FileHandle&amp;) = delete;\r\n\r\n    \/\/ \u5141\u8bb8\u79fb\u52a8\uff1a\u8f6c\u79fb\u6240\u6709\u6743\r\n    FileHandle(FileHandle&amp;&amp; other) noexcept\r\n        : file_(other.file_) {\r\n        other.file_ = nullptr;  \/\/ \u539f\u5bf9\u8c61\u653e\u5f03\u6240\u6709\u6743\r\n    }\r\n    FileHandle&amp; operator=(FileHandle&amp;&amp; other) noexcept {\r\n        if (this != &amp;other) {\r\n            if (file_) fclose(file_);  \/\/ \u5148\u91ca\u653e\u81ea\u5df1\u7684\u8d44\u6e90\r\n            file_ = other.file_;\r\n            other.file_ = nullptr;\r\n        }\r\n        return *this;\r\n    }\r\n\r\n    \/\/ \u63d0\u4f9b\u8bbf\u95ee\u63a5\u53e3\r\n    FILE* get() const { return file_; }\r\n    operator bool() const { return file_ != nullptr; }\r\n};\r\n\r\n\/\/ \u4f7f\u7528\uff1a\r\nvoid process() {\r\n    FileHandle f(\"data.bin\", \"rb\");  \/\/ \u6784\u9020\u5373\u83b7\u53d6\r\n    fread(buffer, 1, size, f.get());\r\n    \/\/ \u4efb\u4f55\u9000\u51fa\u8def\u5f84\uff0cf \u6790\u6784\u65f6\u81ea\u52a8 fclose\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">Rule of Zero \/ Three \/ Five<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u8fd9\u662f RAII \u5b9e\u73b0\u7684\u6838\u5fc3\u51c6\u5219\uff0c\u9762\u8bd5\u5fc5\u8003\uff1a<\/p>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">Rule of Zero\uff08\u6700\u4f18\uff09<\/h4>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u5982\u679c\u7c7b\u7684\u6240\u6709\u6210\u5458\u90fd\u662f RAII \u7c7b\u578b\uff08<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">unique_ptr<\/code>\u3001<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">string<\/code>\u3001<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">vector<\/code>\u00a0\u7b49\uff09\uff0c\u5219\u4e0d\u9700\u8981\u81ea\u5df1\u5199\u4efb\u4f55\u7279\u6b8a\u6210\u5458\u51fd\u6570\u2014\u2014\u7f16\u8bd1\u5668\u81ea\u52a8\u751f\u6210\u7684\u5c31\u662f\u6b63\u786e\u7684\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/\/ \u5b8c\u7f8e\u7684 Rule of Zero\uff1a\u4ec0\u4e48\u90fd\u4e0d\u5199\r\nclass Player {\r\n    std::string             name_;     \/\/ \u81ea\u52a8\u7ba1\u7406\u5185\u5b58\r\n    std::unique_ptr&lt;Mesh&gt;   mesh_;     \/\/ \u81ea\u52a8\u7ba1\u7406 Mesh \u751f\u547d\u5468\u671f\r\n    std::vector&lt;Item&gt;       inventory_;\/\/ \u81ea\u52a8\u7ba1\u7406\u6570\u7ec4\r\n\r\n    \/\/ \u4e0d\u9700\u8981\u5199\u6790\u6784\u51fd\u6570\u3001\u62f7\u8d1d\/\u79fb\u52a8\u6784\u9020\/\u8d4b\u503c\r\n    \/\/ \u7f16\u8bd1\u5668\u751f\u6210\u7684\u7248\u672c\u4f1a\u9010\u4e2a\u8c03\u7528\u6210\u5458\u7684\u6790\u6784\/\u62f7\u8d1d\/\u79fb\u52a8\r\n};<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">Rule of Five\uff08\u9700\u8981\u7ba1\u7406\u539f\u59cb\u8d44\u6e90\u65f6\uff09<\/h4>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u4e00\u65e6\u4f60<strong>\u624b\u52a8\u7ba1\u7406<\/strong>\u4efb\u4f55\u8d44\u6e90\uff08\u88f8\u6307\u9488\u3001\u6587\u4ef6\u53e5\u67c4\u3001\u9501\u3001GPU handle\uff09\uff0c\u5c31\u5fc5\u987b\u660e\u786e\u5b9a\u4e49\u4e94\u4e2a\u7279\u6b8a\u51fd\u6570\uff0c\u6216\u8005\u660e\u786e\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">delete<\/code>\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">class Buffer {\r\n    char*  data_;\r\n    size_t size_;\r\n\r\npublic:\r\n    \/\/ 1. \u6790\u6784\u51fd\u6570\r\n    ~Buffer() { delete[] data_; }\r\n\r\n    \/\/ 2. \u62f7\u8d1d\u6784\u9020\uff08\u6df1\u62f7\u8d1d\uff09\r\n    Buffer(const Buffer&amp; other)\r\n        : size_(other.size_), data_(new char[other.size_]) {\r\n        memcpy(data_, other.data_, size_);\r\n    }\r\n\r\n    \/\/ 3. \u62f7\u8d1d\u8d4b\u503c\r\n    Buffer&amp; operator=(const Buffer&amp; other) {\r\n        if (this == &amp;other) return *this;\r\n        delete[] data_;                    \/\/ \u5148\u91ca\u653e\u65e7\u8d44\u6e90\r\n        size_ = other.size_;\r\n        data_ = new char[size_];\r\n        memcpy(data_, other.data_, size_);\r\n        return *this;\r\n    }\r\n\r\n    \/\/ 4. \u79fb\u52a8\u6784\u9020\uff08noexcept \u975e\u5e38\u91cd\u8981\uff01\uff09\r\n    Buffer(Buffer&amp;&amp; other) noexcept\r\n        : data_(other.data_), size_(other.size_) {\r\n        other.data_ = nullptr;\r\n        other.size_ = 0;\r\n    }\r\n\r\n    \/\/ 5. \u79fb\u52a8\u8d4b\u503c\r\n    Buffer&amp; operator=(Buffer&amp;&amp; other) noexcept {\r\n        if (this == &amp;other) return *this;\r\n        delete[] data_;\r\n        data_ = other.data_;\r\n        size_ = other.size_;\r\n        other.data_ = nullptr;\r\n        other.size_ = 0;\r\n        return *this;\r\n    }\r\n};<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u6700\u5e38\u89c1\u7684\u9677\u9631<\/strong>\uff1a\u53ea\u5199\u4e86\u6790\u6784\u51fd\u6570\uff0c\u5fd8\u4e86\u79fb\u52a8\u6784\u9020\/\u8d4b\u503c\uff0c\u5bfc\u81f4\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">vector&lt;Buffer&gt;<\/code>\u00a0\u6269\u5bb9\u65f6\u7528\u62f7\u8d1d\u800c\u4e0d\u662f\u79fb\u52a8\uff0c\u6216\u8005\u66f4\u7cdf\u2014\u2014\u7f16\u8bd1\u5668\u751f\u6210\u7684\u62f7\u8d1d\u6784\u9020\u505a\u6d45\u62f7\u8d1d\uff0c\u4e24\u4e2a\u5bf9\u8c61\u6790\u6784\u65f6 double free\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u6807\u51c6\u5e93\u91cc\u65e0\u5904\u4e0d\u5728\u7684 RAII<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u7406\u89e3 RAII \u4e4b\u540e\uff0c\u4f60\u4f1a\u53d1\u73b0\u6807\u51c6\u5e93\u51e0\u4e4e\u5168\u662f RAII\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/\/ \u5185\u5b58\u7ba1\u7406\r\nstd::unique_ptr&lt;T&gt;      \/\/ \u72ec\u5360\u6240\u6709\u6743\uff0c\u6790\u6784\u65f6 delete\r\nstd::shared_ptr&lt;T&gt;      \/\/ \u5171\u4eab\u6240\u6709\u6743\uff0c\u6700\u540e\u4e00\u4e2a\u6790\u6784\u65f6 delete\r\n\r\n\/\/ \u6587\u4ef6 IO\r\nstd::ifstream \/ ofstream  \/\/ \u6790\u6784\u65f6\u81ea\u52a8 close\r\n\r\n\/\/ \u4e92\u65a5\u9501\r\nstd::lock_guard&lt;std::mutex&gt; lock(mtx);\r\n\/\/ \u6784\u9020\u65f6 lock\uff0c\u6790\u6784\u65f6 unlock\uff0c\u6c38\u8fdc\u4e0d\u4f1a\u5fd8\u8bb0 unlock\r\n\r\nstd::unique_lock&lt;std::mutex&gt; lock(mtx);\r\n\/\/ \u66f4\u7075\u6d3b\uff0c\u652f\u6301\u624b\u52a8 unlock\u3001\u5ef6\u8fdf lock\u3001\u8f6c\u79fb\u6240\u6709\u6743\r\n\r\n\/\/ \u7ebf\u7a0b\r\nstd::jthread t(func);   \/\/ C++20\uff0c\u6790\u6784\u65f6\u81ea\u52a8 join\uff08std::thread \u6790\u6784\u65f6 terminate\uff01\uff09\r\n\r\n\/\/ \u7f51\u7edc\/\u7cfb\u7edf\u8d44\u6e90\r\n\/\/ \u901a\u5e38\u9700\u8981\u81ea\u5df1\u5199 RAII wrapper<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u6808\u5c55\u5f00\u4e0e\u5f02\u5e38\u5b89\u5168<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">RAII \u548c\u5f02\u5e38\u7684\u7ed3\u5408\u662f\u5b83\u6700\u91cd\u8981\u7684\u4ef7\u503c\u4e4b\u4e00\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">void game_tick() {\r\n    std::lock_guard&lt;std::mutex&gt; lock(world_mutex_);  \/\/ \u83b7\u53d6\u9501\r\n    \r\n    auto texture = load_texture(\"player.png\");       \/\/ \u53ef\u80fd\u629b\u5f02\u5e38\r\n    auto mesh    = load_mesh(\"player.fbx\");          \/\/ \u4e5f\u53ef\u80fd\u629b\u5f02\u5e38\r\n\r\n    \/\/ \u5047\u8bbe load_mesh \u629b\u51fa\u5f02\u5e38\uff1a\r\n    \/\/ 1. \u5f02\u5e38\u4f20\u64ad\uff0c\u5f00\u59cb\u6808\u5c55\u5f00\r\n    \/\/ 2. texture \u7684\u6790\u6784\u51fd\u6570\u88ab\u8c03\u7528 \u2192 GPU \u8d44\u6e90\u91ca\u653e\r\n    \/\/ 3. lock \u7684\u6790\u6784\u51fd\u6570\u88ab\u8c03\u7528 \u2192 mutex \u88ab\u89e3\u9501\r\n    \/\/ \u4e0d\u9700\u8981 try-catch\uff0c\u8d44\u6e90\u81ea\u52a8\u6e05\u7406\r\n\r\n    render(texture, mesh);\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u5f02\u5e38\u5b89\u5168\u7684\u4e09\u4e2a\u7ea7\u522b<\/strong>\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\u57fa\u672c\u4fdd\u8bc1\uff08Basic\uff09\uff1a   \u5f02\u5e38\u53d1\u751f\u540e\uff0c\u5bf9\u8c61\u5904\u4e8e\u6709\u6548\u72b6\u6001\uff08\u4e0d\u6cc4\u6f0f\u8d44\u6e90\uff09\r\n                      RAII \u81ea\u52a8\u63d0\u4f9b\u8fd9\u4e2a\u7ea7\u522b\r\n\r\n\u5f3a\u4fdd\u8bc1\uff08Strong\uff09\uff1a    \u5f02\u5e38\u53d1\u751f\u540e\uff0c\u72b6\u6001\u56de\u6eda\u5230\u64cd\u4f5c\u524d\uff08\u4e8b\u52a1\u8bed\u4e49\uff09\r\n                      \u9700\u8981 copy-and-swap \u7b49\u6280\u672f\r\n\r\n\u4e0d\u629b\u51fa\u4fdd\u8bc1\uff08Nothrow\uff09\uff1a\u64cd\u4f5c\u7edd\u5bf9\u4e0d\u629b\u5f02\u5e38\r\n                       \u79fb\u52a8\u6784\u9020\/\u6790\u6784\u5e94\u8be5\u63d0\u4f9b\u8fd9\u4e2a\u7ea7\u522b\uff08\u52a0 noexcept\uff09<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u6e38\u620f\u91cc\u7684\u5b9e\u9645\u5e94\u7528<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u6e38\u620f\u540e\u7aef\u6709\u5f88\u591a\u9700\u8981\u81ea\u5b9a\u4e49 RAII \u7684\u573a\u666f\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/\/ GPU \u8d44\u6e90\u7684 RAII \u7ba1\u7406\r\nclass GpuBuffer {\r\n    VkBuffer       buffer_    = VK_NULL_HANDLE;\r\n    VkDeviceMemory memory_    = VK_NULL_HANDLE;\r\n    VkDevice       device_;\r\n\r\npublic:\r\n    GpuBuffer(VkDevice device, size_t size, VkBufferUsageFlags usage)\r\n        : device_(device) {\r\n        \/\/ \u521b\u5efa Vulkan buffer\r\n        VkBufferCreateInfo info{...};\r\n        vkCreateBuffer(device_, &amp;info, nullptr, &amp;buffer_);\r\n        \/\/ \u5206\u914d\u663e\u5b58\r\n        vkAllocateMemory(device_, &amp;alloc_info, nullptr, &amp;memory_);\r\n        vkBindBufferMemory(device_, buffer_, memory_, 0);\r\n    }\r\n\r\n    ~GpuBuffer() {\r\n        if (buffer_) vkDestroyBuffer(device_, buffer_, nullptr);\r\n        if (memory_) vkFreeMemory(device_, memory_, nullptr);\r\n    }\r\n\r\n    GpuBuffer(const GpuBuffer&amp;)            = delete;\r\n    GpuBuffer&amp; operator=(const GpuBuffer&amp;) = delete;\r\n    GpuBuffer(GpuBuffer&amp;&amp;) noexcept;       \/\/ \u8f6c\u79fb handle \u6240\u6709\u6743\r\n    GpuBuffer&amp; operator=(GpuBuffer&amp;&amp;) noexcept;\r\n};\r\n\r\n\/\/ \u6570\u636e\u5e93\u4e8b\u52a1\u7684 RAII\r\nclass Transaction {\r\n    DBConnection&amp; conn_;\r\n    bool committed_ = false;\r\npublic:\r\n    explicit Transaction(DBConnection&amp; conn) : conn_(conn) {\r\n        conn_.begin_transaction();\r\n    }\r\n    void commit() {\r\n        conn_.commit();\r\n        committed_ = true;\r\n    }\r\n    ~Transaction() {\r\n        if (!committed_) conn_.rollback();  \/\/ \u5f02\u5e38\u9000\u51fa\u65f6\u81ea\u52a8\u56de\u6eda\r\n    }\r\n};\r\n\r\n\/\/ \u4f7f\u7528\uff1a\r\nvoid transfer_coins(Player&amp; from, Player&amp; to, int amount) {\r\n    Transaction txn(db_);\r\n    from.coins -= amount;\r\n    db_.update(from);         \/\/ \u5982\u679c\u8fd9\u91cc\u629b\u5f02\u5e38\r\n    to.coins += amount;\r\n    db_.update(to);           \/\/ \u6216\u8fd9\u91cc\u629b\u5f02\u5e38\r\n    txn.commit();             \/\/ \u4efb\u4f55\u4e00\u6b65\u5931\u8d25\uff0c\u6790\u6784\u81ea\u52a8 rollback\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u9762\u8bd5\u91cc\u7684\u5b8c\u6574\u7b54\u9898\u6846\u67b6<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">RAII \u662f\u4e00\u9053\u770b\u4f3c\u7b80\u5355\u5b9e\u5219\u5f88\u6709\u6df1\u5ea6\u7684\u9898\uff0c\u597d\u7684\u56de\u7b54\u5e94\u8be5\u8986\u76d6\uff1a<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u662f\u4ec0\u4e48<\/strong>\uff1a\u628a\u8d44\u6e90\u751f\u547d\u5468\u671f\u7ed1\u5b9a\u5230\u5bf9\u8c61\u751f\u547d\u5468\u671f\uff0c\u6784\u9020\u83b7\u53d6\uff0c\u6790\u6784\u91ca\u653e\uff0c\u5229\u7528 C++ \u786e\u5b9a\u6027\u6790\u6784\uff08\u5305\u62ec\u6808\u5c55\u5f00\uff09\u4fdd\u8bc1\u8d44\u6e90\u4e00\u5b9a\u88ab\u91ca\u653e\u3002<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u89e3\u51b3\u4e86\u4ec0\u4e48<\/strong>\uff1a\u624b\u52a8\u8d44\u6e90\u7ba1\u7406\u5728\u591a return \u8def\u5f84\u548c\u5f02\u5e38\u8def\u5f84\u4e0b\u6781\u6613\u6cc4\u6f0f\u3002<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>Rule of Five<\/strong>\uff1a\u624b\u52a8\u7ba1\u7406\u8d44\u6e90\u65f6\u4e94\u4e2a\u7279\u6b8a\u51fd\u6570\u8981\u4e48\u5168\u5199\u8981\u4e48\u5168 delete\uff0c\u6790\u6784\u4e0d\u52a0 noexcept \u4f1a\u5f71\u54cd\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">vector<\/code>\u00a0\u6269\u5bb9\u7b56\u7565\u3002<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u6807\u51c6\u5e93\u4f53\u73b0<\/strong>\uff1a<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">unique_ptr<\/code>\u3001<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">lock_guard<\/code>\u3001<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">fstream<\/code>\u00a0\u90fd\u662f RAII\uff0c\u6e38\u620f\u91cc GPU \u8d44\u6e90\u3001\u6570\u636e\u5e93\u4e8b\u52a1\u3001\u5206\u5e03\u5f0f\u9501\u4e5f\u5e94\u8be5\u7528 RAII \u5305\u88c5\u3002<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>Rule of Zero<\/strong>\uff1a\u4f18\u5148\u7528\u5df2\u6709\u7684 RAII \u7c7b\u578b\u7ec4\u5408\uff0c\u800c\u4e0d\u662f\u624b\u5199\u8d44\u6e90\u7ba1\u7406\uff0c\u7f16\u8bd1\u5668\u751f\u6210\u7684\u7279\u6b8a\u51fd\u6570\u5f80\u5f80\u5c31\u662f\u6b63\u786e\u7684\u3002<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>RAII \u662f C++ \u6700\u91cd\u8981\u7684\u7f16\u7a0b\u60ef\u7528\u6cd5<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[24],"tags":[],"class_list":["post-7568","post","type-post","status-publish","format-standard","hentry","category-value_docs"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7568","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/comments?post=7568"}],"version-history":[{"count":0,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7568\/revisions"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=7568"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=7568"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=7568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}