<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[smart_pointer Handhabung]]></title><description><![CDATA[<p>Auf Grund folgendem Zitats aus dem Thread <a href="http://www.c-plusplus.net/forum/319812" rel="nofollow">http://www.c-plusplus.net/forum/319812</a>, würde ich da gerne ein wenig drüber diskutieren.</p>
<p>sharry schrieb:</p>
<blockquote>
<p>Und was soll</p>
<pre><code class="language-cpp">void Test2(SharedPtr&lt;Base&gt; test)
</code></pre>
<p>sein?</p>
<p>ÜBERGEBE NIE SMARTPOINTER ALS ARGUMENT (wenn du nicht weisst, was du tust)!</p>
<p>Das sollte</p>
<pre><code class="language-cpp">void Test2(Base const&amp; test)
</code></pre>
<p>sein und dann ist dein Problem gelöst.</p>
</blockquote>
<p>Handhabt ihr das alle so, das ihr nur Referenzen auf das Object übergebt und keine Referenzen auf den SmartPointer an sich?<br />
Wenn ja, aus welchem Grund? Das man einen Unique_ptr nicht ohne weiteres übergeben kann, ist mir bewusst, aber eine (const) Referenz darauf ist möglich. Und so handhabe ich das eigentlich auch.</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/319819/smart_pointer-handhabung</link><generator>RSS for Node</generator><lastBuildDate>Fri, 24 Jul 2026 20:59:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/319819.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 04 Sep 2013 13:53:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to smart_pointer Handhabung on Wed, 04 Sep 2013 13:53:57 GMT]]></title><description><![CDATA[<p>Auf Grund folgendem Zitats aus dem Thread <a href="http://www.c-plusplus.net/forum/319812" rel="nofollow">http://www.c-plusplus.net/forum/319812</a>, würde ich da gerne ein wenig drüber diskutieren.</p>
<p>sharry schrieb:</p>
<blockquote>
<p>Und was soll</p>
<pre><code class="language-cpp">void Test2(SharedPtr&lt;Base&gt; test)
</code></pre>
<p>sein?</p>
<p>ÜBERGEBE NIE SMARTPOINTER ALS ARGUMENT (wenn du nicht weisst, was du tust)!</p>
<p>Das sollte</p>
<pre><code class="language-cpp">void Test2(Base const&amp; test)
</code></pre>
<p>sein und dann ist dein Problem gelöst.</p>
</blockquote>
<p>Handhabt ihr das alle so, das ihr nur Referenzen auf das Object übergebt und keine Referenzen auf den SmartPointer an sich?<br />
Wenn ja, aus welchem Grund? Das man einen Unique_ptr nicht ohne weiteres übergeben kann, ist mir bewusst, aber eine (const) Referenz darauf ist möglich. Und so handhabe ich das eigentlich auch.</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350268</guid><dc:creator><![CDATA[DNKpp]]></dc:creator><pubDate>Wed, 04 Sep 2013 13:53:57 GMT</pubDate></item><item><title><![CDATA[Reply to smart_pointer Handhabung on Wed, 04 Sep 2013 13:57:14 GMT]]></title><description><![CDATA[<p>Das ist Bloedsinn. Wenn Besitz uebergeben werden soll, dann Smartpointer per const ref im Falle von Reference Counting, bei unique_ptr per Value. Wenn nicht, dann per (const) ref.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350269</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Wed, 04 Sep 2013 13:57:14 GMT</pubDate></item><item><title><![CDATA[Reply to smart_pointer Handhabung on Wed, 04 Sep 2013 13:56:30 GMT]]></title><description><![CDATA[<p>Warum sollte der Smart-Pointer Teil der Schnittstelle sein, wenn man mit ihm nix weiter anfangen will?<br />
Entweder man will Ownership ausweiten (oder das zumindest zulassen), es abtreten, oder der Smart-Pointer hat in der Signatur nix zu suchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350270</guid><dc:creator><![CDATA[Häh?]]></dc:creator><pubDate>Wed, 04 Sep 2013 13:56:30 GMT</pubDate></item><item><title><![CDATA[Reply to smart_pointer Handhabung on Wed, 04 Sep 2013 14:06:37 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>bei unique_ptr per Value. Wenn nicht, dann per (const) ref.</p>
</blockquote>
<p>Einen unique_ptr per Value übergeben? Wie geht das denn? Kopieren geht doch nicht... oO<br />
Oder meinst du moven?!<br />
Und statt const&amp; kann man auch gleich ne normale Referenz auf das Objekt nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350275</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Wed, 04 Sep 2013 14:06:37 GMT</pubDate></item><item><title><![CDATA[Reply to smart_pointer Handhabung on Wed, 04 Sep 2013 14:13:19 GMT]]></title><description><![CDATA[<p>Das geht genau so, wenn man unique_ptr per Wert nimmt, dann klappt das nur mit einer R-Value als Argument, aus der auf jedem Fall heraus-gemoved wird und daher zeigt dieser Art der Übergabe dem Benutzer unmissverständlich, dass hier ein Ownership-Transfer stattfindet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350278</guid><dc:creator><![CDATA[Blubb]]></dc:creator><pubDate>Wed, 04 Sep 2013 14:13:19 GMT</pubDate></item><item><title><![CDATA[Reply to smart_pointer Handhabung on Wed, 04 Sep 2013 14:25:40 GMT]]></title><description><![CDATA[<p>Die Aussage ist, dass wenn es möglich ist die Funktion mit einer const-Referenz auf das Objekt zu implementieren, das dann auch der beste Weg ist.</p>
<p>Nur in seltenen Fällen braucht man <code>shared_ptr&lt;Object&gt; const&amp;</code> oder <code>unique_ptr&lt;Object&gt;</code> (ja, das geht). In ganz seltenen Fällen, wenn man den Smartpointer ändern will, braucht man <code>shared_ptr&lt;Object&gt;&amp;</code> oder <code>unique_ptr&lt;Object&gt;&amp;</code> .</p>
<p><code>unique_ptr&lt;Objekt&gt; const&amp;</code> hingegen macht kein Sinn. Hat keinerlei Vorteile gegenüber <code>Object*</code> / <code>Object const*</code> / <code>Object&amp;</code> / <code>Object const&amp;</code> , nur Nachteile.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350282</guid><dc:creator><![CDATA[sharry]]></dc:creator><pubDate>Wed, 04 Sep 2013 14:25:40 GMT</pubDate></item><item><title><![CDATA[Reply to smart_pointer Handhabung on Wed, 04 Sep 2013 15:56:49 GMT]]></title><description><![CDATA[<p>sharry schrieb:</p>
<blockquote>
<p>Die Aussage ist, dass wenn es möglich ist die Funktion mit einer const-Referenz auf das Objekt zu implementieren, das dann auch der beste Weg ist.</p>
</blockquote>
<p>Und das ist einfach falsch.<br />
Es sind verschiedene Dinge: Entweder ich uebergebe Besitz, oder eben nicht. Je nachdem entscheidet man.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350312</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Wed, 04 Sep 2013 15:56:49 GMT</pubDate></item><item><title><![CDATA[Reply to smart_pointer Handhabung on Wed, 04 Sep 2013 16:35:28 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>sharry schrieb:</p>
<blockquote>
<p>Die Aussage ist, dass wenn es möglich ist die Funktion mit einer const-Referenz auf das Objekt zu implementieren, das dann auch der beste Weg ist.</p>
</blockquote>
<p>Und das ist einfach falsch.<br />
Es sind verschiedene Dinge: Entweder ich uebergebe Besitz, oder eben nicht. Je nachdem entscheidet man.</p>
</blockquote>
<p>Stimmt so doch.</p>
<p>Ist es möglich übergebenden Besitz mit einer const-Referenz zu implementieren? Nein. Also Referenz auf Smartpointer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350326</guid><dc:creator><![CDATA[sharry]]></dc:creator><pubDate>Wed, 04 Sep 2013 16:35:28 GMT</pubDate></item><item><title><![CDATA[Reply to smart_pointer Handhabung on Wed, 04 Sep 2013 18:07:35 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Einen unique_ptr per Value übergeben? Wie geht das denn? Kopieren geht doch nicht... oO</p>
</blockquote>
<p>Das hier funzt by design:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;memory&gt;

using std::unique_ptr;

unique_ptr&lt;int&gt; source()
{
   unique_ptr&lt;int&gt; p (new int(42));
   return p;
}

void sink(unique_ptr&lt;int&gt; p)
{
   std::cout &lt;&lt; &quot;*p is &quot; &lt;&lt; *p &lt;&lt; '\n';
}

int main()
{
  sink(source());
}
</code></pre>
<p>und das ist gut so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350356</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 04 Sep 2013 18:07:35 GMT</pubDate></item><item><title><![CDATA[Reply to smart_pointer Handhabung on Thu, 05 Sep 2013 05:47:13 GMT]]></title><description><![CDATA[<p>Ok, danke für die Nachhilfe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350404</guid><dc:creator><![CDATA[DNKpp]]></dc:creator><pubDate>Thu, 05 Sep 2013 05:47:13 GMT</pubDate></item><item><title><![CDATA[Reply to smart_pointer Handhabung on Thu, 05 Sep 2013 09:12:01 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Wenn Besitz uebergeben werden soll, dann Smartpointer per const ref im Falle von Reference Counting, bei unique_ptr per Value. Wenn nicht, dann per (const) ref.</p>
</blockquote>
<p>wobei seit move semantics ich auch einen shared_ptr per value übergeben würde. Wenn also der &quot;Besitz&quot; übergeben wird und die Funktion den shared_ptr irgendwo anders speichern will, dann hast du bei folgenden Möglichkeiten</p>
<ul>
<li>ref-auf-const</li>
<li>ref-auf-const und rvalue-ref überladen</li>
<li>pass by value</li>
</ul>
<p>beim letzten Punkt keine unnötigen Kopien (die Funktion kann den shared_ptr dahin moven, wo sie ihn haben will) und das ohne dass man die funktion überladen muss. Das Moven eines shared_ptrs ist, denke ich mal, vernachlässigbar. Jedenfalls muss da der Referenzzähler nicht angefasst werden.</p>
<p>Statt einer Referenz in anderen Fällen finde ich u.U. einen Zeiger auch sinnvoll. Was ich da nehme hängt u.a. davon ab, ob ich möchte, dass man beim Aufruf der Funktion sehen kann, dass ein Objekt nicht per Wert übergeben wird. Das ist ja im Falle von Referenzen nicht so offensichtlich, wenn man die Deklaration der Funktion nicht vor Augen hat. Und das möchte ich typischerweise dann, wenn die Funktion die Adresse des Objekts für länger irgendwo speichert -- nicht &quot;besitzend&quot; sondern nur &quot;kennend&quot;; denn ich erwarte i.A. nicht, dass eine Funktion, die eine Referenz entgegen nimmt, die Adresse des Objekts irgendwo speichert. Offensichtliche Ausnahme ist std::ref und std::cref, wobei das da allerdings klar sein dürfte, was sie macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350441</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 05 Sep 2013 09:12:01 GMT</pubDate></item><item><title><![CDATA[Reply to smart_pointer Handhabung on Thu, 05 Sep 2013 09:19:57 GMT]]></title><description><![CDATA[<p>Warum moven, wenn mans fuer lau bekommen kann? Sinnlos.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350445</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Thu, 05 Sep 2013 09:19:57 GMT</pubDate></item><item><title><![CDATA[Reply to smart_pointer Handhabung on Thu, 05 Sep 2013 09:40:41 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Warum moven, wenn mans fuer lau bekommen kann? Sinnlos.</p>
</blockquote>
<p>Du scheinst da nur an einen bestimmten Fall zu denken, nämlich den, in dem das Funktionsargument ein Lvalue ist. In dem Fall hätte man bei pass-by-value ein zusätzliches Move. Ein Move ist allerdings billig. Wenn das Argument ein Rvalue ist, hast du in deinem ref-auf-const Fall eine unnötige Kopie. Eine Kopie ist teuerer. Möchtest du, dass ich dazu ein Beispiel schreibe und erkläre in welcher Situation was wo kopiert und gemoved wird, oder glaubst du mir das jetzt auch so? Vielleicht denkst du ja selbst nochmal ein bisschen drüber nach. Die Fälle, die unterschieden werden sollten, sind:</p>
<ul>
<li>Argument ist ein Lvalue</li>
<li>Argument ist ein Rvalue, Compiler führte copy-elision durch</li>
<li>Argument ist ein Rvalue, Compiler hat die copy-elision nicht hinbekommen</li>
</ul>
<p>Die optimale Lösung im Sinne der Reduzierung von unnötigen Kopien und Moves bekommst du nur mit der Überladung ref-auf-const und rvalue-ref. Allerdings spare ich mir gerne die Überladung und nehme ein ggf. unnötiges Move bei pass-by-value in Kauf. Klar soweit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350450</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 05 Sep 2013 09:40:41 GMT</pubDate></item></channel></rss>