<?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[enable_shared_from_this]]></title><description><![CDATA[<p>Doku gelesen - WTF-Moment - Nicht verstanden.<br />
Wozu brauch ichs?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/291861/enable_shared_from_this</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 11:59:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/291861.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 29 Aug 2011 01:33:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to enable_shared_from_this on Mon, 29 Aug 2011 01:33:58 GMT]]></title><description><![CDATA[<p>Doku gelesen - WTF-Moment - Nicht verstanden.<br />
Wozu brauch ichs?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2111838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2111838</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 29 Aug 2011 01:33:58 GMT</pubDate></item><item><title><![CDATA[Reply to enable_shared_from_this on Mon, 29 Aug 2011 01:37:15 GMT]]></title><description><![CDATA[<p><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="😕"
    /> <a href="http://stackoverflow.com/questions/712279/what-is-the-usefulness-of-enable-shared-from-this" rel="nofollow">http://stackoverflow.com/questions/712279/what-is-the-usefulness-of-enable-shared-from-this</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2111839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2111839</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 29 Aug 2011 01:37:15 GMT</pubDate></item><item><title><![CDATA[Reply to enable_shared_from_this on Mon, 29 Aug 2011 01:41:43 GMT]]></title><description><![CDATA[<p>Ich sehe trotzdem keinen Nutzen darin, und verstehe auch nicht wirklich, wie das funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2111840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2111840</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 29 Aug 2011 01:41:43 GMT</pubDate></item><item><title><![CDATA[Reply to enable_shared_from_this on Mon, 29 Aug 2011 07:58:28 GMT]]></title><description><![CDATA[<p>Die Sache ist die: shared_ptr erwartet, dass es für ein gegebenes Objekt genau einen shared_ptr gibt, der mit einem normalen Pointer auf das Objekt initialisiert wird (idealerweise direkt bei/nach dem new-Aufruf), und dass alle weiteren shared_ptr auf das Objekt Kopien dieses originalen shared_ptr sind.<br />
Der Grund ist der Referenz-Zähler. Wenn du einem shared_ptr Konstruktor einen normalen Pointer übergibst, muss er davon ausgehen, dass er der &quot;erste&quot; shared_ptr auf das Objekt ist und legt einen Referenzzähler mit dem Wert 1 an. Wenn du einen shared_ptr kopierst, teilen sie sich den Referenzzähler, der bei jeder Kopie inkrementiert wird und in Destruktoren, release-aufrufen und wann immer ein shared_ptr sein Objekt &quot;loslässt&quot; dekrementiert wird. Fällt der Zähler auf 0, wird das Objekt zerstört.</p>
<p>In manchen Fällen macht es Sinn, dass Methoden this-Pointer zurückgeben. Wenn jetzt stattdessen ein shared_ptr auf das Objekt zurückgegeben werden soll, ist das nicht so einfach:</p>
<pre><code class="language-cpp">struct S
{
  shared_ptr&lt;S&gt; foo() {return shared_ptr&lt;S&gt;(this); } //1
};

int main()
{
  shared_ptr ps(new S();); //0

  {
    shared_ptr ps2 = ps-&gt;foo(); //2
  } //3

} //4
</code></pre>
<p>Folgendes passiert an den numerierten Kommentaren:<br />
0) ps legt eine Refcounter R1 für das Objekt an, Wert wird auf 1 gesetzt.</p>
<ol>
<li>es wird ein temporärer shared_ptr mit dem this-Pointer des Objektes initialisiert. <em>Da der this-Pointer ein normaler S</em> ist, wird ein neuer Refcounter R2 angelegt*</li>
<li>ps2 kopiert vom temporären shared_ptr, benutzt also auch R2. Nachdem der temporäre shared_ptr erledigt ist, steht R2 auf 1 (ps2 ist der einzige shared_ptr mit diesem Refcounter)</li>
<li>ps2 geht aus dem Scope, im Dtor wird R2 auf 0 gesetzt und deshalb das Objekt zerstört.</li>
<li>ps geht aus dem Scope, im Dtor wird R1 auf 0 gesetzt und das Objekt nochmal zerstört. BUMM...</li>
</ol>
<p>enable_shared_from_this sorgt <em>vermutlich</em> einfach dafür, dass der refcounter bereits am Objekt existiert und nicht außerhalb von den shared_ptrn angelegt wird. Wenn man einen shared_ptr von einem solchen Objekt anlegt, wird einfach der bereits vorhandene Refcounter erhöht, egal ob es sich um einen simplen pointer oder einen shared_ptr handelt.<br />
Ich schreibe <em>vermutlich</em>, weil ichs nicht genau weiß - der shared_ptr Header wirds dir zeigen <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/2111885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2111885</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 29 Aug 2011 07:58:28 GMT</pubDate></item><item><title><![CDATA[Reply to enable_shared_from_this on Mon, 29 Aug 2011 08:03:58 GMT]]></title><description><![CDATA[<p>Das ist ja alles schön und gut (Danke für deine Erklärung übrigens) - aber - wozu brauch ich sowas? Warum sollte ich einen shared_ptr auf this zurückgeben wollen? Vielleicht sitzt das Problem auch an anderer Stelle - ich verwende shared_ptr nie, weil ich ihn bisher noch nicht gebraucht habe. Ja, unique_ptr war für meine Zwecke bisher immer völlig ausreichend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2111888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2111888</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 29 Aug 2011 08:03:58 GMT</pubDate></item><item><title><![CDATA[Reply to enable_shared_from_this on Mon, 29 Aug 2011 08:20:50 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Das ist ja alles schön und gut (Danke für deine Erklärung übrigens) - aber - wozu brauch ich sowas? Warum sollte ich einen shared_ptr auf this zurückgeben wollen? Vielleicht sitzt das Problem auch an anderer Stelle - ich verwende shared_ptr nie, weil ich ihn bisher noch nicht gebraucht habe. Ja, unique_ptr war für meine Zwecke bisher immer völlig ausreichend.</p>
</blockquote>
<p>Das setzt voraus, dass man <code>unique_ptr</code> hat. Ansonsten hat man man, insbesondere in Verbindung mit bind-Ausdrücken und gebundenen Smart-Pointer-Objekten, eigentlich nur die Option einen <code>shared_ptr</code> zu nehmen. Ansonsten guck Dir mal die <code>boost.asio</code> -Beispiele an. Zum Beispiel die Chat-Session (in der server.cpp). Da wird <code>shared_from_this</code> benutzt, und da steht auch, warum das toll ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2111894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2111894</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 29 Aug 2011 08:20:50 GMT</pubDate></item><item><title><![CDATA[Reply to enable_shared_from_this on Mon, 29 Aug 2011 08:30:08 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>wozu brauch ich sowas? Warum sollte ich einen shared_ptr auf this zurückgeben wollen?</p>
</blockquote>
<p>Warum <em>Du</em> das brauchen solltest, weiß ich nicht. Ich nutze shared_ptr sonst auch nicht. Aber ich kann mir schon vorstellen, dass das praktisch sein kann. Z.B. wenn sich das Objekt selbstständig irgendwo &quot;registrieren&quot; will und dies eben über ein shared_ptr machen will. Warum denn auch nicht? Ist Dein Tellerrand zu hoch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2111900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2111900</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 29 Aug 2011 08:30:08 GMT</pubDate></item><item><title><![CDATA[Reply to enable_shared_from_this on Mon, 29 Aug 2011 08:37:05 GMT]]></title><description><![CDATA[<p>Also ich habe es schon oft gebraucht. Was ist daran so schwer zu verstehen, das ein verwaltetes Objekt, sich auch mal &quot;verwaltet&quot; übergeben muß? Mit this übergibst du halt nur den unverwalteten Zeiger, mit enable_shared_from_this ist es der verwaltete Zeiger. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2111902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2111902</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Mon, 29 Aug 2011 08:37:05 GMT</pubDate></item><item><title><![CDATA[Reply to enable_shared_from_this on Mon, 29 Aug 2011 08:46:18 GMT]]></title><description><![CDATA[<p>Ihr versteht mein Problem nicht - Ich habe ja verstanden, was es tut (auch wenn mir immer noch nicht klar ist, wie es das tut.)<br />
Ich kann mir dennoch unter &quot;Es gibt einen korrekten shared_ptr auf this zurück&quot; schwer vorstellen, wie ich das verwenden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2111909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2111909</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 29 Aug 2011 08:46:18 GMT</pubDate></item><item><title><![CDATA[Reply to enable_shared_from_this on Mon, 29 Aug 2011 08:51:45 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Z.B. wenn sich das Objekt selbstständig irgendwo &quot;registrieren&quot; will und dies eben über ein shared_ptr machen will.</p>
</blockquote>
<p>Gutes Beispiel <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>
<pre><code class="language-cpp">class Registry 
{ /* ... */

  void register(shared_ptr&lt;RegisteredObject&gt; newObject); 
};

class RegisteredObject
{
public:
  RegisteredObject()
  {
    /* ... */
    Registry::instance().register(shared_from_this()); 
  }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2111914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2111914</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 29 Aug 2011 08:51:45 GMT</pubDate></item><item><title><![CDATA[Reply to enable_shared_from_this on Mon, 29 Aug 2011 08:54:33 GMT]]></title><description><![CDATA[<p>oder:</p>
<pre><code class="language-cpp">class some_class
{

    std::function&lt;void (other_class const &amp; c)&gt; get_callback(){ return std::bind(&amp;this_class::other_class_input, shared_from_this(), _1); }

};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2111915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2111915</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 29 Aug 2011 08:54:33 GMT</pubDate></item></channel></rss>