{"id":7558,"date":"2026-07-31T23:41:39","date_gmt":"2026-07-31T15:41:39","guid":{"rendered":"https:\/\/i007.cc\/wordpress\/?p=7558"},"modified":"2026-07-31T23:41:39","modified_gmt":"2026-07-31T15:41:39","slug":"shared_ptr-%e5%92%8c-unique_ptr-%e6%80%8e%e4%b9%88%e9%80%89","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/7558","title":{"rendered":"\u201cshared_ptr \u548c unique_ptr \u600e\u4e48\u9009"},"content":{"rendered":"<div data-rs-index=\"30\" data-index=\"30\">\n<div tabindex=\"0\" role=\"article\" aria-setsize=\"32\" aria-posinset=\"31\" aria-label=\"Message 31 of 32\">\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=\"31\" data-index=\"31\" data-last-message=\"true\">\n<div tabindex=\"-1\" role=\"article\" aria-setsize=\"32\" aria-posinset=\"32\" aria-label=\"Message 32 of 32\">\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\">\u8fd9\u9053\u9898\u8003\u7684\u4e0d\u53ea\u662f API \u7528\u6cd5\uff0c\u800c\u662f\u4f60\u5bf9<strong>\u6240\u6709\u6743\u8bed\u4e49<\/strong>\u7684\u7406\u89e3\u3002\u4ece\u6839\u672c\u539f\u5219\u8bb2\u8d77\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\u95ee\u9898\uff1a\u6240\u6709\u6743\u5f52\u8c01<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u9009\u54ea\u79cd\u667a\u80fd\u6307\u9488\uff0c\u672c\u8d28\u4e0a\u662f\u5728\u56de\u7b54\u4e00\u4e2a\u95ee\u9898\uff1a<strong>\u8fd9\u4e2a\u5bf9\u8c61\u7684\u751f\u547d\u5468\u671f\u7531\u8c01\u51b3\u5b9a\uff1f<\/strong><\/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\">\/\/ \u6240\u6709\u6743\u7684\u4e09\u79cd\u6a21\u5f0f\uff1a\r\n\r\n\/\/ 1. \u72ec\u5360\u6240\u6709\u6743\uff1a\u53ea\u6709\u4e00\u4e2a\u6301\u6709\u8005\uff0c\u6301\u6709\u8005\u9500\u6bc1\u5219\u5bf9\u8c61\u9500\u6bc1\r\nstd::unique_ptr&lt;Texture&gt; texture = load(\"player.png\");\r\n\r\n\/\/ 2. \u5171\u4eab\u6240\u6709\u6743\uff1a\u591a\u4e2a\u6301\u6709\u8005\uff0c\u6700\u540e\u4e00\u4e2a\u9500\u6bc1\u65f6\u5bf9\u8c61\u9500\u6bc1\r\nstd::shared_ptr&lt;Shader&gt; shader = std::make_shared&lt;Shader&gt;(\"pbr.glsl\");\r\n\r\n\/\/ 3. \u65e0\u6240\u6709\u6743\u7684\u89c2\u5bdf\uff1a\u6211\u60f3\u5f15\u7528\u5b83\uff0c\u4f46\u4e0d\u5f71\u54cd\u5b83\u7684\u751f\u547d\u5468\u671f\r\nstd::weak_ptr&lt;Player&gt; target_ref = player_shared_ptr;<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u5728\u5199\u4e0b\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]\">shared_ptr<\/code>\u00a0\u4e4b\u524d\uff0c\u5148\u95ee\u81ea\u5df1\uff1a\u8fd9\u91cc\u771f\u7684\u662f\u5171\u4eab\u6240\u6709\u6743\u5417\uff1f\u8fd8\u662f\u53ea\u662f&#8221;\u9700\u8981\u5728\u591a\u5904\u4f7f\u7528&#8221;\uff1f<\/strong>\u00a0\u8fd9\u4e24\u4ef6\u4e8b\u4e0d\u4e00\u6837\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\">unique_ptr\uff1a\u96f6\u5f00\u9500\uff0c\u5e94\u8be5\u662f\u9ed8\u8ba4\u9009\u62e9<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u5185\u90e8\u53ea\u6709\u4e00\u4e2a\u88f8\u6307\u9488\uff0c\u548c\u88f8\u6307\u9488\u5b8c\u5168\u4e00\u6837\u5927\uff0c\u6790\u6784\u65f6\u81ea\u52a8\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>\uff0c<strong>\u6ca1\u6709\u4efb\u4f55\u8fd0\u884c\u65f6\u5f00\u9500<\/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=\"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\">\/\/ \u5927\u5c0f\u5bf9\u6bd4\uff0864\u4f4d\u7cfb\u7edf\uff09\r\nsizeof(int*)                    \/\/ 8 bytes\r\nsizeof(std::unique_ptr&lt;int&gt;)    \/\/ 8 bytes\uff0c\u5b8c\u5168\u76f8\u540c\r\nsizeof(std::shared_ptr&lt;int&gt;)    \/\/ 16 bytes\uff0c\u4e24\u4e2a\u6307\u9488\r\n\r\n\/\/ unique_ptr \u7684\u81ea\u5b9a\u4e49 deleter \u4e0d\u589e\u52a0\u5927\u5c0f\uff08\u5982\u679c\u662f\u65e0\u72b6\u6001\u7684\uff09\r\nauto deleter = [](FILE* f){ fclose(f); };\r\nstd::unique_ptr&lt;FILE, decltype(deleter)&gt; file(fopen(\"a.txt\",\"r\"), deleter);\r\nsizeof(file);  \/\/ \u4ecd\u7136\u662f 8 bytes\uff08\u7a7a lambda \u88ab EBO \u4f18\u5316\u6389\uff09<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>unique_ptr \u7684\u5178\u578b\u573a\u666f\uff1a<\/strong><\/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\">\/\/ 1. \u5de5\u5382\u51fd\u6570\uff1a\u660e\u786e\u8f6c\u79fb\u6240\u6709\u6743\u7ed9\u8c03\u7528\u65b9\r\nstd::unique_ptr&lt;Enemy&gt; EnemyFactory::create(EnemyType type) {\r\n    switch(type) {\r\n        case BOSS:   return std::make_unique&lt;BossEnemy&gt;();\r\n        case MINION: return std::make_unique&lt;MinionEnemy&gt;();\r\n    }\r\n}\r\n\r\n\/\/ 2. \u7c7b\u7684\u6210\u5458\uff1aRAII \u7ba1\u7406\u5b50\u5bf9\u8c61\u751f\u547d\u5468\u671f\r\nclass Scene {\r\n    std::unique_ptr&lt;PhysicsWorld&gt;  physics_;\r\n    std::unique_ptr&lt;RenderSystem&gt;  renderer_;\r\n    std::vector&lt;std::unique_ptr&lt;GameObject&gt;&gt; objects_;\r\n    \/\/ Scene \u6790\u6784\u65f6\uff0c\u6240\u6709\u5b50\u5bf9\u8c61\u81ea\u52a8\u9500\u6bc1\uff0c\u65e0\u9700\u624b\u52a8 delete\r\n};\r\n\r\n\/\/ 3. Pimpl \u60ef\u7528\u6cd5\uff1a\u9690\u85cf\u5b9e\u73b0\u7ec6\u8282\r\nclass AudioEngine {\r\n    struct Impl;\r\n    std::unique_ptr&lt;Impl&gt; impl_;   \/\/ \u7f16\u8bd1\u9632\u706b\u5899\r\npublic:\r\n    AudioEngine();\r\n    ~AudioEngine();  \/\/ \u5fc5\u987b\u5728 .cpp \u4e2d default\uff08Impl \u5b8c\u6574\u5b9a\u4e49\u4e4b\u540e\uff09\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\">shared_ptr\uff1a\u6709\u771f\u5b9e\u4ee3\u4ef7\uff0c\u6309\u9700\u4f7f\u7528<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><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]\">shared_ptr<\/code>\u00a0\u4e0d\u53ea\u662f\u591a\u4e86\u5f15\u7528\u8ba1\u6570\u90a3\u4e48\u7b80\u5355\uff0c\u5b8c\u6574\u7684\u5f00\u9500\u5217\u8868\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\">\u5185\u5b58\u5e03\u5c40\uff1a\r\n  shared_ptr \u5bf9\u8c61\u672c\u8eab = 2 \u4e2a\u6307\u9488\uff0816 bytes\uff09\r\n    \u251c\u2500\u2500 ptr to object     \u2192 \u6307\u5411\u5b9e\u9645\u5bf9\u8c61\r\n    \u2514\u2500\u2500 ptr to control block \u2192 \u6307\u5411\u63a7\u5236\u5757\r\n\r\n  \u63a7\u5236\u5757\uff08\u5806\u4e0a\u5355\u72ec\u5206\u914d\uff09\uff1a\r\n    \u251c\u2500\u2500 use_count    (atomic&lt;long&gt;) \u2190 \u5f3a\u5f15\u7528\u8ba1\u6570\r\n    \u251c\u2500\u2500 weak_count   (atomic&lt;long&gt;) \u2190 \u5f31\u5f15\u7528\u8ba1\u6570\r\n    \u251c\u2500\u2500 deleter      (function)\r\n    \u2514\u2500\u2500 allocator    (function)<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>make_shared \u7684\u4f18\u5316<\/strong>\uff1a\u628a\u5bf9\u8c61\u548c\u63a7\u5236\u5757\u5206\u914d\u5728\u540c\u4e00\u5757\u5185\u5b58\uff0c\u51cf\u5c11\u4e00\u6b21\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]\">new<\/code>\uff0c\u63d0\u5347 cache locality\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\">\/\/ \u4e24\u6b21\u5185\u5b58\u5206\u914d\uff08object + control block \u5404\u4e00\u6b21\uff09\r\nstd::shared_ptr&lt;Mesh&gt; m1(new Mesh());\r\n\r\n\/\/ \u4e00\u6b21\u5185\u5b58\u5206\u914d\uff08object \u548c control block \u8fde\u7eed\u5b58\u653e\uff09\r\nstd::shared_ptr&lt;Mesh&gt; m2 = std::make_shared&lt;Mesh&gt;();\r\n\/\/ \u63a8\u8350\uff1a\u6027\u80fd\u66f4\u597d\uff0c\u4e5f\u66f4\u5b89\u5168\uff08\u5f02\u5e38\u5b89\u5168\uff09<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u5f15\u7528\u8ba1\u6570\u7684\u4ee3\u4ef7<\/strong>\uff1a\u6bcf\u6b21\u62f7\u8d1d\/\u9500\u6bc1\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]\">shared_ptr<\/code>\u00a0\u90fd\u662f<strong>\u539f\u5b50\u64cd\u4f5c<\/strong>\uff0c\u5728\u591a\u6838\u9ad8\u7ade\u4e89\u573a\u666f\u4e0b\u4ee3\u4ef7\u663e\u8457\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 process(std::shared_ptr&lt;Mesh&gt; mesh) {  \/\/ \u62f7\u8d1d\uff1a\u539f\u5b50\u52a01\r\n    mesh-&gt;draw();\r\n}   \/\/ \u6790\u6784\uff1a\u539f\u5b50\u51cf1\uff0c\u4e3a0\u5219 delete\r\n\r\n\/\/ \u6e38\u620f\u4e3b\u5faa\u73af\u91cc\u6bcf\u5e27\u8c03\u7528\uff1a\r\nfor (int i = 0; i &lt; 10000; i++) {\r\n    process(mesh_list[i]);   \/\/ \u6bcf\u6b21\u8c03\u7528\u4e24\u6b21\u539f\u5b50\u64cd\u4f5c\r\n}\r\n\/\/ 10000 \u6b21\u539f\u5b50\u64cd\u4f5c\uff0c\u5728\u9ad8\u7ade\u4e89\u65f6\u6bcf\u6b21\u53ef\u80fd\u8017\u8d39\u51e0\u767e\u4e2a\u65f6\u949f\u5468\u671f<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>shared_ptr \u7684\u5408\u7406\u573a\u666f\uff1a<\/strong><\/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\">\/\/ 1. \u8d44\u6e90\u771f\u6b63\u88ab\u591a\u4e2a\u6240\u6709\u8005\u5171\u4eab\uff1a\u6750\u8d28\u88ab\u591a\u4e2a Mesh \u4f7f\u7528\r\nclass ResourceManager {\r\n    std::unordered_map&lt;std::string, std::shared_ptr&lt;Texture&gt;&gt; cache_;\r\n\r\npublic:\r\n    std::shared_ptr&lt;Texture&gt; get(const std::string&amp; path) {\r\n        auto it = cache_.find(path);\r\n        if (it != cache_.end()) return it-&gt;second;  \/\/ \u5171\u4eab\u540c\u4e00\u4efd\u8d44\u6e90\r\n        auto tex = std::make_shared&lt;Texture&gt;(path);\r\n        cache_[path] = tex;\r\n        return tex;\r\n    }\r\n};\r\n\r\n\/\/ mesh_A \u548c mesh_B \u5171\u4eab\u540c\u4e00\u5f20\u8d34\u56fe\uff0c\u4efb\u4f55\u4e00\u4e2a\u5b58\u5728\uff0c\u8d34\u56fe\u5c31\u5b58\u5728\r\nauto tex = resource_mgr.get(\"grass.png\");\r\nmesh_A-&gt;set_texture(tex);\r\nmesh_B-&gt;set_texture(tex);\r\n\/\/ tex \u79bb\u5f00\u4f5c\u7528\u57df\uff0c\u4f46\u8d34\u56fe\u8fd8\u6d3b\u7740\uff08mesh_A\/B \u8fd8\u6301\u6709\u5b83\uff09\r\n\r\n\/\/ 2. \u751f\u547d\u5468\u671f\u771f\u7684\u4e0d\u786e\u5b9a\uff0c\u65e0\u6cd5\u9759\u6001\u5206\u6790\u5f52\u5c5e\r\n\/\/ \u6bd4\u5982\uff1a\u5f02\u6b65\u52a0\u8f7d\uff0c\u52a0\u8f7d\u5b8c\u6210\u524d\u5bf9\u8c61\u53ef\u80fd\u5df2\u7ecf\u88ab\u9500\u6bc1\r\nauto weak_scene = std::weak_ptr&lt;Scene&gt;(current_scene);\r\nasync_load(\"map.bin\", [weak_scene](Data data) {\r\n    auto scene = weak_scene.lock();  \/\/ \u573a\u666f\u8fd8\u5728\u5417\uff1f\r\n    if (!scene) return;              \/\/ \u5df2\u7ecf\u5207\u6362\u573a\u666f\u4e86\uff0c\u4e22\u5f03\u7ed3\u679c\r\n    scene-&gt;apply(data);\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\">weak_ptr\uff1a\u89e3\u51b3\u4e24\u7c7b\u95ee\u9898<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u95ee\u9898\u4e00\uff1a\u5faa\u73af\u5f15\u7528<\/strong><\/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\">\/\/ \u9519\u8bef\uff1a\u5faa\u73af\u5f15\u7528\u5bfc\u81f4\u5185\u5b58\u6cc4\u6f0f\r\nstruct Node {\r\n    std::shared_ptr&lt;Node&gt; next;\r\n    std::shared_ptr&lt;Node&gt; prev;   \/\/ shared_ptr \u5faa\u73af\u5f15\u7528\uff01\r\n};\r\n\/\/ A\u2192B\uff0cB\u2192A\uff0c\u4e24\u8005\u5f15\u7528\u8ba1\u6570\u6c38\u8fdc\u4e0d\u4e3a 0\uff0c\u6c38\u8fdc\u4e0d\u91ca\u653e\r\n\r\n\/\/ \u6b63\u786e\uff1a\u5355\u5411 shared_ptr\uff0c\u53cd\u5411\u7528 weak_ptr\r\nstruct Node {\r\n    std::shared_ptr&lt;Node&gt; next;\r\n    std::weak_ptr&lt;Node&gt;   prev;   \/\/ \u4e0d\u589e\u52a0\u5f15\u7528\u8ba1\u6570\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>\u95ee\u9898\u4e8c\uff1a\u89c2\u5bdf\u8005\u4e0d\u60f3\u5f71\u54cd\u751f\u547d\u5468\u671f<\/strong><\/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\">\/\/ AI \u7784\u51c6\u76ee\u6807\uff1aAI \u4e0d\u5e94\u8be5\"\u6301\u6709\"\u73a9\u5bb6\uff0c\u73a9\u5bb6\u6b7b\u4ea1\u540e AI \u5e94\u8be5\u653e\u5f03\u76ee\u6807\r\nclass EnemyAI {\r\n    std::weak_ptr&lt;Player&gt; target_;   \/\/ \u4e0d\u6301\u6709\uff0c\u53ea\u89c2\u5bdf\r\n\r\npublic:\r\n    void set_target(std::shared_ptr&lt;Player&gt; player) {\r\n        target_ = player;   \/\/ \u4e0d\u589e\u52a0\u5f15\u7528\u8ba1\u6570\r\n    }\r\n\r\n    void update() {\r\n        auto target = target_.lock();  \/\/ \u539f\u5b50\u64cd\u4f5c\uff1a\u5b89\u5168\u5730\u5c1d\u8bd5\u83b7\u53d6\r\n        if (!target) {\r\n            \/\/ \u73a9\u5bb6\u5df2\u6b7b\u4ea1\/\u79bb\u5f00\uff0c\u5207\u6362\u72b6\u6001\r\n            switch_to_patrol();\r\n            return;\r\n        }\r\n        move_towards(target-&gt;position());\r\n    }\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\">\u6e38\u620f\u91cc\u6700\u5e38\u89c1\u7684\u9519\u8bef\u6a21\u5f0f<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u9519\u8bef\u4e00\uff1a\u6ee5\u7528 shared_ptr \u4f5c\u4e3a&#8221;\u5b89\u5168\u7684\u88f8\u6307\u9488&#8221;<\/strong><\/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\">\/\/ \u5e38\u89c1\u9519\u8bef\uff1a\u53ea\u662f\u60f3\u4f20\u5f15\u7528\uff0c\u5374\u7528 shared_ptr \u62f7\u8d1d\r\nvoid render_mesh(std::shared_ptr&lt;Mesh&gt; mesh) {  \/\/ \u6bcf\u6b21\u8c03\u7528\uff1a\u539f\u5b50\u52a0\u51cf\r\n    mesh-&gt;draw();\r\n}\r\n\r\n\/\/ \u6b63\u786e\uff1a\u4e0d\u6d89\u53ca\u6240\u6709\u6743\uff0c\u4f20\u5f15\u7528\u6216\u88f8\u6307\u9488\r\nvoid render_mesh(const Mesh&amp; mesh) {   \/\/ \u96f6\u5f00\u9500\r\n    mesh.draw();\r\n}\r\nvoid render_mesh(Mesh* mesh) {         \/\/ \u4e5f\u53ef\u4ee5\uff0c\u8bed\u4e49\u662f\"\u501f\u7528\uff0c\u4e0d\u62e5\u6709\"\r\n    mesh-&gt;draw();\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>\u9519\u8bef\u4e8c\uff1a\u4ece this \u6784\u9020 shared_ptr<\/strong><\/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 Bullet : public std::enable_shared_from_this&lt;Bullet&gt; {\r\npublic:\r\n    void register_self() {\r\n        \/\/ \u9519\u8bef\uff1anew shared_ptr(this) \u4f1a\u521b\u5efa\u72ec\u7acb\u7684\u63a7\u5236\u5757\uff0cdouble free\r\n        auto sp = std::shared_ptr&lt;Bullet&gt;(this);\r\n\r\n        \/\/ \u6b63\u786e\uff1a\u5fc5\u987b\u7ee7\u627f enable_shared_from_this \u540e\u4f7f\u7528\r\n        auto sp = shared_from_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>\u9519\u8bef\u4e09\uff1a\u9ad8\u9891\u5bf9\u8c61\u7528 shared_ptr<\/strong><\/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\">\/\/ \u5b50\u5f39\u3001\u7c92\u5b50\uff1a\u6bcf\u5e27\u521b\u5efa\u9500\u6bc1\u6210\u767e\u4e0a\u5343\u4e2a\uff0cshared_ptr \u662f\u707e\u96be\r\nclass ParticleSystem {\r\n    \/\/ \u9519\u8bef\uff1a\u6bcf\u4e2a\u7c92\u5b50\u7528 shared_ptr\r\n    std::vector&lt;std::shared_ptr&lt;Particle&gt;&gt; particles_;\r\n\r\n    \/\/ \u6b63\u786e\uff1a\u7528\u5bf9\u8c61\u6c60 + \u7d22\u5f15\/\u88f8\u6307\u9488\r\n    std::vector&lt;Particle&gt; pool_;        \/\/ \u9884\u5206\u914d\r\n    std::vector&lt;int&gt;      active_ids_;  \/\/ \u6d3b\u8dc3\u7c92\u5b50\u7684\u7d22\u5f15\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\">\u51b3\u7b56\u6811<\/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=\"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\">\u9700\u8981\u7ba1\u7406\u5bf9\u8c61\u751f\u547d\u5468\u671f\uff1f\r\n    \u2502\r\n    \u251c\u2500 \u5426 \u2192 \u88f8\u6307\u9488\u6216\u5f15\u7528\uff08\u501f\u7528\uff0c\u4e0d\u62e5\u6709\uff09\r\n    \u2502\r\n    \u2514\u2500 \u662f \u2192 \u6240\u6709\u6743\u662f\u5171\u4eab\u7684\u5417\uff1f\r\n                \u2502\r\n                \u251c\u2500 \u5426\uff08\u5355\u4e00\u6240\u6709\u8005\uff09 \u2192 unique_ptr  \u2190 \u9ed8\u8ba4\u9009\u62e9\r\n                \u2502\r\n                \u2514\u2500 \u662f\uff08\u591a\u4e2a\u6240\u6709\u8005\uff09 \u2192 shared_ptr\r\n                        \u2502\r\n                        \u2514\u2500 \u6709\u4eba\u53ea\u60f3\u89c2\u5bdf\u4e0d\u60f3\u62e5\u6709\uff1f\u2192 weak_ptr<\/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\u65f6\u7684\u5b8c\u6574\u56de\u7b54\u601d\u8def<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u5148\u8bf4<strong>\u539f\u5219<\/strong>\uff1a\u4e24\u8005\u533a\u522b\u662f\u6240\u6709\u6743\u8bed\u4e49\uff0c\u4e0d\u662f&#8221;shared_ptr \u66f4\u5b89\u5168&#8221;\u3002<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>\u00a0\u5e94\u8be5\u662f\u9ed8\u8ba4\u9009\u62e9\uff0c<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]\">shared_ptr<\/code>\u00a0\u53ea\u5728\u6240\u6709\u6743\u771f\u6b63\u5171\u4eab\u65f6\u624d\u7528\u3002<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u518d\u8bf4<strong>\u5f00\u9500<\/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>\u00a0\u96f6\u5f00\u9500\uff0c<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]\">shared_ptr<\/code>\u00a0\u6709\u63a7\u5236\u5757\uff0816\u5b57\u8282\u5bf9\u8c61 + \u5806\u4e0a\u63a7\u5236\u5757\uff09\u548c\u539f\u5b50\u5f15\u7528\u8ba1\u6570\u3002<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]\">make_shared<\/code>\u00a0\u628a\u4e24\u8005\u5408\u5e76\u5206\u914d\uff0c\u662f\u5fc5\u987b\u517b\u6210\u7684\u4e60\u60ef\u3002<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u7136\u540e\u8bf4<strong>\u6e38\u620f\u91cc\u7684\u5b9e\u8df5<\/strong>\uff1a\u8d44\u6e90\u7ba1\u7406\u5668\u7528\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]\">shared_ptr<\/code>\u00a0\u7f13\u5b58\u5171\u4eab\u8d44\u6e90\uff08\u8d34\u56fe\/\u7740\u8272\u5668\uff09\uff1b\u573a\u666f\u5bf9\u8c61\u7528\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]\">unique_ptr<\/code>\uff1bAI \u76ee\u6807\u5f15\u7528\u7528\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]\">weak_ptr<\/code>\uff1b\u9ad8\u9891\u5c0f\u5bf9\u8c61\uff08\u7c92\u5b50\/\u5b50\u5f39\uff09\u907f\u5f00\u6240\u6709\u667a\u80fd\u6307\u9488\uff0c\u7528\u5bf9\u8c61\u6c60\u3002<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u6700\u540e\u5982\u679c\u6709\u771f\u5b9e\u9879\u76ee\u91cc\u7528\u8fc7\u7684\u6848\u4f8b\uff0c\u76f4\u63a5\u8bf4\uff0c\u6bd4\u7406\u8bba\u63cf\u8ff0\u6709\u529b\u5f97\u591a\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>\u8fd9\u9053\u9898\u8003\u7684\u4e0d\u53ea\u662f API \u7528\u6cd5\uff0c\u800c\u662f\u4f60\u5bf9<\/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-7558","post","type-post","status-publish","format-standard","hentry","category-value_docs"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7558","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=7558"}],"version-history":[{"count":0,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7558\/revisions"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=7558"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=7558"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=7558"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}