{"id":6896,"date":"2020-06-10T17:55:32","date_gmt":"2020-06-11T00:55:32","guid":{"rendered":"https:\/\/zxi.mytechroad.com\/blog\/?p=6896"},"modified":"2020-06-10T17:59:04","modified_gmt":"2020-06-11T00:59:04","slug":"cpp-11-smart-pointers","status":"publish","type":"post","link":"https:\/\/zxi.mytechroad.com\/blog\/c\/cpp-11-smart-pointers\/","title":{"rendered":"C++ 11 Smart Pointers \u667a\u80fd\u6307\u9488"},"content":{"rendered":"\n<figure class=\"wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Smart Pointers \u667a\u80fd\u6307\u9488 - C++ Weekly EP3\" width=\"500\" height=\"375\" src=\"https:\/\/www.youtube.com\/embed\/KQt3IjGdqL8?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>Example code<\/p>\n\n\n\n<div class=\"responsive-tabs\">\n<h2 class=\"tabtitle\">C++<\/h2>\n<div class=\"tabcontent\">\n\n<pre lang=\"C++\">\n\/\/ Author: Huahua\n#include <iostream>\n#include <memory>\n\nclass Entity {\npublic:\n  Entity() { puts(\"Entity created!\"); }\n  ~Entity() { puts(\"Entity destroyed!\"); }\n};\n\nvoid ex1() {\n  puts(\"--------\");\n  puts(\"Entering ex1\");\n  {\n    puts(\"Entering ex1::scope1\");\n    auto e1 = std::make_unique<Entity>();    \n    puts(\"Leaving ex1::scope1\");\n  }\n  puts(\"Leaving ex1\");\n}\n\nvoid foo(std::unique_ptr<Entity>) {\n  puts(\"Entering foo\");\n  puts(\"Leaving foo\");\n}\n\nvoid ex2() {\n  puts(\"--------\");\n  puts(\"Entering ex2\");\n  auto e1 = std::make_unique<Entity>();  \n  foo(std::move(e1));\n  \/\/ e1 was destoried.\n  puts(\"Leaving ex2\");\n}\n\nvoid ex3() {\n  puts(\"--------\");\n  puts(\"Entering ex3\");\n  auto e1 = std::make_shared<Entity>();\n  std::cout << e1.use_count() << std::endl;\n  {\n    puts(\"Entering ex3::scope1\");\n    auto e2 = e1; \/\/ use_count ++\n    std::cout << e1.use_count() << std::endl;\n    auto e3 = std::move(e2); \/\/ use_count remains\n    std::cout << e1.use_count() << std::endl;\n    puts(\"Leaving ex3::scope1\");\n  }\n  std::cout << e1.use_count() << std::endl;\n  puts(\"Leaving ex3\");\n}\n\nvoid observe(std::weak_ptr<Entity> ew) {\n  if (std::shared_ptr<Entity> spt = ew.lock()) {\n    std::cout << spt.use_count() << std::endl;\n    std::cout << \"entity still alive!\" << std::endl;\n  } else {\n    std::cout << \"entity was expired :(\" << std::endl;\n  }\n}\n\nvoid ex4() {\n  puts(\"--------\");\n  puts(\"Entering ex4\");\n  std::weak_ptr<Entity> ew;  \n  {\n    puts(\"Entering ex4::scope1\");\n    auto e1 = std::make_shared<Entity>();\n    std::cout << e1.use_count() << std::endl;\n    ew = e1; \/\/ use_count remains\n    std::cout << e1.use_count() << std::endl;\n    observe(ew);\n    puts(\"Leaving ex4::scope1\");\n  }\n  observe(ew);\n  puts(\"Leaving ex4\");\n}\n\nint main(int argc, char** argv) {\n  ex1();\n  ex2();\n  ex3();\n  ex4();\n  return 0;\n}\n\n<\/pre>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Output<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\"> --------\nEntering ex1\nEntering ex1::scope1\nEntity created!\nLeaving ex1::scope1\nEntity destroyed!\nLeaving ex1\n--------\nEntering ex2\nEntity created!\nEntering foo\nLeaving foo\nEntity destroyed!\nLeaving ex2\n--------\nEntering ex3\nEntity created!\n1\nEntering ex3::scope1\n2\n2\nLeaving ex3::scope1\n1\nLeaving ex3\nEntity destroyed!\n--------\nEntering ex4\nEntering ex4::scope1\nEntity created!\n1\n1\n2\nentity still alive!\nLeaving ex4::scope1\nEntity destroyed!\nentity was expired :(\nLeaving ex4<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Example code \/\/ Author: Huahua #include #include class Entity { public: Entity() { puts(&#8220;Entity created!&#8221;); } ~Entity() { puts(&#8220;Entity destroyed!&#8221;); } }; void ex1() {&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[600],"tags":[38,616],"class_list":["post-6896","post","type-post","status-publish","format-standard","hentry","category-c","tag-c","tag-smart-pointers","entry","simple"],"_links":{"self":[{"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/posts\/6896","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/comments?post=6896"}],"version-history":[{"count":3,"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/posts\/6896\/revisions"}],"predecessor-version":[{"id":6899,"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/posts\/6896\/revisions\/6899"}],"wp:attachment":[{"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/media?parent=6896"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/categories?post=6896"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/tags?post=6896"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}