{"id":280,"date":"2018-02-17T17:42:25","date_gmt":"2018-02-17T17:42:25","guid":{"rendered":"http:\/\/www.yazilimperver.com\/?p=280"},"modified":"2024-07-14T21:07:11","modified_gmt":"2024-07-14T21:07:11","slug":"modern-c-4-smart-pointers-ii","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/","title":{"rendered":"Modern C++ (4) : Smart Pointers \u2013 II"},"content":{"rendered":"<p>Evet arkada\u015flar ak\u0131ll\u0131 i\u015faret\u00e7iler ser\u00fcvenimize devam ediyoruz. Bu yaz\u0131mda ak\u0131ll\u0131 C++11 ile gelen shared_ptr ve weak_ptr s\u0131n\u0131flar\u0131n\u0131 inceleyece\u011fiz. \u0130lk yaz\u0131ma a\u015fa\u011f\u0131daki adresten ula\u015fabilirsiniz.<\/p>\n<p><a href=\"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/\">Modern C++ (4) : Smart Pointers &#8211; I<\/a><\/p>\n<h2><span style=\"color: #0000ff;\"><strong>std::shared_ptr<\/strong><\/span><\/h2>\n<p>Ak\u0131ll\u0131 i\u015faret\u00e7i denildi\u011finde akla gelen ilk s\u0131n\u0131f std::shared_ptr. std::unique_ptr&#8217;dan farkl\u0131 olarak &#8220;reference counting&#8221;\u00a0 dedi\u011fimiz kabiliyeti bar\u0131nd\u0131ran, i\u00e7erdi\u011fi nesnenin birden fazla s\u0131n\u0131f taraf\u0131ndan kullan\u0131lmas\u0131na olanak sa\u011flayan ve herhangi bir kullan\u0131c\u0131 kalmad\u0131\u011f\u0131nda da ilgili s\u0131n\u0131f\u0131 yok edebilen s\u0131n\u0131ft\u0131r kendisi. Asl\u0131nda burada herhangi bir spesifik shared_ptr bu nesneye sahip de\u011fil ve herhangi bir bu nesnenin yok edilmesinden sorumlu de\u011fil.<\/p>\n<p>Peki std::shared_ptr herhangi bir kullan\u0131c\u0131 kalmad\u0131\u011f\u0131n\u0131 nereden anl\u0131yor? \u0130\u015fte tam bu noktada &#8220;reference counting&#8221; mekanizmas\u0131 devreye giriyor. Bu mekanizman\u0131n temelinde asl\u0131nda std::shared_ptr ak\u0131ll\u0131 i\u015faret\u00e7isi i\u00e7erisinde kayna\u011fa olan referans adeti arac\u0131l\u0131\u011f\u0131 ile tutulan nesneyi g\u00f6steren her bir i\u015faret\u00e7i i\u00e7in tutulan say\u0131ya dayan\u0131yor.<\/p>\n<ul>\n<li>std::shared_ptr constructor&#8217;\u0131 \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda referans adeti bir artt\u0131r\u0131l\u0131r,<\/li>\n<li>std::shared_ptr destructor&#8217;\u0131 \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda ya da reset() API&#8217;si \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda (yani kapsamdan \u00e7\u0131k\u0131nca veya benzeri durumlarda) referans adeti bir azalt\u0131l\u0131r,<\/li>\n<li>std::shared_ptr copy constructor\/assignment durumlar\u0131nda ise (sharedPtrInstance1 = sharedPtrInstance2; \u00f6rne\u011fi i\u00e7in) sharedPtrInstance1 taraf\u0131ndan y\u00f6netilen nesne referans adeti bir azalt\u0131l\u0131r (art\u0131k bu shared_ptr onu g\u00f6stermiyor), sharedPtrInstance2 taraf\u0131ndan y\u00f6netilen nesne referans adeti bir artt\u0131rl\u0131r. \u00c7\u00fcnk\u00fc art\u0131k sharedPtrInstance1 de bu nesneyi kullan\u0131yor.<\/li>\n<li>Herhangi bir referans adeti azaltma i\u015flemi sonras\u0131nda e\u011fer bu adet 0 olur ise bu nesne otomatik olarak yok edilir,<\/li>\n<li>std::shared_ptr&#8217;lar\u0131n &#8220;move&#8221;\u00a0 mekanizmas\u0131 ile ta\u015f\u0131nmas\u0131 durumunda ise referans adeti ile ilgili herhangi bir de\u011fi\u015fiklik olmaz ve bu sebeple de di\u011fer i\u015flemlere g\u00f6re daha h\u0131zl\u0131 bir \u015fekilde ger\u00e7ekle\u015ftirilebilir.<\/li>\n<\/ul>\n<p>\u015eimdi h\u0131zl\u0131ca std::unique_ptr&#8217;dan farklara ve fazlal\u0131klara bakal\u0131m:<\/p>\n<ul>\n<li>std::shared_ptr standart i\u015faretcilere g\u00f6re boyutu iki kata \u00e7\u0131kart\u0131r. Yukar\u0131da bahsetti\u011fimiz i\u015fleri yapabilmek i\u00e7in std::shared_ptr orjinal nesneye bir standart i\u015faret\u00e7i tutar ve bir de nesneye ili\u015fkin referans adetine bir standart i\u015faret\u00e7i tutulur (Not: C++ standard\u0131 bunu dikte etmiyor fakat genel olarak bu \u015fekilde ger\u00e7ekleniyor),<\/li>\n<li>Nesneye olaran referans adeti dinamik olarak bellekten al\u0131n\u0131r (ve bir tak\u0131m bir ka\u00e7 bilgi daha. Kontrol blo\u011fu ba\u015fl\u0131\u011f\u0131nda buna de\u011finece\u011fiz),<\/li>\n<li>Referans adeti artt\u0131rma ve azaltma i\u015flemleri atomik olarak ger\u00e7ekle\u015ftirilir, bu da normak olarak atomik olmayanlara g\u00f6re \u00e7ok \u00e7ok az da olsa bir fazlal\u0131k getirir,<\/li>\n<li>std::unique_ptr&#8217;larda oldu\u011fu gibi diziler i\u00e7in\u00a0std::shared_ptr&lt;T[]&gt; tarz\u0131 bir kullan\u0131m sunulmamaktad\u0131r. Bunun yerine std::array, std::vector kullan\u0131m\u0131 de\u011ferlendirilmelidir,<\/li>\n<li>unique_ptr&#8217;\u0131 shared_ptr kullan\u0131m\u0131na d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz ama tersi m\u00fcmk\u00fcn de\u011fil (zaten anlaml\u0131 da de\u011fil)<\/li>\n<\/ul>\n<h2><strong><span style=\"color: #0000ff;\">Genel Kullan\u0131m<\/span><\/strong><\/h2>\n<p>shared_ptr kullan\u0131m\u0131na bakacak olursak. shared_ptr&#8217;\u0131 new operat\u00f6r\u00fc ile olu\u015fturdu\u011funuz bir nesneyi ge\u00e7irerek olu\u015fturabilirsiniz. Ayr\u0131ca C++ 14 ve sonras\u0131nda make_shared ya da <a href=\"http:\/\/www.yazilimperver.com\/index.php\/2018\/02\/08\/modern-c-4-smart-pointers\/\">bir \u00f6nceki yaz\u0131m da verdi\u011fim<\/a> template \u00f6rne\u011fini de kullanabilirsiniz.<\/p>\n<p>Daha sonra bu shared_ptr nesnesini ayn\u0131 tipte olan ba\u015fka shared_ptr&#8217;lara atayabilir, kopyalayabilirsiniz, fonksiyondan d\u00f6nebilirsiniz, konteynerler i\u00e7erisine ekleyebilirsiniz. Burada dikkat etmeniz gereken shared_ptr&#8217;lar &#8220;copy by reference&#8221; mekanizmas\u0131 ile ge\u00e7irmeniz durumunda bunu kullanacak metot i\u00e7in nesne adeti artt\u0131r\u0131lmaz. \u0130lgili nesne kapsam d\u0131\u015f\u0131nda \u00e7\u0131kt\u0131\u011f\u0131nda, silindi\u011finde ya da reset() API&#8217;si \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda ilgili referans adeti azalt\u0131l\u0131r ve s\u0131f\u0131r ise y\u00f6netilen nesne de silinir. Bu durumda elinizde bo\u015f bir shared_ptr nesnesi olur. Ayr\u0131ca herhangi bir shared_ptr nesnesine nullptr atayarak ta ayn\u0131 sonucu alabilirsiniz.<\/p>\n<p>Normalde \u00e7ok kullan\u0131lmas\u0131 beklenmese de, ilgili shared_ptr nesnesinin i\u015faret etti\u011fi nesnenin standart i\u015faret\u00e7isini almak i\u00e7in get() API&#8217;sini kullanabilirsiniz. Tabiki bunun ile yapaca\u011f\u0131n\u0131z i\u015fler i\u00e7in veya bu i\u015faret\u00e7inin ilgili nesneti art\u0131k g\u00f6sterip g\u00f6stermedi\u011fi konusunda herhangi bir garanti sunulmaz \ud83d\ude42<\/p>\n<p>==, != operat\u00f6rleri aynen standart i\u015faret\u00e7ilerdeki gibi kullan\u0131labilir. Bunlar altta y\u00f6netilen nesneye ili\u015fkin i\u015faret\u00e7ileri kar\u015f\u0131la\u015ft\u0131r\u0131r. if(sharedPtrInstance) kullan\u0131m\u0131 da e\u011fer ilgili nesne bo\u015f ise\u00a0<em>false,\u00a0<\/em>e\u011fer herhangi bir nesneye i\u015faret ediyor ise <em>true<\/em> d\u00f6ner.<\/p>\n<p>A\u015fa\u011f\u0131da b\u00fct\u00fcn bu kullan\u0131mlara de\u011finen kod par\u00e7as\u0131n\u0131 g\u00f6rebilirsiniz.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true\">class Thing {\r\npublic:\r\nvoid doSomething();\r\n};\r\nostream&amp; operator&lt;&lt; (ostream&amp;, const Thing&amp;);\r\n...\r\n\/\/ Bir fonksiyon shared_ptr d\u00f6nebilir\r\nstd::shared_ptr&lt;Thing&gt;  returnSharedPtrInstance();\r\n\r\n\/\/ Bir fonksiyon shared_ptr \"pass by value\" ile alabilir\r\nstd::shared_ptr&lt;Thing&gt; useSharedPtr(std::shared_ptr&lt;Thing&gt; p);\r\n\r\nvoid foo()\r\n{\r\n    \/\/ yeni bir shaerd_ptr olu\u015fturmak i\u00e7in\r\n    std::shared_ptr&lt;Thing&gt; p1(new Thing);    \r\n    \r\n    \/\/ Y\u00f6netilen nesneye standart i\u015faret\u00e7i d\u00f6nmek i\u00e7in\r\n    Thing* p1RawPtr = p1.get();\r\n...\r\n    \/\/ p1 ve p2 Thing'in ortak sahipleri\r\n    std::shared_ptr&lt;Thing&gt; p2 = p1; \r\n...\r\n   \/\/ farkl\u0131 bir Thing nesnesi\r\n   shared_ptr&lt;Thing&gt; p3(new Thing); \r\n\r\n   \/\/ p1 art\u0131k ilk Thing nesnesini i\u015faret etmiyor olabilir\r\n   p1 = returnSharedPtrInstance(); \r\n\r\n   useSharedPtr(p2); \r\n\r\n    \/\/ S\u0131n\u0131f\u0131n metodunu standart i\u015faret\u00e7i gibi \u00e7a\u011f\u0131rma\r\n    p3-&gt;doSomething(); \r\n\r\n    \/\/ Standart i\u015faret\u00e7ilerdeki \"Dereference\" i\u015flemi ak\u0131ll\u0131 i\u015faret\u00e7iler i\u00e7in de ge\u00e7erli\r\n    std::cout &lt;&lt; *p2 &lt;&lt; std::endl;\r\n\r\n    \/\/ \u0130lgili shared_ptr nesnesinin i\u015faret etti\u011fi nesneye art\u0131k adresleme\r\n    \/\/ Referans adetini bir d\u00fc\u015f\u00fcr e\u011fer s\u0131f\u0131r ise nesneyi yoket\r\n    p1.reset(); \r\n    p2 = nullptr; \r\n}\r\n\r\n\/\/ p1, p2, p3 kapsam d\u0131\u015f\u0131na \u00e7\u0131kt\u0131\u011f\u0131 i\u00e7in referans adetlerini azalt ve Thing nesnelerini yok et<\/pre>\n<h2><strong><span style=\"color: #0000ff;\">shared_ptr&#8217;da Miras ve &#8220;Casting&#8221;\u00a0<\/span><\/strong><\/h2>\n<p>shared_ptr&#8217;larda da miraz benzer \u015fekilde ele al\u0131n\u0131r. \u00d6rne\u011fin standart i\u015faret\u00e7iler i\u00e7in bulunan a\u015fa\u011f\u0131daki hiyerar\u015fiye bakal\u0131m:<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true \">class Base {};\r\nclass Derived : public Base {};\r\n...\r\nDerived * dp1 = new Derived;\r\nBase * bp1 = dp1;\r\nBase * bp2(dp1);\r\nBase * bp3 = new Derived;<\/pre>\n<p>E\u011fer shared_ptr taraf\u0131ndan y\u00f6netilen nesneler gerekli kopyalama kabiliyetlerini sunuyorlar ise a\u015fa\u011f\u0131daki shared_ptr kullan\u0131m\u0131 ger\u00e7ekle\u015ftirilebilmektedir:<\/p>\n<pre class=\"lang:c++ decode:true \">class Base {};\r\nclass Derived : public Base {};\r\n...\r\nshared_ptr&lt;Derived&gt; dp1(new Derived);\r\nshared_ptr&lt;Base&gt; bp1 = dp1;\r\nshared_ptr&lt;Base&gt; bp2(dp1);\r\nshared_ptr&lt;Base&gt; bp3(new Derived);<\/pre>\n<p>Ak\u0131ll\u0131 i\u015faret\u00e7i nesnelerinin bir birlerine &#8220;cast&#8221; edilebilmesi i\u00e7in de standart i\u015faret\u00e7iler i\u00e7in sunulan <em>static_cast, dynamic_cast, const_cast<\/em> muadilleri\u00a0<em>static_pointer_cast, dynamic_pointer_cast <\/em>ve\u00a0<em>const_pointer_cast<\/em> metotlar\u0131\u00a0sunulmu\u015ftur.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true\">shared_ptr&lt;Base&gt; base_ptr (new Base);\r\nshared_ptr&lt;Derived&gt; derived_ptr;\r\n\/\/ E\u011fer static_cast&lt;Derived *&gt;(base_ptr.get()) ge\u00e7erli ise a\u015fa\u011f\u0131daki\r\n\/\/ kullan\u0131m da ge\u00e7erlidir\r\nderived_ptr = static_pointer_cast&lt;Derived&gt;(base_ptr);<\/pre>\n<h2><strong><span style=\"color: #0000ff;\">\u00d6zelle\u015fmi\u015f Silici (custom delete)<\/span><\/strong><\/h2>\n<p>std::unique_ptr&#8217;da oldu\u011fu gibi\u00a0std::shared_ptr de i\u015faret etti\u011fi kayna\u011f\u0131 yok edilmesi i\u00e7in varsay\u0131lan olarak <em>delete<\/em> operat\u00f6r\u00fcn\u00fc kullan\u0131yor, fakat \u00f6nemli bir farkl\u0131l\u0131k ta bulunmakta. O da, std::unique_ptr&#8217;da silicinin tipi ak\u0131ll\u0131 i\u015faret\u00e7inin par\u00e7as\u0131 iken std::shared_ptr da kendisi bir par\u00e7as\u0131 oluyor. A\u015fa\u011f\u0131da buna ili\u015fkin bir \u00f6rnek g\u00f6rebilirsiniz. Bunun getirdi\u011fi en \u00f6nemli fayda her bir nesneye farkl\u0131 \u00f6zelle\u015fmi\u015f silme mant\u0131klar\u0131 atayabilmek, bu\u00a0std::unique_ptr&#8217;da m\u00fcmk\u00fcn de\u011fil.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true\">\/\/ \u0130\u015faret edilen nesneye ili\u015fkin \u00f6zelle\u015fmi\u015f silici\r\nauto monitorDeletion = [](Ornek *instance)        \r\n{                     \r\n     logDeletion(instance);\r\n     delete instance;\r\n};\r\n\r\n\/\/ Ak\u0131ll\u0131 i\u015faret\u00e7ide \u00f6zelle\u015fmi\u015f silicinin tipi tutuluyor\r\nstd::unique_ptr&lt;Ornek, decltype(monitorDeletion)&gt; \r\nuniqInstance(new Ornek, monitorDeletion);\r\n\r\n\/\/ Ak\u0131ll\u0131 i\u015faret\u00e7inin kendisi tutuluyor\r\nstd::shared_ptr&lt;Ornek&gt; sharedInstance(new instance, monitorDeletion);<\/pre>\n<h2><strong><span style=\"color: #0000ff;\">Kontrol Blo\u011fu<\/span><\/strong><\/h2>\n<p>Burada \u015fu akla gelebilir b\u00fct\u00fcn bu \u00f6zelle\u015fmi\u015f siliciler i\u00e7in shared_ptr ekstra bir bellek tutuyor mu? Bu sorunun cevab\u0131 hay\u0131r, bu shared_ptr&#8217;\u0131n bir para\u00e7ac\u0131 de\u011fil. Tabi burda dikkat edilmesi gereken bir husus var. Bir ka\u00e7 paragraf \u00f6ncesinde ifade etti\u011fimiz gibi nesne referans adeti i\u00e7in ayr\u0131ca bir standart i\u015faret\u00e7i tutuluyor ve bunun i\u00e7in bellekten yer al\u0131n\u0131yor, fakat burada bu i\u015faret\u00e7inin g\u00f6sterdi\u011fi \u015fey sadece nesne adeti de\u011fil ve daha b\u00fcy\u00fck bir yap\u0131 asl\u0131nda bu alan\u0131n\/veri yap\u0131s\u0131 kontrol blok&#8217;u olarak ta adland\u0131r\u0131l\u0131yor. shared_ptr taraf\u0131ndan i\u015faret edilen her bir nesne i\u00e7in kontrol blo\u011fu tutuluyor. Bu blok, nesne referans adeti (Reference Count) yan\u0131nda, e\u011fer atanm\u0131\u015fsa \u00f6zelle\u015fmi\u015f silici biraz sonra anlataca\u011f\u0131m\u0131z zay\u0131f nesne referans adeti (Weak Count) ve yine atanm\u0131\u015fsa \u00f6zelle\u015fmi\u015f bellek yer al\u0131c\u0131lar\u0131 (Allocator). A\u015fa\u011f\u0131daki fig\u00fcrde bu anlat\u0131lan alanlar\u0131 g\u00f6rebilirsiniz.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/www.safaribooksonline.com\/library\/view\/effective-modern-c\/9781491908419\/assets\/emcp_04in02.png\" alt=\"Image\" width=\"447\" height=\"246\" \/><\/p>\n<p>Bu kontrol blo\u011fu ilk defa shared_ptr olu\u015fturuldu\u011fu zaman veya benzeri durumlarda olu\u015fturulmakta (std::make_shared \u00e7a\u011fr\u0131lar\u0131nda,\u00a0std::unique_ptr kullan\u0131larak olu\u015fturuldu\u011funda,\u00a0std::shared_ptr\u00a0 standart bir i\u015faret\u00e7i arac\u0131l\u0131\u011f\u0131 ile olu\u015fturuldu\u011funda). Burada dikkat edilmesi gereken nokta elinizde bulunan standart i\u015faret\u00e7iyi iki ayr\u0131 shared_ptr&#8217;a ge\u00e7irirseniz iki ayr\u0131 kontrol blo\u011fu olu\u015fturursunuz. Bu sebeple shared_ptr&#8217;lar\u0131 standart i\u015faret\u00e7ileri ge\u00e7irerek olu\u015fturmak yerine make_shared tarz\u0131 yap\u0131lar kullanman\u0131z bu t\u00fcr s\u0131k\u0131nt\u0131lar\u0131n \u00f6n\u00fcne ge\u00e7ecektir. \u0130lla standart i\u015faret\u00e7iyi ge\u00e7irmeniz gerekiyor ise new operat\u00f6r\u00fc ile olu\u015fturulmu\u015f nesneyi ge\u00e7irin. A\u015fa\u011f\u0131da bu durumu \u00f6zetleyen \u00f6rnek kod par\u00e7alar\u0131 eklemeye \u00e7al\u0131\u015ft\u0131m.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true\">\/\/ pw standart i\u015faret\u00e7i\r\nauto pw = new MyClass;\r\n\r\n\/\/ pw'nin y\u00f6netimi i\u00e7in sharedInstance1 bir kontrol blo\u011fu olu\u015fturuyor\r\nstd::shared_ptr&lt;MyClass&gt; sharedInstance1(pw);  \r\n\r\n\/\/ pw'nin y\u00f6netimi i\u00e7in sharedInstance2 yeni kontrol blo\u011fu olu\u015fturuyor\r\nstd::shared_ptr&lt;MyClass&gt; sharedInstance2(pw); \r\n\r\n\/\/ Direk olu\u015fturulan nesnenin ge\u00e7irilmesi \u00f6rne\u011fi\r\nstd::shared_ptr&lt;MyClass&gt; directUsageSP(new MyClass); \r\n\r\n\/\/ Ortak kontrol blo\u011fu kullan\u0131m \u00f6rne\u011fi. Genel olarak beklenen kullan\u0131m \u015fekli.\r\n\/\/ Burada tek bir kontrol blo\u011fu var ve sadece referans adeti artt\u0131r\u0131l\u0131yor.\r\nstd::shared_ptr&lt;MyClass&gt; sharedInstance2(sharedInstance1);<\/pre>\n<h2><strong><span style=\"color: #0000ff;\">std::enabled_shared_from_this<\/span><\/strong><\/h2>\n<p>Yukar\u0131da belirtilen kontrol blo\u011fu ile ilgili benzer bir problemi de this kullan\u0131m\u0131nda ya\u015fayabilirsiniz. \u00d6rne\u011fin a\u015fa\u011f\u0131daki kod par\u00e7as\u0131nda oldu\u011fu gibi std::vector konteyner\u0131 i\u00e7erisinde shared_ptr&lt;Node&gt;&#8217;lar\u0131 tutmak istedi\u011fimiz durumu d\u00fc\u015f\u00fcnelim.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true\">class SceneNode\r\n{\r\npublic:\r\n ...\r\n void TraverseNodes();\r\n  ...\r\nprotected:\r\n   std::vector&lt;std::shared_ptr&lt;SceneNode&gt;&gt; visitedNodes;\r\n};\r\n\r\nvoid SceneNode::TraverseNodes()\r\n{\r\n  ...\r\n  \/\/ Mevcut nesneye i\u015faret eden standart i\u015faret\u00e7i ile yeni bir shared_ptr\r\n  \/\/ olu\u015ftur ve listeye ekle\r\n  visitedNodes.emplace_back(this); \r\n}<\/pre>\n<p>Normalde bu s\u0131n\u0131fa dair yeni bir kontrol blo\u011fu ile bir shared_ptr olu\u015fturmak s\u0131k\u0131nt\u0131 olarak g\u00f6r\u00fclmese de, bu s\u0131n\u0131f\u0131n kendisinin de ba\u015fka bir shared_ptr taraf\u0131ndan y\u00f6netilmesi durumunda s\u0131k\u0131nt\u0131lar ortaya \u00e7\u0131kacakt\u0131r (\u00f6rne\u011fin benzer \u015fekilde iki kere emplace_back yaparsan\u0131z iki farkl\u0131 kontrol blo\u011fu olu\u015fturulur). \u0130\u015fte tam da bu durumlar i\u00e7in C++ k\u00fct\u00fcphanesi std::enable_shared_from_this isim template bir temel s\u0131n\u0131f sunar. Siz bu \u015fekilde kullanmak istedi\u011finiz s\u0131n\u0131flar\u0131 bu s\u0131n\u0131ftan t\u00fcretirsiniz, bu s\u0131n\u0131f ile birlikte <em>shared_from_this()<\/em> isimli bir API gelir. Yukar\u0131daki gibi shared_ptr olu\u015fturma ihtiyac\u0131 oldu\u011fu durumlarda bu API&#8217;yi kullanabilirsiniz.\u00a0 Bu da yukar\u0131daki durumlarda ya\u015fanabilecek s\u0131k\u0131nt\u0131lar\u0131n (ekstra bir kontrol blo\u011fu olu\u015fturma vs&#8217;nin) \u00f6n\u00fcne ge\u00e7er. A\u015fa\u011f\u0131da \u00f6rnek kullan\u0131m\u0131 g\u00f6rebilirsiniz.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true\">class SceneNode : public std::enabled_shared_from_this&lt;SceneNode&gt;\r\n{\r\npublic:\r\n ...\r\n void TraverseNodes();\r\n  ...\r\nprotected:\r\n   std::vector&lt;std::shared_ptr&lt;SceneNode&gt;&gt; visitedNodes;\r\n};\r\n\r\nvoid SceneNode::TraverseNodes()\r\n{\r\n  ...\r\n  visitedNodes.emplace_back(shared_from_this()); \r\n}<\/pre>\n<h2><span style=\"color: #0000ff;\"><strong>std::weak_ptr<\/strong><\/span><\/h2>\n<p>Evet ak\u0131ll\u0131 i\u015faret\u00e7iler yaz\u0131m\u0131z\u0131n son konu\u011fu std::weak_ptr&#8217;lar. Bu ak\u0131ll\u0131 i\u015faret\u00e7iyi tek c\u00fcmlede a\u00e7\u0131klamak gerekirse, &#8220;<em>y\u00f6netilen nesneyi sadece g\u00f6zlemleyip, var olup olmad\u0131\u011f\u0131n\u0131 kontrol edip, ya\u015fam d\u00f6ng\u00fcs\u00fcne ili\u015fkin herhangi bir mant\u0131k y\u00fcr\u00fctmeyen veya m\u00fcdahale etmeyen ak\u0131ll\u0131 i\u015faret\u00e7i<\/em>&#8221; diyebiliriz. std::weak_ptr&#8217;lar shared_ptr gibi davranan fakat herhangi bir sahiplik g\u00f6stermeyen (yani nesne adetleri \u00fczerinde herhangi bir etkisi olmayan) ak\u0131ll\u0131 i\u015faret\u00e7i olarak ta tariflenebilir.<\/p>\n<p>Peki neden ve ne i\u00e7in std::weak_ptr&#8217;\u0131 kullanmal\u0131y\u0131m?\u00a0std::weak_ptr&#8217;lar arac\u0131l\u0131\u011f\u0131 ile shared_ptr ile y\u00f6netilen bir nesnenin art\u0131k kullan\u0131labilir olup olmad\u0131\u011f\u0131n\u0131 takip edebilirsiniz. Hemen bir \u00f6rne\u011fe bakal\u0131m:<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true \">\/\/ spw olu\u015fturulduktan sonra buna olan referans adeti 1 olur.\r\nstd::shared_ptr&lt;Widget&gt; spw = std::make_shared&lt;Widget&gt;();    \r\n\r\n\u2026\r\n\r\n\/\/ wpw de ayn\u0131 \u015fekilde ayn\u0131 W\u0131dget nesnesini i\u015faret etmekte ve bu atama ile\r\n\/\/ referans adeti de\u011fi\u015fmez yani halen 1 dir.\r\nstd::weak_ptr&lt;Widget&gt; wpw(spw);  \r\n \r\n\/\/ Hen\u00fcz referans adeti 1 oldu\u011fu i\u00e7in false d\u00f6ner\r\nif(wpw.expired()                                \r\n\u2026\r\n\r\n\/\/ Art\u0131k Widget nesnesi yok edilir ve referans adeti 0 olur\r\nspw = nullptr;                  \r\n                                \r\n\/\/ Referans adeti 0 oldu\u011fu i\u00e7in true d\u00f6ner<\/pre>\n<p>\u00d6rne\u011fin e\u011fer kullan\u0131labilir ise bu nesnenin sahipli\u011fini almak isteyebilirsiniz. Bunun i\u00e7in de lock() API&#8217;si kullan\u0131labilir. E\u011fer lock() null d\u00f6ner ise ilgili nesnenin yok edildi\u011fini kabul edebilirsiniz.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true\">\/\/ E\u011fer wpw'nin i\u015fare etti\u011fi nesne yok edilmi\u015f ise nullptr d\u00f6ner\r\nstd::shared_ptr&lt;Widget&gt; spw1 = wpw.lock(); \r\n\r\nif (spw1)\r\n{\r\n   \/\/ spw1'e eri\u015f\r\n   spw1-&gt;...\r\n}\r\nelse\r\n{\r\n    std::cout &lt;&lt; \"Nesne kullanilamaz!\" &lt;&lt; std::endl;\r\n}<\/pre>\n<p>Bir di\u011fer weak_ptr kullan\u0131m\u0131 ise \u015fu durumda ortaya \u00e7\u0131kar. \u015e\u00f6yle bir senaryo d\u00fc\u015f\u00fcnelim elimizde 3 s\u0131n\u0131f var A, B ve C. Bunlarda A ve C, B&#8217;nin sahipli\u011fini payla\u015f\u0131yorlar ve B&#8217;den de \u00f6rne\u011fin A&#8217;ya bir referans tutulmas\u0131 ihtiyac\u0131 var ne kullanabiliriz?<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.safaribooksonline.com\/library\/view\/effective-modern-c\/9781491908419\/assets\/emcp_04in03.png\" alt=\"Image\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.safaribooksonline.com\/library\/view\/effective-modern-c\/9781491908419\/assets\/emcp_04in04.png\" alt=\"Image\" \/><\/p>\n<p>\u00dc\u00e7 se\u00e7ene\u011fimiz var:<\/p>\n<ol>\n<li><strong>Standart i\u015faret\u00e7i:<\/strong> Bu durumda e\u011fer A yok edilir ve C halen B&#8217;yi tuttu\u011fu i\u00e7in asl\u0131nda yok edilmi\u015f yani tan\u0131ml\u0131 olmayan bir A&#8217;ya ula\u015fabilir ve bu da beklenmedik davran\u0131\u015flara sebep olabilir.<\/li>\n<li><strong>std::shared_ptr<\/strong>: Bu durumda A ile B aras\u0131nda shared_ptr&#8217;lar \u00fczerinde bir d\u00f6ng\u00fc olu\u015fur ve bu da hem A hem de B&#8217;nin yok edilmesini \u00f6nler.<\/li>\n<li><strong>std::weak_ptr:\u00a0<\/strong>\u0130\u015fte bu kullan\u0131m yukar\u0131daki iki problemin de \u00fcstesinden gelir. E\u011fer A yok edilir ise B expired() API si arac\u0131l\u0131\u011f\u0131 ile bunu \u00f6\u011frenebilir, ayr\u0131ca B&#8217;nin weak_ptr \u00fczerinden A&#8217;y\u0131 adreslemesi A&#8217;n\u0131n referans adetini de\u011fi\u015ftirmedi\u011finden A yokedilebilir ve 2. maddedeki durumunda \u00f6n\u00fcne ge\u00e7ilmi\u015f olur.<\/li>\n<\/ol>\n<p>Evet arkada\u015flar bu yaz\u0131m ile birlikte ak\u0131ll\u0131 i\u015faret\u00e7iler konumuzu noktal\u0131yoruz, tabi her \u015feyi anlatt\u0131k m\u0131 muhakkak daha bir \u00e7ok \u00f6\u011frenilecek husus var fakat bu iki yaz\u0131 ile ak\u0131ll\u0131 i\u015faret\u00e7ileri hemen kullanmaya ba\u015flayabilirsiniz. Son olarak ak\u0131ll\u0131 i\u015faret\u00e7iler metotlara ge\u00e7irilmesi ve di\u011fer bir tak\u0131m hususlar i\u00e7in a\u015fa\u011f\u0131daki yaz\u0131lar\u0131 incelemenizi \u00f6neririm. G\u00f6r\u00fc\u015fmek dile\u011fiyle.<\/p>\n<blockquote class=\"wp-embedded-content\" data-secret=\"LNPeFK5f1P\"><p><a href=\"https:\/\/herbsutter.com\/2013\/06\/05\/gotw-91-solution-smart-pointer-parameters\/\">GotW #91 Solution: Smart Pointer&nbsp;Parameters<\/a><\/p><\/blockquote>\n<p><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8220;GotW #91 Solution: Smart Pointer&nbsp;Parameters&#8221; &#8212; Sutter\u2019s Mill\" src=\"https:\/\/herbsutter.com\/2013\/06\/05\/gotw-91-solution-smart-pointer-parameters\/embed\/#?secret=e8s0V5xauj#?secret=LNPeFK5f1P\" data-secret=\"LNPeFK5f1P\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe><\/p>\n<blockquote class=\"wp-embedded-content\" data-secret=\"ECqyzcdUib\"><p><a href=\"https:\/\/herbsutter.com\/2013\/05\/29\/gotw-89-solution-smart-pointers\/\">GotW #89 Solution: Smart&nbsp;Pointers<\/a><\/p><\/blockquote>\n<p><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8220;GotW #89 Solution: Smart&nbsp;Pointers&#8221; &#8212; Sutter\u2019s Mill\" src=\"https:\/\/herbsutter.com\/2013\/05\/29\/gotw-89-solution-smart-pointers\/embed\/#?secret=Xt5AwSBG2G#?secret=ECqyzcdUib\" data-secret=\"ECqyzcdUib\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Evet arkada\u015flar ak\u0131ll\u0131 i\u015faret\u00e7iler ser\u00fcvenimize devam ediyoruz. Bu yaz\u0131mda ak\u0131ll\u0131 C++11 ile gelen shared_ptr ve weak_ptr s\u0131n\u0131flar\u0131n\u0131 inceleyece\u011fiz. \u0130lk yaz\u0131ma a\u015fa\u011f\u0131daki adresten ula\u015fabilirsiniz. Modern C++ (4) : Smart Pointers &#8211; I std::shared_ptr Ak\u0131ll\u0131 i\u015faret\u00e7i denildi\u011finde akla gelen ilk s\u0131n\u0131f std::shared_ptr. std::unique_ptr&#8217;dan farkl\u0131 olarak &#8220;reference counting&#8221;\u00a0 dedi\u011fimiz kabiliyeti bar\u0131nd\u0131ran, i\u00e7erdi\u011fi nesnenin birden fazla s\u0131n\u0131f taraf\u0131ndan kullan\u0131lmas\u0131na&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":174,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[10,41],"tags":[46,42,75,82],"class_list":["post-280","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-modern-c","tag-c-11","tag-modern-c","tag-shared_ptr","tag-weak_ptr"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Modern C++ (4) : Smart Pointers \u2013 II - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Modern C++ (4) : Smart Pointers \u2013 II - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Evet arkada\u015flar ak\u0131ll\u0131 i\u015faret\u00e7iler ser\u00fcvenimize devam ediyoruz. Bu yaz\u0131mda ak\u0131ll\u0131 C++11 ile gelen shared_ptr ve weak_ptr s\u0131n\u0131flar\u0131n\u0131 inceleyece\u011fiz. \u0130lk yaz\u0131ma a\u015fa\u011f\u0131daki adresten ula\u015fabilirsiniz. Modern C++ (4) : Smart Pointers &#8211; I std::shared_ptr Ak\u0131ll\u0131 i\u015faret\u00e7i denildi\u011finde akla gelen ilk s\u0131n\u0131f std::shared_ptr. std::unique_ptr&#8217;dan farkl\u0131 olarak &#8220;reference counting&#8221;\u00a0 dedi\u011fimiz kabiliyeti bar\u0131nd\u0131ran, i\u00e7erdi\u011fi nesnenin birden fazla s\u0131n\u0131f taraf\u0131ndan kullan\u0131lmas\u0131na... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2018-02-17T17:42:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-07-14T21:07:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png\" \/>\n\t<meta property=\"og:image:width\" content=\"32\" \/>\n\t<meta property=\"og:image:height\" content=\"32\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"yaz\u0131l\u0131mperver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"yaz\u0131l\u0131mperver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4\"},\"headline\":\"Modern C++ (4) : Smart Pointers \u2013 II\",\"datePublished\":\"2018-02-17T17:42:25+00:00\",\"dateModified\":\"2024-07-14T21:07:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/\"},\"wordCount\":1973,\"commentCount\":4,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"C++ 11\",\"Modern C++\",\"shared_ptr\",\"weak_ptr\"],\"articleSection\":[\"C++\",\"Modern C++\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/\",\"name\":\"Modern C++ (4) : Smart Pointers \u2013 II - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2018-02-17T17:42:25+00:00\",\"dateModified\":\"2024-07-14T21:07:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Modern C++ (4) : Smart Pointers \u2013 II\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.yazilimperver.com\/#website\",\"url\":\"https:\/\/www.yazilimperver.com\/\",\"name\":\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"description\":\"Payla\u015fmak g\u00fczeldir.\",\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.yazilimperver.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"contentUrl\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"logo\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"description\":\"\u00d6\u011frenmeyi ve payla\u015fmay\u0131 seven bir yaz\u0131l\u0131mperver :)\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Modern C++ (4) : Smart Pointers \u2013 II - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/","og_locale":"tr_TR","og_type":"article","og_title":"Modern C++ (4) : Smart Pointers \u2013 II - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Evet arkada\u015flar ak\u0131ll\u0131 i\u015faret\u00e7iler ser\u00fcvenimize devam ediyoruz. Bu yaz\u0131mda ak\u0131ll\u0131 C++11 ile gelen shared_ptr ve weak_ptr s\u0131n\u0131flar\u0131n\u0131 inceleyece\u011fiz. \u0130lk yaz\u0131ma a\u015fa\u011f\u0131daki adresten ula\u015fabilirsiniz. Modern C++ (4) : Smart Pointers &#8211; I std::shared_ptr Ak\u0131ll\u0131 i\u015faret\u00e7i denildi\u011finde akla gelen ilk s\u0131n\u0131f std::shared_ptr. std::unique_ptr&#8217;dan farkl\u0131 olarak &#8220;reference counting&#8221;\u00a0 dedi\u011fimiz kabiliyeti bar\u0131nd\u0131ran, i\u00e7erdi\u011fi nesnenin birden fazla s\u0131n\u0131f taraf\u0131ndan kullan\u0131lmas\u0131na... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2018-02-17T17:42:25+00:00","article_modified_time":"2024-07-14T21:07:11+00:00","og_image":[{"width":32,"height":32,"url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png","type":"image\/png"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"13 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4"},"headline":"Modern C++ (4) : Smart Pointers \u2013 II","datePublished":"2018-02-17T17:42:25+00:00","dateModified":"2024-07-14T21:07:11+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/"},"wordCount":1973,"commentCount":4,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["C++ 11","Modern C++","shared_ptr","weak_ptr"],"articleSection":["C++","Modern C++"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/","name":"Modern C++ (4) : Smart Pointers \u2013 II - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2018-02-17T17:42:25+00:00","dateModified":"2024-07-14T21:07:11+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Modern C++ (4) : Smart Pointers \u2013 II"}]},{"@type":"WebSite","@id":"https:\/\/www.yazilimperver.com\/#website","url":"https:\/\/www.yazilimperver.com\/","name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","description":"Payla\u015fmak g\u00fczeldir.","publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.yazilimperver.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","contentUrl":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","caption":"yaz\u0131l\u0131mperver"},"logo":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/"}},{"@type":"Person","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g","caption":"yaz\u0131l\u0131mperver"},"description":"\u00d6\u011frenmeyi ve payla\u015fmay\u0131 seven bir yaz\u0131l\u0131mperver :)"}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/280","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=280"}],"version-history":[{"count":11,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/280\/revisions"}],"predecessor-version":[{"id":2935,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/280\/revisions\/2935"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media\/174"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=280"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=280"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=280"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}