<?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::shared_ptr] object aus speicherverwaltung entfernen]]></title><description><![CDATA[<pre><code class="language-cpp">double* b=NULL;
{
   boost::shared_ptr&lt;double&gt; a(new double);
   b = a.get();
}
cout&lt;&lt;*b&lt;&lt;endl;
</code></pre>
<p>wie kann ich im scope nun &quot;a&quot; komplett aus der Speicherverwaltung entfernen?<br />
bei reset() wurde das objekt dahinter gelöscht</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/200691/boost-shared_ptr-object-aus-speicherverwaltung-entfernen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 17:49:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/200691.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 18 Dec 2007 15:22:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [boost::shared_ptr] object aus speicherverwaltung entfernen on Wed, 19 Dec 2007 09:23:29 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">double* b=NULL;
{
   boost::shared_ptr&lt;double&gt; a(new double);
   b = a.get();
}
cout&lt;&lt;*b&lt;&lt;endl;
</code></pre>
<p>wie kann ich im scope nun &quot;a&quot; komplett aus der Speicherverwaltung entfernen?<br />
bei reset() wurde das objekt dahinter gelöscht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1422668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422668</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 19 Dec 2007 09:23:29 GMT</pubDate></item><item><title><![CDATA[Reply to [boost::shared_ptr] object aus speicherverwaltung entfernen on Tue, 18 Dec 2007 17:57:54 GMT]]></title><description><![CDATA[<p>muffmolch schrieb:</p>
<blockquote>
<pre><code class="language-cpp">double* b=NULL;
{
   boost::shared_ptr&lt;double*&gt; a(new double);
   b = a.get();
}
cout&lt;&lt;*b&lt;&lt;endl;
</code></pre>
<p>wie kann ich im scope nun &quot;a&quot; komplett aus der Speicherverwaltung entfernen?<br />
bei reset() wurde das objekt dahinter gelöscht</p>
</blockquote>
<p>Du hast hier schon mehrere Fehler (Wenn man auf einen double zeigen will ist boost::shared_ptr&lt;double&gt; das richtige). Und die Zeile &quot;b = a.get()&quot; ist daher effektiv &quot;double* = double**&quot;...</p>
<p>Sofern wir das mal abändern auf boost::shared_ptr&lt;double&gt; wird a am Ende seines Scopes gelöscht, daher wäre b bereits ungültig bevor du die Ausgabe überhaupt machst. Mit Glück steht in der Speicherzelle noch der richtige Wert, aber an sich ist der Speicher bereits gelöscht.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1422780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422780</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 18 Dec 2007 17:57:54 GMT</pubDate></item><item><title><![CDATA[Reply to [boost::shared_ptr] object aus speicherverwaltung entfernen on Tue, 18 Dec 2007 17:59:07 GMT]]></title><description><![CDATA[<p>Das was Du da machst ist undefiniertes Verhalten! Nach dem Block ist a nicht mehr existent. Zufällige Daten, die sich noch im Speicher befinden, die man bei dereferenzieren von b erhält, fallen auch unter undefiniertes Verhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1422782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422782</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Tue, 18 Dec 2007 17:59:07 GMT</pubDate></item><item><title><![CDATA[Reply to [boost::shared_ptr] object aus speicherverwaltung entfernen on Tue, 18 Dec 2007 18:35:13 GMT]]></title><description><![CDATA[<p>Ich denke er wollte wissen, wie man genau das verhindert. Das scheint aber wohl nicht zu gehen, eine release-Methode hat das Teil laut Standard nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1422792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422792</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 18 Dec 2007 18:35:13 GMT</pubDate></item><item><title><![CDATA[Reply to [boost::shared_ptr] object aus speicherverwaltung entfernen on Tue, 18 Dec 2007 20:54:00 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>...Das scheint aber wohl nicht zu gehen, eine release-Methode hat das Teil laut Standard nicht.</p>
</blockquote>
<p>Zur Ergänzung:</p>
<p>Die Boost Beschreibung schrieb:</p>
<blockquote>
<p>Q. Why doesn't shared_ptr provide a release() function?</p>
<p>A. shared_ptr cannot give away ownership unless it's unique() because the other copy will still destroy the object.</p>
<p>Consider:</p>
<pre><code class="language-cpp">shared_ptr&lt;int&gt; a(new int);
    shared_ptr&lt;int&gt; b(a); // a.use_count() == b.use_count() == 2

    int * p = a.release();

    // Who owns p now? b will still call delete on it in its destructor.
</code></pre>
<p>Furthermore, the pointer returned by release() would be difficult to deallocate reliably, as the source shared_ptr could have been created with a custom deleter.</p>
</blockquote>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1422846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422846</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 18 Dec 2007 20:54:00 GMT</pubDate></item><item><title><![CDATA[Reply to [boost::shared_ptr] object aus speicherverwaltung entfernen on Wed, 19 Dec 2007 09:21:27 GMT]]></title><description><![CDATA[<p>ja, das mit dem shared:ptr&lt;double*&gt; war natürlich ein schreibfehler (ich habe natürlich auch keine pointer auf doubles gespeichert...). es ging mir tatsächlich nur um die frage, ob es ein release bei boost gibt. den ausschnitt mit dem release habe ich auch gesehen. prinzipiell stimm eich da zu. aber leider ist &quot;release&quot; bei dem code den ich verwende unumgänglich... habe das nun anders gelöst...</p>
<p>danke dennoch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1422999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422999</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 19 Dec 2007 09:21:27 GMT</pubDate></item><item><title><![CDATA[Reply to [boost::shared_ptr] object aus speicherverwaltung entfernen on Wed, 19 Dec 2007 13:14:41 GMT]]></title><description><![CDATA[<p>muffmolch schrieb:</p>
<blockquote>
<p>ja, das mit dem shared:ptr&lt;double*&gt; war natürlich ein schreibfehler (ich habe natürlich auch keine pointer auf doubles gespeichert...). es ging mir tatsächlich nur um die frage, ob es ein release bei boost gibt.</p>
</blockquote>
<p>Beim Verlassen des Codeblocks, in dem der Shared_Ptr definiert wurde, wird der Release Count automatisch heruntergezählt. In Deinem Beispiel ist er 0 und dadurch wird auch das allokierte Objekt zerstört. Nur wegen des undefinierten Verhaltens siehst Du außerhalb des Blocks noch etwas. DAS IST ABER EIN PROGRAMMIERFEHLER.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423191</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Wed, 19 Dec 2007 13:14:41 GMT</pubDate></item><item><title><![CDATA[Reply to [boost::shared_ptr] object aus speicherverwaltung entfernen on Wed, 19 Dec 2007 18:15:26 GMT]]></title><description><![CDATA[<blockquote>
<p>habe das nun anders gelöst...</p>
</blockquote>
<p>Würde mich interessieren wie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423370</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 19 Dec 2007 18:15:26 GMT</pubDate></item><item><title><![CDATA[Reply to [boost::shared_ptr] object aus speicherverwaltung entfernen on Wed, 19 Dec 2007 21:45:30 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<blockquote>
<p>habe das nun anders gelöst...</p>
</blockquote>
<p>Würde mich interessieren wie.</p>
</blockquote>
<p>Es reicht doch schon, 'd' als 'shared_ptr&lt;double&gt;' zu deklarieren. <em>Easy peasy</em>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423478</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Wed, 19 Dec 2007 21:45:30 GMT</pubDate></item><item><title><![CDATA[Reply to [boost::shared_ptr] object aus speicherverwaltung entfernen on Wed, 19 Dec 2007 23:41:08 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<blockquote>
<p>habe das nun anders gelöst...</p>
</blockquote>
<p>Würde mich interessieren wie.</p>
</blockquote>
<p>Es reicht doch schon, 'd' als 'shared_ptr&lt;double&gt;' zu deklarieren. <em>Easy peasy</em>.</p>
</blockquote>
<p>Lol, ja <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="🙂"
    /><br />
Ich dachte dashier:</p>
<blockquote>
<p>wie kann ich im scope nun &quot;a&quot; komplett aus der Speicherverwaltung entfernen?</p>
</blockquote>
<p>wurde irgendwie gelöst.<br />
Und da boost::shared_ptr kein &quot;release&quot; kennt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423523</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 19 Dec 2007 23:41:08 GMT</pubDate></item><item><title><![CDATA[Reply to [boost::shared_ptr] object aus speicherverwaltung entfernen on Tue, 25 Dec 2007 16:08:49 GMT]]></title><description><![CDATA[<p>also ich beschreibe es genr nochmal ausführlicher.<br />
das dumm yprogramm ist natürlich falsch/fehlerhaft/unrichtig und was auch immer.</p>
<p>aber die frage war eindeutig.</p>
<p>gerne jetzt nochmal für den interessierten leser etwas ausführlicher.<br />
ich habe diverse rechenservice am start, die sich &quot;remote&quot; daten übermitteln. das erfolgt mittels RCF. jarl lindrud verwendet hier im hintergrund booss::shared_ptr. dummerweise unterstützten diverse alte codeblöcke diese keine smartpointer oder haben ihre eigenen. daher muss ich auf der &quot;remote&quot; seite die dereferenziereten objekte eben aus der boost: speicherverwaltung entfernen.</p>
<p>man kann sich das so vorstellen:</p>
<pre><code class="language-cpp">void sendCube(boost::shared_ptr&lt;Cube&gt; ptrCube)
{
   MySmartPtr&lt;Cube&gt; myPtrCube(ptrCube.get());  
   localModule-&gt;setCube(myPtrCube);
}
</code></pre>
<p>erbenis: GAU. nach rückkehr aus der Methode würde der im Speicher initialisierte Cube zerstört werden. Aus diesem Grund wollte ich wissen, ob es irgendwie möglich ist, boost mitzuteilen, dass er das cube-Objekt nicht weiter verwalten soll. nicht mehr und nicht weniger. mir ist klar, dass dies eine unschöne angelegenheit ist, aber eben nicht immer unabdinglich, wenn man verschiedene Codes koppeln möchte. Und die Implementierung einer release-Methode ist trivial. aber da man damit ziemlich viel mist bauen kann, vertehe ich gut, wieso boost diese nicht zur Verfügugn stellt. Aus diesem Grund verschicke ich nun keinen boost::smart_ptr sondern eben bereits einen MySmarPtr oder verwende dort, wo &quot;nackte&quot; Pointer benötigt werden, einen PointerWrapper, der beim Zerstören des Wrappers, zwar den Pointer zerstört, abe reben nicht das eigentliche Objekt. Und ja mir ist bewußt, das sich dadurch die Gefahr erhöht, dass man sich den Speicher zumüllt. Aber keine Sorge, auf jeder Seite fungieren eigene GCs, so dass man lediglich bei Dreizeilern wie oben darauf achten muss, ob man das Objekt in eine neue Verwaltung begibt oder eben nicht. Macht man es nicht, so erfolgt ein &quot;delete&quot; vor Scope Ende...<br />
Hoffe das war nun ausführlich genug!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1425980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425980</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Tue, 25 Dec 2007 16:08:49 GMT</pubDate></item><item><title><![CDATA[Reply to [boost::shared_ptr] object aus speicherverwaltung entfernen on Wed, 26 Dec 2007 10:18:33 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<blockquote>
<p>habe das nun anders gelöst...</p>
</blockquote>
<p>Würde mich interessieren wie.</p>
</blockquote>
<p>Es reicht doch schon, 'd' als 'shared_ptr&lt;double&gt;' zu deklarieren. <em>Easy peasy</em>.</p>
</blockquote>
<p>Lol, ja <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="🙂"
    /><br />
Ich dachte dashier:</p>
<blockquote>
<p>wie kann ich im scope nun &quot;a&quot; komplett aus der Speicherverwaltung entfernen?</p>
</blockquote>
<p>wurde irgendwie gelöst.<br />
Und da boost::shared_ptr kein &quot;release&quot; kennt...</p>
</blockquote>
<p>und genau das sieht man, dass die meisten in die falsch erichtung gedacht haben. das Bsp war nur dazu da um zu zeigen, dass eben genau das verhalten des shared::ptr ausgelöst wird, wenn dieser seinen scope verläßt -&gt; objekt auf das er verweist wird gelöscht, da der interne counter auf 0 gesetzt wird.<br />
und genau das sollte, wie hustbaer richtig erkannte, vermieden werden. so das zwar der shared_ptr weg ist, nicht aber das eigeneltiche Objekt.</p>
<p>Zu boost: wem gehört dann das Objekt. hie rbin ich der ansicht, wenn jemand ein objekt aus der verwaltung nimmt, so muss er auch mit den konsequenzen leben, d.h. er muss sicherstellen, dass das objekt: 1. zerstört wird und 2. erst dann, wenn kein weiterer pointer mehr darauf existiert.<br />
Annahme: simple smart pointer: release entfernt den zugehörigen EINTRAG aus der counter-map -&gt; sobald boost diesen zerstören möchte sieht er, dass er sich gar nicht in der map befindet -&gt; es wird KEIN delete auferufen. alternativ koennte man auch definieren, dass ein release nur dann möglich ich, wenn der ref_count==1 ist. beides, wie gesagt &quot;unschön&quot;, aber eine derartige option wäre nicht allzu verkehrt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1426225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1426225</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 26 Dec 2007 10:18:33 GMT</pubDate></item></channel></rss>