<?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[boost::weak_ptr...]]></title><description><![CDATA[<p>Mal eine doofe Frage: Was genau ist der Sinn und Zweck von <code>boost::weak_ptr</code> ? Wenn ich das richtig verstehe, geht er als Visitor in <code>shared_ptr</code> -Objekte. Aber wozu braucht man das genau?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/239444/boost-weak_ptr</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 12:20:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/239444.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 23 Apr 2009 14:37:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::weak_ptr... on Thu, 23 Apr 2009 14:37:01 GMT]]></title><description><![CDATA[<p>Mal eine doofe Frage: Was genau ist der Sinn und Zweck von <code>boost::weak_ptr</code> ? Wenn ich das richtig verstehe, geht er als Visitor in <code>shared_ptr</code> -Objekte. Aber wozu braucht man das genau?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700242</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700242</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 23 Apr 2009 14:37:01 GMT</pubDate></item><item><title><![CDATA[Reply to boost::weak_ptr... on Thu, 23 Apr 2009 14:40:22 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Mal eine doofe Frage: Was genau ist der Sinn und Zweck von <code>boost::weak_ptr</code> ? Wenn ich das richtig verstehe, geht er als Visitor in <code>shared_ptr</code> -Objekte. Aber wozu braucht man das genau?</p>
</blockquote>
<p>Und zyklische Referenzierung aufzuheben. Also Objekt A hält shared_ptr zu B und B hält shared_ptr zu A. Der Speicher wird nie freigegeben werden. Wenn man da einen weak_ptr einbaut, dann wird A oder B freigegeben und dadurch dann auch der andere.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700244</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 23 Apr 2009 14:40:22 GMT</pubDate></item><item><title><![CDATA[Reply to boost::weak_ptr... on Fri, 24 Apr 2009 07:52:56 GMT]]></title><description><![CDATA[<p>Jo, das macht Sinn. Daran habe ich netmal gedacht.<br />
Edit: Wer lesen kann ist klar im Vorteil. Es steht ja sogar in der Beschreibung zum <code>shared_ptr</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700246</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 24 Apr 2009 07:52:56 GMT</pubDate></item><item><title><![CDATA[Reply to boost::weak_ptr... on Fri, 24 Apr 2009 06:59:36 GMT]]></title><description><![CDATA[<p>Und auch um dangling pointers zu verhindern.<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700541</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 24 Apr 2009 06:59:36 GMT</pubDate></item><item><title><![CDATA[Reply to boost::weak_ptr... on Fri, 24 Apr 2009 07:54:01 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Und auch um dangling pointers zu verhindern.<br />
Simon</p>
</blockquote>
<p>Wie das? Man muss doch extra Aufwand mit den Locks betreiben, um hängende Zeiger zu verhindern. Ich wage sogar zu behaupten, dass die Gefahr von hängenden Zeigern bei der Benutzung von <code>weak_ptr</code> steigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700559</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 24 Apr 2009 07:54:01 GMT</pubDate></item><item><title><![CDATA[Reply to boost::weak_ptr... on Fri, 24 Apr 2009 07:56:10 GMT]]></title><description><![CDATA[<p>Kannst du das mal genauer Erklären, <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9752">@Dravere</a>?</p>
<p>&quot;Also Objekt A hält shared_ptr zu B und B hält shared_ptr zu A.&quot;</p>
<p>Wie sieht das codemäßig aus?<br />
THX!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700563</guid><dc:creator><![CDATA[Verstand]]></dc:creator><pubDate>Fri, 24 Apr 2009 07:56:10 GMT</pubDate></item><item><title><![CDATA[Reply to boost::weak_ptr... on Fri, 24 Apr 2009 07:59:22 GMT]]></title><description><![CDATA[<p>Verstand schrieb:</p>
<blockquote>
<p>Kannst du das mal genauer Erklären, <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9752">@Dravere</a>?</p>
<p>&quot;Also Objekt A hält shared_ptr zu B und B hält shared_ptr zu A.&quot;</p>
<p>Wie sieht das codemäßig aus?<br />
THX!</p>
</blockquote>
<pre><code class="language-cpp">struct B;

struct A
{
    //...
    boost::shared_ptr&lt;B&gt; myBPtr;
    //...
};

struct B
{
    //...
    boost::shared_ptr&lt;A&gt; myAPtr;
    //...
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1700567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700567</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 24 Apr 2009 07:59:22 GMT</pubDate></item><item><title><![CDATA[Reply to boost::weak_ptr... on Fri, 24 Apr 2009 08:04:56 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>theta schrieb:</p>
<blockquote>
<p>Und auch um dangling pointers zu verhindern.<br />
Simon</p>
</blockquote>
<p>Wie das? Man muss doch extra Aufwand mit den Locks betreiben, um hängende Zeiger zu verhindern. Ich wage sogar zu behaupten, dass die Gefahr von hängenden Zeigern bei der Benutzung von <code>weak_ptr</code> steigt.</p>
</blockquote>
<p><a href="http://www.boost.org/doc/libs/1_38_0/libs/smart_ptr/weak_ptr.htm" rel="nofollow">http://www.boost.org/doc/libs/1_38_0/libs/smart_ptr/weak_ptr.htm</a></p>
<p>Nein, nur die Methode um vom weak_ptr wieder an den pointer via shared_ptr zu kommen heisst lock().</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700569</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 24 Apr 2009 08:04:56 GMT</pubDate></item><item><title><![CDATA[Reply to boost::weak_ptr... on Fri, 24 Apr 2009 08:12:59 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>theta schrieb:</p>
<blockquote>
<p>Und auch um dangling pointers zu verhindern.<br />
Simon</p>
</blockquote>
<p>Wie das? Man muss doch extra Aufwand mit den Locks betreiben, um hängende Zeiger zu verhindern. Ich wage sogar zu behaupten, dass die Gefahr von hängenden Zeigern bei der Benutzung von <code>weak_ptr</code> steigt.</p>
</blockquote>
<p><a href="http://www.boost.org/doc/libs/1_38_0/libs/smart_ptr/weak_ptr.htm" rel="nofollow">http://www.boost.org/doc/libs/1_38_0/libs/smart_ptr/weak_ptr.htm</a></p>
<p>Nein, nur die Methode um vom weak_ptr wieder an den pointer via shared_ptr zu kommen heisst lock().</p>
<p>Simon</p>
</blockquote>
<p>Und wo steht da, dass es hängende Zeiger verhindert? Man kann einen <code>weak_ptr</code> eh nur mit <code>shared_ptr</code> -Objekten erzeugen. Und der generierende <code>chared_ptr</code> minimiert ja bereits die Wahrscheinlichkeit für hängende Zeiger. Und wenn ich das richtig sehe, kann man die verwalteten Objekte auch nicht direkt über einen <code>weak_ptr</code> referenzieren. Man <em>muss</em> also den Umweg über einen <code>shared_ptr</code> mit <code>lock()</code> gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700570</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 24 Apr 2009 08:12:59 GMT</pubDate></item><item><title><![CDATA[Reply to boost::weak_ptr... on Fri, 24 Apr 2009 08:27:09 GMT]]></title><description><![CDATA[<blockquote>
<p>Und wo steht da, dass es hängende Zeiger verhindert?</p>
</blockquote>
<p>Suche halt mal nach &quot;dangling&quot; oder ähnlich auf der Seite...</p>
<p>Und ja, man <em>muss</em> von weak_ptr zuerst eine shared_ptr erzeugen.</p>
<p>Simon</p>
<p>Edit:<br />
lock() ist die eine Möglichkeit, den shared_ptr ctor ist die andere.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700575</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 24 Apr 2009 08:27:09 GMT</pubDate></item><item><title><![CDATA[Reply to boost::weak_ptr... on Fri, 24 Apr 2009 08:43:30 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Suche halt mal nach &quot;dangling&quot; oder ähnlich auf der Seite..</p>
</blockquote>
<p>Wie gesagt, da steht nur, dass man sich leicht hängende Zeiger einfängt, wenn man nicht aufpasst...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700585</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 24 Apr 2009 08:43:30 GMT</pubDate></item><item><title><![CDATA[Reply to boost::weak_ptr... on Fri, 24 Apr 2009 09:32:14 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Wie gesagt, da steht nur, dass man sich leicht hängende Zeiger einfängt, wenn man nicht aufpasst...</p>
</blockquote>
<p>weak_ptr verhindert auch nicht, das kein Zielobjekt existiert, bekommt aber im Gegensatz zu einem Zeiger davon mit wenn dies eintritt. Stell dir weak_ptr einfach als einen Zeiger vor, der automatisch auf null gesetzt wird, wenn kein zugehöriger shared_ptr mehr existiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700614</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 24 Apr 2009 09:32:14 GMT</pubDate></item><item><title><![CDATA[Reply to boost::weak_ptr... on Fri, 24 Apr 2009 09:49:12 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>Wie gesagt, da steht nur, dass man sich leicht hängende Zeiger einfängt, wenn man nicht aufpasst...</p>
</blockquote>
<p>weak_ptr verhindert auch nicht, das kein Zielobjekt existiert, bekommt aber im Gegensatz zu einem Zeiger davon mit wenn dies eintritt. Stell dir weak_ptr einfach als einen Zeiger vor, der automatisch auf null gesetzt wird, wenn kein zugehöriger shared_ptr mehr existiert.</p>
</blockquote>
<p>Das ist schon klar. Nur hat <code>weak_ptr</code> <em>nur</em> in Verbindung mit <code>shared_ptr</code> Sinn (es geht nichtmal ohne). Und auch dabei braucht man ihn nur, um zirkulare Referenzen zu entblocken.<br />
Der Sinn ist es daher sicher nicht, hängende Zeiger zu vermeiden. Es geht soch wohl eher darum, zirkulare Referenzen aufzulösen, ohne das <code>shared_ptr</code> -Konzept zu aufzuweichen.<br />
Die Frage war:</p>
<p>Tachyon schrieb:</p>
<blockquote>
<p>Was genau ist der Sinn und Zweck von boost::weak_ptr?</p>
</blockquote>
<p>Die Antwort...</p>
<p>theta schrieb:</p>
<blockquote>
<p>Und auch um dangling pointers zu verhindern.</p>
</blockquote>
<p>...ist so einfach falsch.</p>
<p>PS: Mit ist inzwischen zwar klar, dass theta das im Bezug auf den eigentlichen Verwendungszweck meint, aber als er die Antwort gab, war es das noch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700618</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 24 Apr 2009 09:49:12 GMT</pubDate></item><item><title><![CDATA[Reply to boost::weak_ptr... on Fri, 24 Apr 2009 12:53:35 GMT]]></title><description><![CDATA[<p>Verstand schrieb:</p>
<blockquote>
<p>Kannst du das mal genauer Erklären, <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9752">@Dravere</a>?</p>
<p>&quot;Also Objekt A hält shared_ptr zu B und B hält shared_ptr zu A.&quot;</p>
<p>Wie sieht das codemäßig aus?<br />
THX!</p>
</blockquote>
<p>Ich gebe dazu gerne mal ein Beispiel, welches sogar kompilierbar ist, gegenüber dem Beispiel von Tachyon. Damit sollte es jedem klar werden <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">#include &lt;boost/shared_ptr.hpp&gt;

#include &lt;iostream&gt;

struct MyClassA;
struct MyClassB;

// Nur wegen der Schreibfaulheit :)
typedef boost::shared_ptr&lt;MyClassA&gt; MyClassAPtr;
typedef boost::shared_ptr&lt;MyClassB&gt; MyClassBPtr;

struct MyClassA
{
	MyClassBPtr bPtr;

	~MyClassA()
	{
		std::cout &lt;&lt; &quot;A destroyed&quot; &lt;&lt; std::endl;
	}
};

struct MyClassB
{
	MyClassAPtr aPtr;

	~MyClassB()
	{
		std::cout &lt;&lt; &quot;B destroyed&quot; &lt;&lt; std::endl;
	}
};

void foo()
{
	MyClassAPtr objA(new MyClassA());
	MyClassBPtr objB(new MyClassB());

	objA-&gt;bPtr = objB;
	objB-&gt;aPtr = objA;
}

int main()
{
	foo();

	// Speicherleck entstanden.
	// Kein Zeiger mehr auf die Objekte vorhanden,
	// aber beide die shared_ptr erreichen bei der
	// Referenzzählung keinen Wert von 0. Die
	// Objekte werden nicht freigegeben.

	return 0;
}
</code></pre>
<p>Du kannst das Speicherleck auch dadurch sehen, dass die Destruktoren nicht aufgerufen werden.<br />
Ein <code>boost::weak_ptr</code> kann diese Abhängigkeit nun in eine Richtung verringern, da ein <code>boost::weak_ptr</code> bei der Referenzzählung nicht gilt. Eines der beiden Objekt erreicht dann die Anzahl Referenzen von 0. Löscht sich dadurch und verringert die Referenzzählung des anderen Objektes, welches dann auch gelöscht wird.<br />
Also einfach die folgende Zeile abändern (in der Struktur MyClassB):</p>
<pre><code class="language-cpp">MyClassAPtr aPtr;
</code></pre>
<p>zu</p>
<pre><code class="language-cpp">boost::weak_ptr&lt;MyClassA&gt; aPtr;
</code></pre>
<p>( <code>#include &lt;boost/weak_ptr.hpp&gt;</code> nicht vergessen)</p>
<p>Wenn du nun das Programm ausführst, dann wird alles korrekt gelöscht.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700714</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 24 Apr 2009 12:53:35 GMT</pubDate></item><item><title><![CDATA[Reply to boost::weak_ptr... on Fri, 24 Apr 2009 13:05:11 GMT]]></title><description><![CDATA[<p>Also ich muß da mal nachhaken. Draveres Beispiel ist ja schön und gut, aber der Sinn erschließt sich mir nicht wirklich. Man kann solche Zeiger zwar super für Kommunikation benutzen, aber wie komt sone Kreisbewegung jetzt logisch zusammen?</p>
<p>Ich meine wenn ich 2 Klassen habe die Kommunizieren dann kann ich es doch genauso so machen:</p>
<pre><code class="language-cpp">class A
{
B* p;
A()
{
    p=new B(this);
};
};
class B
{
A* p;
B(A* pa)
{
    p=pa;
};
};
</code></pre>
<p>Oder ich lasse den Faden ganz woanders raushängen, denn das Beispiel von Davere wäre ja ne kreisfahrt ohne raushängendes Ende mit dem man Kommunizieren kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700721</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Fri, 24 Apr 2009 13:05:11 GMT</pubDate></item><item><title><![CDATA[Reply to boost::weak_ptr... on Fri, 24 Apr 2009 13:12:16 GMT]]></title><description><![CDATA[<p>Xebov schrieb:</p>
<blockquote>
<p>Ich meine wenn ich 2 Klassen habe die Kommunizieren dann kann ich es doch genauso so machen:</p>
</blockquote>
<p>Wobei du dich dann sowohl um das Speicherhandling, als auch die Benachrichtigung kümmern musst wenn ein Zeiger ungültig wird (mit shared_ptr und weak_ptr funktioniert dies auch, wenn mehrere Klassen und nicht nur 2 involviert sind perfekt).</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700724</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 24 Apr 2009 13:12:16 GMT</pubDate></item><item><title><![CDATA[Reply to boost::weak_ptr... on Fri, 24 Apr 2009 14:13:16 GMT]]></title><description><![CDATA[<p>Nur der Vollständigkeit halber: Man kann auch manuell den Kreis brechen</p>
<pre><code class="language-cpp">void foo() // Aus Draveres exzellentem Beispiel
{
    MyClassAPtr objA(new MyClassA());
    MyClassBPtr objB(new MyClassB());

    objA-&gt;bPtr = objB;
    objB-&gt;aPtr = objA;

	objB-&gt;aPtr.reset(); // &lt;-
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1700759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700759</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 24 Apr 2009 14:13:16 GMT</pubDate></item></channel></rss>