{"id":266,"date":"2021-12-30T21:15:21","date_gmt":"2021-12-30T21:15:21","guid":{"rendered":"http:\/\/www.yazilimperver.com\/?p=266"},"modified":"2021-12-30T18:08:41","modified_gmt":"2021-12-30T18:08:41","slug":"modern-c-4-smart-pointers","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/","title":{"rendered":"Modern C++ (4) : Smart Pointers-I"},"content":{"rendered":"<p><strong><span style=\"color: #ff0000;\">G\u00fcncelleme (auto_ptr vs unique_ptr):<\/span><\/strong><\/p>\n<p>Tekrar merhaba arkada\u015flar, gelen bir iki yorum sonras\u0131nda bir konuyu a\u00e7\u0131kl\u0131\u011fa kavu\u015fturmakta fayda oldu\u011funu d\u00fc\u015f\u00fcnd\u00fcm. Bu da std::unique_ptr ile std::auto_ptr aras\u0131ndaki fark. Ger\u00e7i yaz\u0131mda, std::auto_ptr&#8217;\u0131n pek bir anlam\u0131 kalmad\u0131\u011f\u0131n\u0131, bu ama\u00e7la std::unique_ptr kullan\u0131labilece\u011fini ifade etmi\u015ftim ama merakl\u0131 arkada\u015flar i\u00e7in bir ka\u00e7 kelam etmekte bir sak\u0131nca yok.<\/p>\n<p>auto_ptr&#8217;\u0131n kopya yap\u0131c\u0131s\u0131 ve atama operat\u00f6r\u00fc, tutulan i\u015faret\u00e7iyi kopyalamamakta, sadece transfer etmektedir ve kopyalanan ilk auto_ptr nesnesini bo\u015f b\u0131rakmaktad\u0131r. Hemen bir \u00f6rnek kod ile inceleyelim:<\/p>\n<pre class=\"lang:c++ decode:true \">\/\/ C++ program to illustrate the use of auto_ptr\r\n#include &lt;iostream&gt;\r\n#include &lt;memory&gt;\r\n  \r\nclass A {\r\npublic:\r\n    void show() { std::cout &lt;&lt; \"A::show()\\n\"; }\r\n};\r\n  \r\nint main()\r\n{\r\n    std::auto_ptr&lt;A&gt; p1(new A);\r\n    p1-&gt;show();\r\n  \r\n    std::cout &lt;&lt; p1.get() &lt;&lt; \"\\n\";\r\n  \r\n    \/\/ Kopya yap\u0131c\u0131 \u00e7a\u011fr\u0131l\u0131r ve p1 bo\u015falt\u0131l\u0131r.\r\n    std::auto_ptr&lt;A&gt; p2(p1);\r\n    p2-&gt;show();\r\n  \r\n    \/\/ p1 art\u0131k bo\u015f\r\n    std::cout &lt;&lt; p1.get() &lt;&lt; \"\\n\";\r\n  \r\n    \/\/ p1 art\u0131k p2'de\r\n    std::cout &lt;&lt; p2.get() &lt;&lt; \"\\n\";\r\n  \r\n    return 0;\r\n}<\/pre>\n<p>Yukar\u0131daki kodu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, ilgili kabiliyetin &#8220;depreceated&#8221; oldu\u011funa ili\u015fkin uyar\u0131 yan\u0131nda a\u015fa\u011f\u0131dakine benzer bir \u00e7\u0131kt\u0131 alacaks\u0131n\u0131z:<\/p>\n<pre class=\"lang:ps decode:true\">main.cpp:21:10: warning: \u2018template&lt;class&gt; class std::auto_ptr\u2019 is deprecated [-Wdeprecated-declarations]\r\n21 | std::auto_ptr&lt;A&gt; p1(new A);\r\n| ^~~~~~~~\r\nIn file included from \/usr\/include\/c++\/9\/memory:80,\r\nfrom main.cpp:12:\r\n\/usr\/include\/c++\/9\/bits\/unique_ptr.h:53:28: note: declared here\r\n53 | template&lt;typename&gt; class auto_ptr;\r\n| ^~~~~~~~\r\nmain.cpp:27:10: warning: \u2018template&lt;class&gt; class std::auto_ptr\u2019 is deprecated [-Wdeprecated-declarations]\r\n27 | std::auto_ptr&lt;A&gt; p2(p1);\r\n| ^~~~~~~~\r\nIn file included from \/usr\/include\/c++\/9\/memory:80,\r\nfrom main.cpp:12:\r\n\/usr\/include\/c++\/9\/bits\/unique_ptr.h:53:28: note: declared here\r\n53 | template&lt;typename&gt; class auto_ptr;\r\n| ^~~~~~~~\r\nA::show()\r\n0x55af16d93eb0\r\nA::show()\r\n0\r\n0x55af16d93eb0<\/pre>\n<p>Bu kabiliyet C++ 11 ile onaylanmam\u0131\u015f olarak etiketlenmi\u015f ve C++ 17 ile de tamamen kald\u0131r\u0131lm\u0131\u015ft\u0131r. Bu s\u0131n\u0131f\u0131n\u00a0 s\u0131k\u0131nt\u0131s\u0131, atama operat\u00f6r\u00fc ile birlikte \u00f6nceki nesneyi s\u0131f\u0131rlamas\u0131ndan \u00f6t\u00fcr\u00fc, STL konteynerlerinde kullan\u0131lamamas\u0131 ve C++ 11 ile gelen std::unique_ptr&#8217;\u0131n, ta\u015f\u0131ma mekanikleri ile daha emniyetli bir mekanizma sunmas\u0131d\u0131r. Uzun laf\u0131n k\u0131sas\u0131, std::auto_ptr, yerine std::unique_ptr kullanabilirsiniz.<\/p>\n<p>\u015eimdi orjinal yaz\u0131ya d\u00f6nebiliriz \ud83d\ude42<\/p>\n<p>Aray\u0131 \u00e7ok a\u00e7madan bir sonraki Modern C++ yaz\u0131m\u0131 da C++ 11 ile gelen bence en \u00f6nemli \u00f6zelliklerden biri olan ve her bir C++ geli\u015ftiricisinin g\u00fcnl\u00fck olarak kullanmas\u0131 gerekti\u011fini d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm <strong>Ak\u0131ll\u0131 \u0130\u015faret\u00e7iler<\/strong> yani &#8220;Smart Pointer&#8221; konusuna ay\u0131raca\u011f\u0131m.<\/p>\n<p>Normalde bu konuyu tek bir yaz\u0131da ele alacakt\u0131m ama \u00e7ok uzun olmas\u0131n diye hem de aray\u0131 da \u00e7ok a\u00e7mamak ad\u0131na iki par\u00e7a haline yay\u0131nlayaca\u011f\u0131m. \u0130lk yaz\u0131mda ak\u0131ll\u0131 i\u015faret\u00e7ilere genel giri\u015f\/motivasyon ve <em>unique_ptr<\/em> konusuna dalaca\u011f\u0131z. Sonraki yaz\u0131mda da, <em>shared_ptr<\/em> ve <em>weak_ptr<\/em> konular\u0131na de\u011finece\u011fim.<\/p>\n<p>\u0130kinci yaz\u0131m i\u00e7in:<\/p>\n<p><span style=\"color: #339966;\"><strong><a style=\"color: #339966;\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/17\/modern-c-4-smart-pointers-ii\/\">Modern C++ (4) : Smart Pointers \u2013 II<\/a><\/strong><\/span><\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Motivasyon<\/strong><\/span><\/h2>\n<p>Daha \u00f6nceki yaz\u0131lar\u0131mda da ifade etti\u011fim gibi Modern C++&#8217;\u0131n getirdi\u011fi bence en \u00f6nemli hususlardan birisi de dilde d\u00fc\u015f\u00fclen hatalar\u0131 minimize etmek. Tahmin edece\u011finiz \u00fczere de C ve C++ dillerinde yaz\u0131l\u0131mc\u0131lar\u0131n d\u00fc\u015ft\u00fc\u011f\u00fc hatalar\u0131n bir \u00e7o\u011funun kayna\u011f\u0131n\u0131n HATALI \u0130\u015faret\u00e7iler kullan\u0131m\u0131 oldu\u011funu g\u00f6rebilirsiniz. Hatal\u0131 diyorum \u00e7\u00fcnk\u00fc i\u015faret\u00e7iler asl\u0131nda do\u011fru kullan\u0131ld\u0131\u011f\u0131nda ger\u00e7ekten olduk\u00e7a g\u00fc\u00e7l\u00fc bir ara\u00e7. Bu noktada sahiplik ya da &#8220;Ownership&#8221; mevzusuna girmekte fayda var. \u00d6zellikle dinamik olarak olu\u015fturulan (yani &#8220;new&#8221; operat\u00f6r\u00fc kullan\u0131larak olu\u015fturulan, art\u0131k malloc tan bahsetmek bile istemiyorum \ud83d\ude42 nesneler i\u00e7in sahiplik \u00e7ok \u00f6nemlidir.<\/p>\n<p>Bir nesnenin sahibi olmak demek onun hayat d\u00f6ng\u00fcs\u00fcn\u00fc de y\u00f6netmek anlam\u0131na geliyor. Bu da onu olu\u015fturdu\u011fumuz gibi &#8220;delete&#8221; operat\u00f6r\u00fc ile ne zaman silece\u011fimiz sorumlulu\u011funu da y\u00fcklenmemiz gerekti\u011fi anlam\u0131na geliyor (kendinizi bir an \u00e7ocuk yeti\u015fdirme yaz\u0131s\u0131nda buldu\u011funuz d\u00fc\u015f\u00fcnd\u00fcrtt\u00fcysem \u00fczg\u00fcn\u00fcm :). Bu noktada sahiplik mekanizmas\u0131n\u0131n do\u011fru bir \u015fekilde i\u015fletilmemesi durumunda i\u015faret\u00e7iler ile ilgili problemler ortaya \u00e7\u0131kmaya ba\u015fl\u0131yor:<\/p>\n<ul>\n<li>Bellek s\u0131z\u0131nt\u0131lar\u0131,<\/li>\n<li>Art\u0131k var olmayan\/silinmi\u015f i\u015faret\u00e7ilere eri\u015fim veya tekrar silmeye \u00e7al\u0131\u015fmak,<\/li>\n<li>Herhangi bir yere i\u015faret etmeyen i\u015faret\u00e7ilerin kullan\u0131lmas\u0131.<\/li>\n<\/ul>\n<p>Bunlar\u0131 da bellek s\u0131z\u0131nt\u0131s\u0131 ve bellek bozulmas\u0131 alt\u0131nda toplayabiliriz. Bunlar ve daha detayl\u0131 i\u015faret\u00e7i hususlar\u0131 i\u00e7in C++ duayenlerinden olan Scott Meyers&#8217;e kulak verelim. Kendisi kitab\u0131nda standart i\u015faret\u00e7ilere ili\u015fkin a\u015fa\u011f\u0131daki s\u0131k\u0131nt\u0131lardan bahseder:<\/p>\n<p><strong>1)<\/strong> &#8220;\u0130\u015faret\u00e7ilerin deklarasyonundan ilgili i\u015faret\u00e7inin tek bir nesneye mi yoksa bir diziye mi i\u015faret etti\u011fi anla\u015f\u0131lamamakta.&#8221;<br \/>\nBurada biz de bir basit bir \u00f6rnek verelim:<\/p>\n<pre class=\"lang:c++ decode:true\">int deneme = 3;\r\nint denemeArray[] = {1, 2, 3, 4, 5};\r\n\r\n\/\/ Burada denemePtr basit veri yap\u0131s\u0131na i\u015faret ediyor\r\nint* denemePtr = &amp;deneme;\r\n\r\n\/\/ Burada denemePtr bir diziye i\u015faret ediyor\r\nint* denemePtr = &amp;denemeArray[0];<\/pre>\n<p><strong>2)<\/strong> Deklarasyona bakarak ilgili nesne ile i\u015finiz bitti mi onu silip\/silemeyece\u011fimize ili\u015fkin herhangi bir bilgi sunmaz. Ba\u015fka birisi de ayn\u0131 zamanda kullan\u0131yor olabilir.<\/p>\n<p><strong>3)<\/strong> Velev ki onu silmeniz gerekti\u011fini biliyorsunuz, yani kontrol size. Fakat bu sefer de nas\u0131l silece\u011finizi bilemeyebilirsiniz. Yani delete operat\u00f6r\u00fcn\u00fc m\u00fc kullanmal\u0131s\u0131n\u0131z, yoksa silme i\u015flemi i\u00e7in ayr\u0131 bir metoda m\u0131 ge\u00e7irmelisiniz. Bunu bilmenize imkan yok.<\/p>\n<p><strong>4)<\/strong> Yine diyelim ki silme i\u00e7in \u00f6zel bir metot olmad\u0131\u011f\u0131n\u0131 biliyorsunuz. Yani delete operat\u00f6r\u00fc kullan\u0131lacak. Bu durumda da ilk madde ile ilintili olarak delete mi delete [] operat\u00f6r\u00fc m\u00fc kullan\u0131lacak bilemeyebilirsiniz.<\/p>\n<p><strong>5)<\/strong> Yukar\u0131daki her hususu biliyor olsan\u0131z bile, kodun herhangi bir yerinde belirtti\u011finiz kayna\u011f\u0131n bir kere silindi\u011finden ya da herhangi bir kullan\u0131c\u0131 taraf\u0131ndan silindi\u011finden emin olamazs\u0131n\u0131z. Bu da asl\u0131nda yaz\u0131m\u0131n ba\u015f\u0131nda bahsetti\u011fim s\u0131k\u0131nt\u0131lar\u0131 do\u011furabilir.<\/p>\n<p><strong>6)<\/strong> Bir di\u011fer s\u0131k\u0131nt\u0131 da herhangi bir i\u015faret\u00e7inin o an ge\u00e7erli bir veriyi adresleyip\/adreslemedi\u011fini bilmenin bir yolunun olmamas\u0131d\u0131r.<\/p>\n<p>\u0130\u015fte ak\u0131ll\u0131 i\u015faret\u00e7iler de bu hususlar\u0131n \u00fcstesinden gelmek i\u00e7in geli\u015ftirilerek dile dahil edilen yap\u0131lard\u0131r. C++ k\u00fct\u00fcphanelerinin en \u00fcnl\u00fclerinden olan Boost kullan\u0131yor iseniz, boost ak\u0131ll\u0131 i\u015faret\u00e7ilere uzunca bir s\u00fcredir sahip. C++ 11 ile gelen kabiliyetlerin bir k\u0131sm\u0131n\u0131n da buradan geldi\u011fini s\u00f6ylemek haks\u0131zl\u0131k olmaz diye d\u00fc\u015f\u00fcn\u00fcyorum.<\/p>\n<h2><strong><span style=\"color: #0000ff;\">Ak\u0131ll\u0131 \u0130\u015faret\u00e7iler<\/span><\/strong><\/h2>\n<p>Ak\u0131ll\u0131 i\u015faret\u00e7iler temel olarak, i\u015faret\u00e7iler \u00fczerine \u00e7\u0131k\u0131lan ve ek olarak bu i\u015faret\u00e7ilerin ya\u015fam d\u00f6ng\u00fcleri kontrol etmek ad\u0131na basit\u00e7e &#8220;reference counting&#8221; benzeri yap\u0131lar\u0131 uygulayan s\u0131n\u0131flard\u0131r. Yani ilgili nesneleri olu\u015fturup daha sonra bunlar\u0131n gerekli oldu\u011fu zaman silinmesi kontrol\u00fcn\u00fc \u00fczerine alan &#8220;template&#8221; s\u0131n\u0131flard\u0131r.<br \/>\nTemel olarak normal i\u015faret\u00e7iler ile yapabildi\u011finiz her \u015feyi ak\u0131ll\u0131 i\u015faret\u00e7iler ile de yapabilirsiniz, \u00fcst\u00fcne daha kontroll\u00fc ve g\u00fcvenli bir i\u015faret\u00e7i kullan\u0131m\u0131na sahip oluyorsunuz.<br \/>\nKodta normal i\u015faret\u00e7ileri kulland\u0131\u011f\u0131n\u0131z her yerde ak\u0131ll\u0131 i\u015faret\u00e7ileri kullanabilirsiniz.<\/p>\n<p>C++ 11 ile \u00fc\u00e7 temel ak\u0131ll\u0131 i\u015faret\u00e7i gelmektedir. Bunlar std::shared_ptr, std::unique_ptr ve std::weak_ptr&#8217;d\u0131r. std::auto_ptr da var lakin kendisi C++11 ile &#8220;deprecated&#8221; olarak i\u015faretlenmi\u015f,<br \/>\nyani kullan\u0131lmamas\u0131 \u00f6nerilmi\u015f ve C++ 17 ile de tamamen kald\u0131r\u0131lm\u0131\u015ft\u0131r. std::auto_ptr ile yap\u0131labilecek her \u015fey std::unique_ptr ile yap\u0131labilmektedir.<\/p>\n<p>Bunlar\u0131 kodunuzda kullanmak i\u00e7in `#include &lt;memory&gt;` ba\u015fl\u0131\u011f\u0131n\u0131 eklemeniz gerekmektedir.<br \/>\nBu s\u0131n\u0131flar\u0131 olu\u015fturmak i\u00e7in a\u015fa\u011f\u0131daki y\u00f6ntemi izleyebilirsiniz.<\/p>\n<pre class=\"lang:c++ decode:true \">shared_ptr&lt;Elma&gt; sharedPtrExample (new Elma);\r\nunique_ptr&lt;Elma&gt; uniquePtrExample (new Elma);<\/pre>\n<p>E ama ben a\u015fa\u011f\u0131daki gibi de olu\u015fturabilirim diye d\u00fc\u015f\u00fcn\u00fcyordum.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true\">auto sharedPtrExample = make_shared&lt;Elma&gt;();\r\nauto uniquePtrExample = make_unique&lt;Elma&gt;();<\/pre>\n<p>Evet olu\u015fturabilirsin ama bu yap\u0131lar C++ 14 ile geldi sevgili dostum. Bu arada e\u011fer derleyiciniz destekliyor ise ikinci y\u00f6ntem her zaman daha temiz ve tavsiye edilmektedir.<br \/>\nHa karde\u015fim benim kodum C++ 11 i\u00e7in de \u00e7al\u0131\u015fs\u0131n hemi de <em>make_shared<\/em> yapaca\u011f\u0131m diyorsan a\u015fa\u011f\u0131daki kodu al kullan. Buradaki &#8220;&#8230;&#8221; da C++ 11 ile gelen ba\u015fka bir mevzu (<em><strong>variadic templates<\/strong><\/em>).<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true\">template&lt;typename T, typename... Ts&gt;\r\nstd::shared_ptr&lt;T&gt; make_shared(Ts&amp;&amp;... params)\r\n{\r\n     return std::shared_ptr&lt;T&gt;(new T(std::forward&lt;Ts&gt;(params)...));\r\n}\r\n\r\ntemplate&lt;typename T, typename... Ts&gt;\r\nstd::unique_ptr&lt;T&gt; make_unique(Ts&amp;&amp;... params)\r\n{\r\n     return std::unique_ptr&lt;T&gt;(new T(std::forward&lt;Ts&gt;(params)...));\r\n}<\/pre>\n<p>Bu s\u0131n\u0131flar\u0131n detaylar\u0131na ge\u00e7meden \u00f6nce birer c\u00fcmle ile bu s\u0131n\u0131flar\u0131 \u00f6zetlemeye \u00e7al\u0131\u015fal\u0131m.<br \/>\n&#8211; Ba\u015fka s\u0131n\u0131flar ile payla\u015f\u0131lmas\u0131 planlanmayan ayn\u0131 anda tek bir sahibi olacak s\u0131n\u0131flar i\u00e7in kullan\u0131labilir (<strong>exclusive-ownership resource management<\/strong>)<br \/>\n&#8211; Ba\u015fka s\u0131n\u0131flar ile payla\u015f\u0131lmas\u0131 planlanan ayn\u0131 anda birden fazla sahibi olarak s\u0131n\u0131flar i\u00e7in kullan\u0131labilir (<strong>shared-ownership resource management<\/strong>)<br \/>\n&#8211; <em>std::shared_ptr<\/em> ile olu\u015fturulmu\u015f olan s\u0131n\u0131flar\u0131n durumunu sorgulamak (bir nebze g\u00f6zlemci olarak d\u00fc\u015f\u00fcn\u00fclebilir) i\u00e7in kullan\u0131labilecek ve pek te ak\u0131ll\u0131 olmayan s\u0131n\u0131f \ud83d\ude42<\/p>\n<h2><strong><span style=\"color: #0000ff;\">std::unique_ptr<\/span><\/strong><\/h2>\n<p>Yukar\u0131da da bahsetti\u011fimiz \u00fczere unique_ptr&#8217;\u0131 ba\u015fka s\u0131n\u0131flar ile payla\u015fmay\u0131 d\u00fc\u015f\u00fcnmedi\u011finiz ve dinamik olarak olu\u015fturaca\u011f\u0131n\u0131z s\u0131n\u0131flar i\u00e7in kullanabilirsiniz. Tan\u0131mland\u0131\u011f\u0131<br \/>\nkapsam d\u0131\u015f\u0131na \u00e7\u0131kt\u0131\u011f\u0131 anda i\u015faret etti\u011fi nesne otomatik olarak silinecektir. K\u0131sacas\u0131 normal i\u015faret\u00e7ileri kulland\u0131\u011f\u0131n\u0131z \u00e7o\u011fu yerde unique_ptr&#8217;\u0131 g\u00f6n\u00fcl rahatl\u0131\u011f\u0131 ile kullanabilirsiniz.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true\">void Foo()\r\n{\r\n     \/\/ instance olu\u015fturulan DynamicObjectType nesnesinin tek sahibi\r\n     std::unique_ptr&lt;DynamicObjectType&gt; instance(new DynamicObjectType);\r\n\r\n     \/\/ Bir \u015feyler yap\r\n     instance-&gt;DoSomething();\r\n} \/\/ instance tan\u0131mland\u0131\u011f\u0131 fonksiyon kapsam\u0131ndan \u00e7\u0131kt\u0131\u011f\u0131 i\u00e7in yok edilir o da otomatik olarak DynamicObjectType nesnesini siler<\/pre>\n<p><strong>Peki neden unique_ptr?<\/strong><\/p>\n<p>\u00d6ncelikle <em>unique_ptr<\/em> alt\u0131nda yatan mekanizma olduk\u00e7a basit ve overhead\/ekstra i\u015f y\u00fck\u00fc \u00e7ok az ve performans anlam\u0131nda normal i\u015faret\u00e7ilere ile ayn\u0131 seviyede.<br \/>\nPeki neden? \u00c7\u00fcnk\u00fc shared_ptr da oldu\u011fu gibi payla\u015f\u0131lan nesnelerin y\u00f6netilmesi i\u00e7in gerekli olan dinamik yer almalara veya y\u00f6netim i\u015flerine ihtiya\u00e7 yok. Ya bir nesneyi i\u015faret<br \/>\nediyor ya da etmiyor bu kadar. Boyut anlam\u0131nda da normal i\u015faret\u00e7ilere ek bir \u015fey tutulmuyor \ud83d\ude42 K\u0131sacas\u0131 performansm\u0131\u015f yok fazla yer kaplarm\u0131\u015f gibi kayg\u0131lar yersiz.<\/p>\n<p><em>unique_ptr<\/em>&#8216;lar\u0131 kopyalayamazs\u0131n\u0131z! Tek sahip diyorum, payla\u015fmak yok diyorum. Fakat sahipli\u011fi transfer edebilirsiniz. Hobaaa! Transfer etmek ne demek \u015fimdi \ud83d\ude42 Bu konuya detayl\u0131 olarak<br \/>\nba\u015fka bir yaz\u0131mda girece\u011fim \u015fimdilik a\u015fa\u011f\u0131daki \u00f6rnek ile olay\u0131 \u00e7ok \u00e7ok \u00f6zet bir \u015fekilde anlatay\u0131m.<\/p>\n<pre class=\"lang:c++ decode:true\">void TakeOwnership(std::unique_ptr&lt;int&gt; obj)\r\n{\r\n....\r\n}\r\n\r\n\/\/ HATA: int'ten std::unique_ptr&lt;int&gt;'e d\u00f6n\u00fc\u015f\u00fcm yapamazs\u0131n\r\nTakeOwnership(3);\r\n\r\nint* p = new int(3);\r\n\r\n\/\/ HATA: int*'ten 'std::unique_ptr&lt;int&gt;'e d\u00f6n\u00fc\u015f\u00fcm yapamazs\u0131n. Explicit constructor\r\nTakeOwnership(p);\r\n\r\n\/\/ 3 un tek sahibi u\r\nauto u = std::make_unique&lt;int&gt;(3);\r\n\r\n\/\/ Kopyalama yasak\r\nTakeOwnership(u); \r\n\r\n<strong>\/\/ Ahanda i\u015fte transfer etme olay\u0131 bu<\/strong>\r\nTakeOwnership(std::move(u));\r\n\r\n\/\/ Yeni bir sahiplik olu\u015fturup verme bu da tamam\r\nTakeOwnership(std::make_unique&lt;int&gt;(3));\r\n\r\n\/\/ Bu da OK\r\nTakeOwnership(nullptr);<\/pre>\n<p>Normal \u015fartlar alt\u0131nda unique_ptr sahip oldu\u011fu dinamik nesneyi ilgili kapsam d\u0131\u015f\u0131na \u00e7\u0131k\u0131nca yok eder. Bunu el ile yapmak i\u00e7in:<\/p>\n<pre class=\"lang:c++ decode:true\">std::unique_ptr&lt;Elma&gt; obj(new Elma);\r\n\r\n\/\/ Art\u0131k obj bo\u015f ve obj'nin sahip oldu\u011fu nesneye rawObj \u00fczerinden eri\u015filebilir. Sahiplik rawObj'de.\r\nElma* rawObj = obj.release();<\/pre>\n<p>Ayr\u0131ca sahipli\u011fi devretmek i\u00e7in relese() apisi kullan\u0131labilir. Bu metot \u00e7a\u011fr\u0131ld\u0131ktan sonra standart i\u015faret\u00e7i olarak d\u00f6n\u00fclen nesnenin ya\u015fam d\u00f6ng\u00fcs\u00fcnden art\u0131k unique_ptr sorumlu de\u011fildir ve unique_ptr bu \u00e7a\u011fr\u0131dan sonra bo\u015f hale gelir.<\/p>\n<pre class=\"lang:c++ decode:true\">std::unique_ptr&lt;Elma&gt; obj(new Elma);\r\n\r\n\/\/ Art\u0131k obj bo\u015f ve obj'nin sahip oldu\u011fu nesneye rawObj \u00fczerinden eri\u015filebilir. Sahiplik rawObj'de.\r\nElma* rawObj = obj.release();<\/pre>\n<p>Velev ki unique_ptr olarak bir nesne olu\u015fturdunuz ve bunu payla\u015fmak istiyorsunuz ne yapacaks\u0131n\u0131z.<\/p>\n<pre class=\"lang:c++ decode:true \">std::unique_ptr&lt;Karpuz&gt; tekKisilikKarpuz(new Karpuz);\r\n\r\n\/\/ Sahipligi devrediyoruz\r\nstd::shared_ptr&lt;Karpuz&gt; paylasilanKarpuz = std::move(tekKisilikKarpuz);\r\n\r\n\/\/ Ya da asagidaki ile de sahipligi devredebilirsiniz\r\nstd::shared_ptr&lt;Karpuz&gt; paylasilanKarpuz(tekKisilikKarpuz.release());\r\n\r\n<\/pre>\n<p><em>unique_ptr<\/em>&#8216;\u0131 STL konteynerlarda da kullanabilirsiniz. Kullan\u0131m esnas\u0131nda a\u015fa\u011f\u0131daki hususlara dikkat etmenizde fayda var:<br \/>\n&#8211; Konteynerlar\u0131 rvalue olarak ya da std::move ile sahipli\u011fini tranfer ederek doldurun,<br \/>\n&#8211; Konteynerdan bir eleman sildi\u011finizde onun sahip oldu\u011fu nesnenin de silinece\u011fini unutmay\u0131n.<br \/>\nAyn\u0131 \u015fekilde clear API sinin \u00e7a\u011fr\u0131lmas\u0131 durumunda b\u00fct\u00fcn elemanlar silinecektir.<\/p>\n<pre class=\"lang:c++ decode:true \">std::vector&lt;unique_ptr&lt;MyClass&gt;&gt; v;\r\n\r\nv.push_back(unique_ptr&lt;MyClass&gt;(\"hello world-I\"));\r\nv.push_back(unique_ptr&lt;MyClass&gt;(\"hello world-II\"));\r\nv.push_back(unique_ptr&lt;MyClass&gt;(\"hello world-III\"));<\/pre>\n<p>Son olarak <em>unique_ptr<\/em>&#8216;\u0131 tek bir nesne i\u00e7in olu\u015fturabildi\u011finiz gibi dizi olarak ta olu\u015fturabilirsiniz. Muhtemelen <em>std::array, vector<\/em> ve benzeri yap\u0131lar fazlas\u0131yla i\u015finizi g\u00f6recek olsa da<br \/>\nbu tarz bir ihtiya\u00e7 has\u0131l olursa a\u015fa\u011f\u0131daki gibi bir kullan\u0131m\u0131 mevcut ve tabiki delete [] sizin el ile \u00e7a\u011f\u0131rman\u0131za gerek yok \ud83d\ude09<\/p>\n<pre class=\"lang:c++ decode:true \">std::unique_ptr&lt;int[]&gt; diziOrnek (new int[5]);\r\n\r\nfor (int i=0; i &lt; 5; ++i) \r\ndiziOrnek[i] = i;\r\n\r\nfor (int i=0; i&lt;5; ++i) \r\nstd::cout &lt;&lt; foo[i] &lt;&lt; ' ';<\/pre>\n<p>\u00d6zet olarak;<br \/>\n<em>std::unique_ptr<\/em> <strong>k\u00fc\u00e7\u00fck, h\u0131zl\u0131 ve sadece transfer edilebilen<\/strong> tek sahiplik yakla\u015f\u0131m\u0131na sahip ak\u0131ll\u0131 i\u015faret\u00e7isidir.<br \/>\nVarsay\u0131lan olarak kaynaklar delete operat\u00f6r\u00fc ile silinmektedir, fakat \u00f6zelle\u015fmi\u015f siliciler tan\u0131mlanabilir tabi bunlar unique_ptr nesnelerinin boyutlar\u0131n\u0131 artt\u0131raca\u011f\u0131n\u0131 unutmay\u0131n.<br \/>\nunique_ptr ile olu\u015fturulan kaynaklar\u0131n\u0131z\u0131 shared_ptr haline d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz.<\/p>\n<p>Yine bir di\u011fer C++ duayeni olan ve C++ alan\u0131nda olduk\u00e7a aktif olarak \u00e7al\u0131\u015fan Herb Sutter&#8217;in sitesindeki ak\u0131ll\u0131 i\u015faret\u00e7iler yaz\u0131lar\u0131na g\u00f6z atabilirsiniz (son iki referans). Oran\u0131n da bir \u00f6zetini ikinci yaz\u0131ma ekleyece\u011fim in\u015fallah.<\/p>\n<p>Bir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere kendinize iyi bak\u0131n sevgili yaz\u0131l\u0131mperver dostlar\u0131m&#8230;<\/p>\n<h2><strong><span style=\"color: #0000ff;\">Referanslar<\/span><\/strong><\/h2>\n<p><span style=\"color: #008000;\"><strong>&#8211; <a style=\"color: #008000;\" href=\"http:\/\/www.boost.org\/doc\/libs\/1_62_0\/libs\/smart_ptr\/shared_ptr.htm\">http:\/\/www.boost.org\/doc\/libs\/1_62_0\/libs\/smart_ptr\/shared_ptr.htm<\/a><\/strong><\/span><br \/>\n<span style=\"color: #008000;\"><strong>&#8211; <a style=\"color: #008000;\" href=\"http:\/\/www.drdobbs.com\/cpp\/c11-uniqueptr\/240002708\">http:\/\/www.drdobbs.com\/cpp\/c11-uniqueptr\/240002708<\/a><\/strong><\/span><br \/>\n<span style=\"color: #008000;\"><strong>&#8211; <a style=\"color: #008000;\" href=\"http:\/\/en.cppreference.com\/w\/cpp\/memory\/unique_ptr\">http:\/\/en.cppreference.com\/w\/cpp\/memory\/unique_ptr<\/a><\/strong><\/span><br \/>\n<span style=\"color: #008000;\"><strong>&#8211; <a style=\"color: #008000;\" href=\"https:\/\/herbsutter.com\/2013\/06\/05\/gotw-91-solution-smart-pointer-parameters\/\">https:\/\/herbsutter.com\/2013\/06\/05\/gotw-91-solution-smart-pointer-parameters\/<\/a><\/strong><\/span><br \/>\n<span style=\"color: #008000;\"><strong>&#8211; <a style=\"color: #008000;\" href=\"https:\/\/herbsutter.com\/2013\/05\/29\/gotw-89-solution-smart-pointers\/\">https:\/\/herbsutter.com\/2013\/05\/29\/gotw-89-solution-smart-pointers\/<\/a><\/strong><\/span><\/p>","protected":false},"excerpt":{"rendered":"<p>G\u00fcncelleme (auto_ptr vs unique_ptr): Tekrar merhaba arkada\u015flar, gelen bir iki yorum sonras\u0131nda bir konuyu a\u00e7\u0131kl\u0131\u011fa kavu\u015fturmakta fayda oldu\u011funu d\u00fc\u015f\u00fcnd\u00fcm. Bu da std::unique_ptr ile std::auto_ptr aras\u0131ndaki fark. Ger\u00e7i yaz\u0131mda, std::auto_ptr&#8217;\u0131n pek bir anlam\u0131 kalmad\u0131\u011f\u0131n\u0131, bu ama\u00e7la std::unique_ptr kullan\u0131labilece\u011fini ifade etmi\u015ftim ama merakl\u0131 arkada\u015flar i\u00e7in bir ka\u00e7 kelam etmekte bir sak\u0131nca yok. auto_ptr&#8217;\u0131n kopya yap\u0131c\u0131s\u0131 ve atama&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":2,"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":[73,13,47,46,76,42,75,72,74],"class_list":["post-266","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-modern-c","tag-akilli-isaretci","tag-c","tag-c-0x","tag-c-11","tag-make_shared","tag-modern-c","tag-shared_ptr","tag-smart-pointers","tag-unique_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-I - 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\/2021\/12\/30\/modern-c-4-smart-pointers\/\" \/>\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-I - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"G\u00fcncelleme (auto_ptr vs unique_ptr): Tekrar merhaba arkada\u015flar, gelen bir iki yorum sonras\u0131nda bir konuyu a\u00e7\u0131kl\u0131\u011fa kavu\u015fturmakta fayda oldu\u011funu d\u00fc\u015f\u00fcnd\u00fcm. Bu da std::unique_ptr ile std::auto_ptr aras\u0131ndaki fark. Ger\u00e7i yaz\u0131mda, std::auto_ptr&#8217;\u0131n pek bir anlam\u0131 kalmad\u0131\u011f\u0131n\u0131, bu ama\u00e7la std::unique_ptr kullan\u0131labilece\u011fini ifade etmi\u015ftim ama merakl\u0131 arkada\u015flar i\u00e7in bir ka\u00e7 kelam etmekte bir sak\u0131nca yok. auto_ptr&#8217;\u0131n kopya yap\u0131c\u0131s\u0131 ve atama... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2021-12-30T21:15:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-12-30T18:08:41+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=\"23 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\/2021\/12\/30\/modern-c-4-smart-pointers\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"Modern C++ (4) : Smart Pointers-I\",\"datePublished\":\"2021-12-30T21:15:21+00:00\",\"dateModified\":\"2021-12-30T18:08:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/\"},\"wordCount\":3599,\"commentCount\":11,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"ak\u0131ll\u0131 i\u015faret\u00e7i\",\"c++\",\"C++ 0x\",\"C++ 11\",\"make_shared\",\"Modern C++\",\"shared_ptr\",\"smart pointers\",\"unique_ptr\"],\"articleSection\":[\"C++\",\"Modern C++\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/\",\"name\":\"Modern C++ (4) : Smart Pointers-I - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2021-12-30T21:15:21+00:00\",\"dateModified\":\"2021-12-30T18:08:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Modern C++ (4) : Smart Pointers-I\"}]},{\"@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\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Modern C++ (4) : Smart Pointers-I - 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\/2021\/12\/30\/modern-c-4-smart-pointers\/","og_locale":"tr_TR","og_type":"article","og_title":"Modern C++ (4) : Smart Pointers-I - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"G\u00fcncelleme (auto_ptr vs unique_ptr): Tekrar merhaba arkada\u015flar, gelen bir iki yorum sonras\u0131nda bir konuyu a\u00e7\u0131kl\u0131\u011fa kavu\u015fturmakta fayda oldu\u011funu d\u00fc\u015f\u00fcnd\u00fcm. Bu da std::unique_ptr ile std::auto_ptr aras\u0131ndaki fark. Ger\u00e7i yaz\u0131mda, std::auto_ptr&#8217;\u0131n pek bir anlam\u0131 kalmad\u0131\u011f\u0131n\u0131, bu ama\u00e7la std::unique_ptr kullan\u0131labilece\u011fini ifade etmi\u015ftim ama merakl\u0131 arkada\u015flar i\u00e7in bir ka\u00e7 kelam etmekte bir sak\u0131nca yok. auto_ptr&#8217;\u0131n kopya yap\u0131c\u0131s\u0131 ve atama... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2021-12-30T21:15:21+00:00","article_modified_time":"2021-12-30T18:08:41+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":"23 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"Modern C++ (4) : Smart Pointers-I","datePublished":"2021-12-30T21:15:21+00:00","dateModified":"2021-12-30T18:08:41+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/"},"wordCount":3599,"commentCount":11,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["ak\u0131ll\u0131 i\u015faret\u00e7i","c++","C++ 0x","C++ 11","make_shared","Modern C++","shared_ptr","smart pointers","unique_ptr"],"articleSection":["C++","Modern C++"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/","name":"Modern C++ (4) : Smart Pointers-I - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2021-12-30T21:15:21+00:00","dateModified":"2021-12-30T18:08:41+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/12\/30\/modern-c-4-smart-pointers\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Modern C++ (4) : Smart Pointers-I"}]},{"@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\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/266","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\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=266"}],"version-history":[{"count":16,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/266\/revisions"}],"predecessor-version":[{"id":2423,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/266\/revisions\/2423"}],"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=266"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=266"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=266"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}