<?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[shared_ptr als Parameter]]></title><description><![CDATA[<p>Abend,</p>
<p>wenn ich eine Klasse Foo mit einem shared_ptr habe:</p>
<pre><code class="language-cpp">class Foo {
  shared_ptr&lt;Bar&gt;  mBar;

  Foo(shared_ptr&lt;Bar&gt; bar) : mBar(bar) { }  // A
  Foo(const shared_ptr&lt;Bar&gt;&amp; bar) : mBar(bar) { }  // B
};
</code></pre>
<p>und diesen im Ctor übergeben will: Macht man das dann am besten by value (Im Code wie bei A) oder per Reference (wie bei B)?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/296431/shared_ptr-als-parameter</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 21:50:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/296431.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 04 Dec 2011 19:13:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to shared_ptr als Parameter on Sun, 04 Dec 2011 19:13:51 GMT]]></title><description><![CDATA[<p>Abend,</p>
<p>wenn ich eine Klasse Foo mit einem shared_ptr habe:</p>
<pre><code class="language-cpp">class Foo {
  shared_ptr&lt;Bar&gt;  mBar;

  Foo(shared_ptr&lt;Bar&gt; bar) : mBar(bar) { }  // A
  Foo(const shared_ptr&lt;Bar&gt;&amp; bar) : mBar(bar) { }  // B
};
</code></pre>
<p>und diesen im Ctor übergeben will: Macht man das dann am besten by value (Im Code wie bei A) oder per Reference (wie bei B)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2152983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2152983</guid><dc:creator><![CDATA[paraUhu]]></dc:creator><pubDate>Sun, 04 Dec 2011 19:13:51 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr als Parameter on Sun, 04 Dec 2011 19:20:14 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Foo(shared_ptr&lt;Bar&gt;(new Bar)); // Funktioniert nur mit Konstruktor A
</code></pre>
<p>Mit C++11 erledigt sich das Problem übrigens wie selbst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2152987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2152987</guid><dc:creator><![CDATA[perreff]]></dc:creator><pubDate>Sun, 04 Dec 2011 19:20:14 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr als Parameter on Sun, 04 Dec 2011 19:21:35 GMT]]></title><description><![CDATA[<p>Ist B nicht besser, weil effizienter?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2152988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2152988</guid><dc:creator><![CDATA[Frage2]]></dc:creator><pubDate>Sun, 04 Dec 2011 19:21:35 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr als Parameter on Sun, 04 Dec 2011 19:37:29 GMT]]></title><description><![CDATA[<p>Bist du dir sicher, dass du shared_ptr und keinen unique_ptr willst? Dann würde ich spontan mal B empfehlen, einfach weil das Beispiel mit new ja wenig Sinn macht, denn dann gibt es ja nichts zu sharen. Falls du das (warum auch immer) trotzdem brauchen solltest, hau wenigstens ein std::move über Lösung A.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2152999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2152999</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 04 Dec 2011 19:37:29 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr als Parameter on Sun, 04 Dec 2011 19:42:36 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Bist du dir sicher, dass du shared_ptr und keinen unique_ptr willst? Dann würde ich spontan mal B empfehlen, einfach weil das Beispiel mit new ja wenig Sinn macht, denn dann gibt es ja nichts zu sharen. Falls du das (warum auch immer) trotzdem brauchen solltest, hau wenigstens ein std::move über Lösung A.</p>
</blockquote>
<p>Wo ist denn in meinem Beispiel ein new? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
std::move sagt mir nichts und unique_ptr auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153002</guid><dc:creator><![CDATA[paraUhu]]></dc:creator><pubDate>Sun, 04 Dec 2011 19:42:36 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr als Parameter on Sun, 04 Dec 2011 19:42:48 GMT]]></title><description><![CDATA[<p>Hmm, ich habe einen Fehler gemacht. Der Beispielcode gilt auch für Konstruktor B.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153003</guid><dc:creator><![CDATA[perreff]]></dc:creator><pubDate>Sun, 04 Dec 2011 19:42:48 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr als Parameter on Sun, 04 Dec 2011 19:43:49 GMT]]></title><description><![CDATA[<p>Und dann ist B eindeutig besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153005</guid><dc:creator><![CDATA[perreff]]></dc:creator><pubDate>Sun, 04 Dec 2011 19:43:49 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr als Parameter on Sun, 04 Dec 2011 19:45:25 GMT]]></title><description><![CDATA[<p>perreff schrieb:</p>
<blockquote>
<p>Hmm, ich habe einen Fehler gemacht. Der Beispielcode gilt auch für Konstruktor B.</p>
</blockquote>
<p>Haha, das wollte ich auch gerade erwähnen, da war doch was mit const. Ja, B ist besser. Und ich denke immer noch, dass der TE einen unique_ptr will. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153008</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 04 Dec 2011 19:45:25 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr als Parameter on Sun, 04 Dec 2011 19:54:49 GMT]]></title><description><![CDATA[<p>Was ist der Unterschied zwischen shared und unique pointer?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153015</guid><dc:creator><![CDATA[paraUhu]]></dc:creator><pubDate>Sun, 04 Dec 2011 19:54:49 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr als Parameter on Sun, 04 Dec 2011 20:04:07 GMT]]></title><description><![CDATA[<p>paraUhu schrieb:</p>
<blockquote>
<p>Was ist der Unterschied zwischen shared und unique pointer?</p>
</blockquote>
<p>Aha! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Der shared_ptr teilt (wie der Name schon sagt) den Besitz an dem Objekt auf das er zeigt. Ein unique_ptr ist immer alleiniger Besitzer seines Objekts.<br />
Mal an einem Beispiel deutlich:</p>
<pre><code class="language-cpp">// Bei main anfangen zu lesen und dem Programmlauf folgen

void foo(std::shared_ptr&lt;MyClass&gt; my_class)
{  // Jetzt wurde der Pointer kopiert, es gibt zwei shared_ptr die auf das gleiche Objekt zeigen. shared_ptr zählt weiter mit.
  my_class-&gt;someFancyFunction();
} // Wieder nur ein shared_ptr

int main()
{
  std::shared_ptr&lt;MyClass&gt; ptr = std::make_shared&lt;MyClass&gt;(&quot;Parameter&quot;);
  // Hier gibt es nur eine Referenz auf das Objekt, shared_ptr zählt mit.
  foo(my_class);
} // Keine Referenz mehr, Objekt wird zerstört.
</code></pre>
<p>Das Ganze kann schon nett sein, aber man braucht es halt eher selten. Wenn man einfach nur kein delete möchte, nutzt man unique_ptr.</p>
<pre><code class="language-cpp">int main()
{
  std::unique_ptr&lt;MyClass&gt; ptr(new MyClass(&quot;Parameter&quot;)); // make_unique gibt es leider nicht. Aber make_shared ruft auch nur new auf.
  // Irgendwas machen
} // Objekt wird automatisch gelöscht
</code></pre>
<p>Ein unique_ptr kann aber nicht kopiert werden (logischerweise), du kannst ihn nur mit std::move übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153021</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 04 Dec 2011 20:04:07 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr als Parameter on Sun, 04 Dec 2011 20:09:56 GMT]]></title><description><![CDATA[<p>Achso. Ich kannte den unter dem Namen auto_ptr.</p>
<p>Nene, shared_ptr ist schon der richtige smart pointer für mich:)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153025</guid><dc:creator><![CDATA[paraUhu]]></dc:creator><pubDate>Sun, 04 Dec 2011 20:09:56 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr als Parameter on Sun, 04 Dec 2011 21:01:24 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Aber make_shared ruft auch nur new auf.</p>
</blockquote>
<p>Nein! Bei make_shared liegen sowhl das Objekt, als auch der shared und der weak-count am Stück im Speicher! Bei make_unique gäbe es so einen Vorteil nicht, daher wollten sie das nicht in den Standard aufnehmen. make_unique könnte man aber einfach selbst implementieren, z.B. so:</p>
<pre><code class="language-cpp">template &lt;typename T, typename... Args&gt;
std::unique_ptr&lt;T&gt; make_unique(Args&amp;&amp;... args)
{
    return std::unique_ptr&lt;T&gt;(new T(std::forward&lt;Args&gt;(args)...));
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2153050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153050</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sun, 04 Dec 2011 21:01:24 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr als Parameter on Mon, 05 Dec 2011 10:04:59 GMT]]></title><description><![CDATA[<p>paraUhu schrieb:</p>
<blockquote>
<p>Macht man das dann am besten by value (Im Code wie bei A) oder per Reference (wie bei B)?</p>
</blockquote>
<p>Wenn Du den shared_ptr nicht sowieso kopieren musst, würde ich es per ref-to-const (also wie in <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="B)"
      alt="😎"
    /> an die Funktion übergeben; denn dann spart man sich die Modifikation des Referenzzählers und da diese threadsicher passieren muss, kostet das natürlich. Aber in Deinem Beispiel willst Du ja eine Kopie im Objekt speichern. Dann könnte man auch folgendes schreiben:</p>
<pre><code>class Foo {
  shared_ptr&lt;Bar&gt; barptr_;
public:
  Foo(shared_ptr&lt;Bar&gt; bar)
  : barptr_([b]std::move([/b]bar[b])[/b])
  {}
};
</code></pre>
<p>Das würde ich in diesem Fall sogar vorziehen. Das Kopieren überlässt man hier dem Compiler, der das eventuell wegoptimieren kann. Die Move-Konstruktion eines shared_ptr ist sehr effizient, erfordert also keine Modifikationen des Referenzzählers.</p>
<p>Und ja, <code>make_shared</code> hat nicht nur den Vorteil, dass</p>
<pre><code class="language-cpp">auto sp = make_shared&lt;MyClassType&gt;(3.14159265);
</code></pre>
<p>kürzer ist als</p>
<pre><code class="language-cpp">shared_ptr&lt;MyClassType&gt; sp ( new MyClassType(3.14159265) );
</code></pre>
<p>sondern auch den, dass <code>make_shared</code> die Gelegenheit hat, das Objekt und die Kontrollstruktur (Referenzzähler, Deleter, etc) in einem Block auf einen Schlag zu allozieren.</p>
<p>Obwohl ein unique_ptr keine solche dynamisch zu allozierende Kontrollstruktor benötigt, ist IMHO make_unique trotzdem sinnvoll, da man damit erreichen kann, dass das unque_ptr Objekt sofort mit einem Zeiger initialisiert wird (Sequenzpunkte des Funktionsaufrufs); denn so etwas</p>
<pre><code class="language-cpp">some_funktion( unique_ptr&lt;Foo&gt;(new Foo(123)), unique_ptr&lt;Bar&gt;(new Bar(321)) );
</code></pre>
<p>ist nicht Ausnahme-sicher. Die Reihenfolge der Auswertung ist nicht festgelegt und so kann es passieren, dass das zweite Objekt erzeugt wird bevor das erste dem unique_ptr übergeben wurde. Man hätte im Falle einer Ausnahme ein Speicherleck. Ohne make_unique müssten wir vorher die Zeiger einzeln anlegen:</p>
<pre><code class="language-cpp">unique_ptr&lt;Foo&gt; pfoo (new Foo(123));
unique_ptr&lt;Bar&gt; pbar (new Bar(321));
some_funktion( std::move(pfoo), st::move(pbar) );
</code></pre>
<p>Cheers!<br />
k.k.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153173</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 05 Dec 2011 10:04:59 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr als Parameter on Mon, 05 Dec 2011 10:09:08 GMT]]></title><description><![CDATA[<p>Genau zu dem Thema Ausnahmesicherheit, das krümelkacker angesprochen hat, gibts übrigens einen neuen GOTW-Blogeintrag:<br />
<a href="http://herbsutter.com/2011/12/02/gotw-102-exception-safe-function-calls-difficulty-710/" rel="nofollow">http://herbsutter.com/2011/12/02/gotw-102-exception-safe-function-calls-difficulty-710/</a> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153191</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 05 Dec 2011 10:09:08 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr als Parameter on Mon, 05 Dec 2011 10:45:27 GMT]]></title><description><![CDATA[<p>Aha. So ein Zufall! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Das hatte ich noch nicht gesehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153204</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 05 Dec 2011 10:45:27 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr als Parameter on Mon, 05 Dec 2011 10:56:51 GMT]]></title><description><![CDATA[<p>Haha, der Paprikachu mit seinem lieblings make_unique ist einfach überall. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153206</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 05 Dec 2011 10:56:51 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr als Parameter on Mon, 05 Dec 2011 11:02:48 GMT]]></title><description><![CDATA[<p>:p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153210</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 05 Dec 2011 11:02:48 GMT</pubDate></item></channel></rss>