<?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[Fragen zu Boost smart-pointern]]></title><description><![CDATA[<p>Ich hab mir jetzt mal ein bischen was über die Smartpointr aus Boost angeschaut. Habe auchd en Artikel gelesen. Mir stellen sich aber dennoch einige Fragen.</p>
<p>Sehe ich das Richtig das es ansich absolut keinen Weg gibt dem Smart-Pointer den anvertrauten Zeiger zu entreißen? Also das man in jedem Fall bei eienr Änderung des Smart-Pointers ein Löschen des Alten Zeigers hinnehmen muß (sofern auch der Referenzcounter hinhaut)?</p>
<p>Eine Frage zu den Vorteilen, es wird ja gesagt das die Dinegr alles etwas sicherer machen, und das die Chance eines Speicherlecks damit sinkt. Macht der Einsatz bei kleienren sachen aber überhaupt Sinn? Ein Beispiel, eine Klasse die einen CString hält, der Konstruktor erstellt ihn und füllt ihn, der Destruktor löscht ihn und eine Änderungsfunktion löscht ihn und erstellt einen neuen. Würde es in so einem Beispiel überhaupt Sinn machen das ganze extra in einen Smartpointer zu stecken?</p>
<p>Und meine letzte Frage. Funktioniert mit den Smart-Pointern überhaupt folgendes Szenario?</p>
<pre><code class="language-cpp">char **ppHead=new char*[100];
ppHead[1]=new char[10];
</code></pre>
<p>Das ganze würde ja ein Array aus Zeiger-Zeigern erstellen und dann in jeden Platz einen Zeiger stopfen, macht mans manuell muß man ja genau hinschaun was man wo und wie löscht. Mit Smart-Poinetrn könnte ich mir so eine Struktur allerdings schwer vorstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/238541/fragen-zu-boost-smart-pointern</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 00:29:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/238541.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 12 Apr 2009 01:27:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fragen zu Boost smart-pointern on Sun, 12 Apr 2009 01:27:35 GMT]]></title><description><![CDATA[<p>Ich hab mir jetzt mal ein bischen was über die Smartpointr aus Boost angeschaut. Habe auchd en Artikel gelesen. Mir stellen sich aber dennoch einige Fragen.</p>
<p>Sehe ich das Richtig das es ansich absolut keinen Weg gibt dem Smart-Pointer den anvertrauten Zeiger zu entreißen? Also das man in jedem Fall bei eienr Änderung des Smart-Pointers ein Löschen des Alten Zeigers hinnehmen muß (sofern auch der Referenzcounter hinhaut)?</p>
<p>Eine Frage zu den Vorteilen, es wird ja gesagt das die Dinegr alles etwas sicherer machen, und das die Chance eines Speicherlecks damit sinkt. Macht der Einsatz bei kleienren sachen aber überhaupt Sinn? Ein Beispiel, eine Klasse die einen CString hält, der Konstruktor erstellt ihn und füllt ihn, der Destruktor löscht ihn und eine Änderungsfunktion löscht ihn und erstellt einen neuen. Würde es in so einem Beispiel überhaupt Sinn machen das ganze extra in einen Smartpointer zu stecken?</p>
<p>Und meine letzte Frage. Funktioniert mit den Smart-Pointern überhaupt folgendes Szenario?</p>
<pre><code class="language-cpp">char **ppHead=new char*[100];
ppHead[1]=new char[10];
</code></pre>
<p>Das ganze würde ja ein Array aus Zeiger-Zeigern erstellen und dann in jeden Platz einen Zeiger stopfen, macht mans manuell muß man ja genau hinschaun was man wo und wie löscht. Mit Smart-Poinetrn könnte ich mir so eine Struktur allerdings schwer vorstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1694661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1694661</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Sun, 12 Apr 2009 01:27:35 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Boost smart-pointern on Sun, 12 Apr 2009 06:00:05 GMT]]></title><description><![CDATA[<p>Xebov schrieb:</p>
<blockquote>
<p>Eine Frage zu den Vorteilen, es wird ja gesagt das die Dinegr alles etwas sicherer machen, und das die Chance eines Speicherlecks damit sinkt. Macht der Einsatz bei kleienren sachen aber überhaupt Sinn? Ein Beispiel, eine Klasse die einen CString hält, der Konstruktor erstellt ihn und füllt ihn, der Destruktor löscht ihn und eine Änderungsfunktion löscht ihn und erstellt einen neuen. Würde es in so einem Beispiel überhaupt Sinn machen das ganze extra in einen Smartpointer zu stecken?</p>
</blockquote>
<p>nee. der string ist ja schon der beitzer und fürs löschen zuständig. das kann ruhig der stringdestruktor machen. smart pointers sind dazu da, wenn unklar ist, wie die besitzverhäötnisse sind. man kann sie auch nehmen, um lokales temporäres mit new geholtes zeug auch im falle von exceptions sicher gelöscht zu kriegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1694668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1694668</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 12 Apr 2009 06:00:05 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Boost smart-pointern on Sun, 12 Apr 2009 11:20:31 GMT]]></title><description><![CDATA[<p>Xebov schrieb:</p>
<blockquote>
<p>Sehe ich das Richtig das es ansich absolut keinen Weg gibt dem Smart-Pointer den anvertrauten Zeiger zu entreißen?</p>
</blockquote>
<p>Du kannst zwar über <code>get()</code> auf den rohen Zeiger zugreifen, jedoch solltest du das normalerweise nicht tun. Was auch wichtig ist: Wenn mehrere <code>shared_ptr</code> s ein gemeinsames Ziel haben, solltest du nur einen direkt mit dem rohen Zeiger initialisieren. Die anderen kopierst du davon. Das ist nötig, damit die Referenzzählung richtig funktioniert.</p>
<p>Xebov schrieb:</p>
<blockquote>
<p>Also das man in jedem Fall bei eienr Änderung des Smart-Pointers ein Löschen des Alten Zeigers hinnehmen muß (sofern auch der Referenzcounter hinhaut)?</p>
</blockquote>
<p>Du sprichst jetzt von <code>shared_ptr</code> . Wenn du den Zeiger umhängst, wird geschaut, ob auf den alten Speicher noch mindestens ein anderer <code>shared_ptr</code> zeigt. Falls nein, wird der Speicher freigegeben.</p>
<p>Xebov schrieb:</p>
<blockquote>
<p>Würde es in so einem Beispiel überhaupt Sinn machen das ganze extra in einen Smartpointer zu stecken?</p>
</blockquote>
<p>Wie volkard erwähnt hat, machen Smart Pointers oft Sinn, wenn nicht klar ist, wer freigibt. Zum Beispiel wenn eine Funktion an x Stellen verlassen werden kann (u.a. mit Exceptions) und du nicht x Mal <code>delete</code> haben willst. Der <code>scoped_ptr</code> ist ein Smart Pointer, der beim Verlassen des Gültigkeitsbereiches freigibt. Dieser hat kaum Overhead gegenüber einem rohen Zeiger, sodass sich der Einsatz schnell auszahlt. Allerdings sollte man es trotzdem nicht übertreiben. Wenn eine Klasse verhältnismässig triviale Speicherverwaltung hat (Anfordern in Konstruktoren, Freigeben in Destruktor), kann man ruhig <code>new</code> und <code>delete</code> verwenden.</p>
<p>Xebov schrieb:</p>
<blockquote>
<p>Und meine letzte Frage. Funktioniert mit den Smart-Pointern überhaupt folgendes Szenario?</p>
</blockquote>
<p>Es gibt zwar &quot;Smart-Arrays&quot; ( <code>shared_array</code> , <code>scoped_array</code> ), aber das scheint mir hier nicht der richtige Ansatz. In deinem Fall würde ich eher Container nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1694743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1694743</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 12 Apr 2009 11:20:31 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Boost smart-pointern on Sun, 12 Apr 2009 12:26:17 GMT]]></title><description><![CDATA[<p>Ok danke für die Ausführlichen Antworten. Wenn ich das richtig verstehe kann ich die Smart-Pointer auch nicht als Temporären Schutz einsetzen oder? Also nach folgendem Muster, eine Klasse hat einen Speicherbereich mit new, um das erstellen und löschen kümemrn sich Konstruktor und Destruktor. Es gibt eine Funktion die den Speicherbereich evrgrößert und einen neuen anlegt ihn kopiert und den alten löscht. In so eienr Klasse würde ja ganz klar die Klasse selbst alles übernehmen, aber in der vergrößerungsfunktion wäre ja ein Smartpointer nicht shclecht um den neuen Speicherbereich Temporär zu halten, falls es zu fehlern komtm so das er garanteirt gelöscht wird. Hier ginge es dann wohl nur über einen Swap so das man dem Smart-Pointer nach erfolg den Alten zeiger andreht so das er diesen löscht da man den neuen nicht mehr aus ihm rausbekommt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1694770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1694770</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Sun, 12 Apr 2009 12:26:17 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Boost smart-pointern on Sun, 12 Apr 2009 12:49:56 GMT]]></title><description><![CDATA[<p>Was du hier suchst ist std::vector. Ein resize() wuerde etwa so aussehen:</p>
<pre><code class="language-cpp">void vector::resize(size_type newSize) {
  vector temp(newSize);
  temp.assign(*this);
  swap(*this, temp);
}
</code></pre>
<p>sprich du fasst rohen speicher einfach nicht an. smart_ptr sind dafuer da, wenn die besitzverhaeltnisse nicht klar sind, die loeschung des speichers zu uebernehmen. aber generell braucht man rohen speicher sowieso fast nie anzufassen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1694774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1694774</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sun, 12 Apr 2009 12:49:56 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Boost smart-pointern on Sun, 12 Apr 2009 12:52:53 GMT]]></title><description><![CDATA[<p>Ja das ginge auch mich würde aber trotzdem interessieren ob das oben von mir geschriebene so gehen würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1694776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1694776</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Sun, 12 Apr 2009 12:52:53 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Boost smart-pointern on Sun, 12 Apr 2009 12:58:16 GMT]]></title><description><![CDATA[<p>Xebov schrieb:</p>
<blockquote>
<p>Ok danke für die Ausführlichen Antworten. Wenn ich das richtig verstehe kann ich die Smart-Pointer auch nicht als Temporären Schutz einsetzen oder? Also nach folgendem Muster, eine Klasse hat einen Speicherbereich mit new, um das erstellen und löschen kümemrn sich Konstruktor und Destruktor. Es gibt eine Funktion die den Speicherbereich evrgrößert und einen neuen anlegt ihn kopiert und den alten löscht. In so eienr Klasse würde ja ganz klar die Klasse selbst alles übernehmen, aber in der vergrößerungsfunktion wäre ja ein Smartpointer nicht shclecht um den neuen Speicherbereich Temporär zu halten, falls es zu fehlern komtm so das er garanteirt gelöscht wird. Hier ginge es dann wohl nur über einen Swap so das man dem Smart-Pointer nach erfolg den Alten zeiger andreht so das er diesen löscht da man den neuen nicht mehr aus ihm rausbekommt?</p>
</blockquote>
<p>doch, da sieht man smart pointers öfters. kennste auch die sorte auto_pointer?<br />
<a href="http://www.cplusplus.com/reference/std/memory/auto_ptr/release/" rel="nofollow">http://www.cplusplus.com/reference/std/memory/auto_ptr/release/</a><br />
aber die smart-pointer-variante beim wachsen müßte man wegen exceptionunsicherheit wohl als falsch bewerten.<br />
aber sagen wir mal die klasse hat zwei mit new anzulegende members, dann kannste das erste gut mit nem auto_ptr festhalten, dann das zweite attribut zuweisen, dann das erste aus dem auto_pointer.release() füttern. rein theoretisch. im ctor brauchste das nicht, wenn du initialisiererlisten benutzt. und mit dem copy&amp;swap brauchst du es woanders auch nicht. komisch. aber irgendwo hab ich das mal so ähnlich gesehen. ich habe schon lange lange keine smart pointers mehr benutzt.</p>
<p>mit dem swappen haste aber insofern recht, daß man da swappt. nur halt ohne smartpounter.<br />
legst einfach ein neues objekt deiner klasse an, befüllste sie mit den daten uns swapst.</p>
<pre><code class="language-cpp">vector::grow(){
  vector tmp(size()*2);
  for each e in *this
    tmp.push_back(e);
  swap(*this,tmp);
}
</code></pre>
<p>das klappt nämlich auch, wenn beim op= des fünfzigsten elements eine exception fliegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1694777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1694777</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 12 Apr 2009 12:58:16 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Boost smart-pointern on Sun, 12 Apr 2009 13:52:37 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>doch, da sieht man smart pointers öfters. kennste auch die sorte auto_pointer?<br />
<a href="http://www.cplusplus.com/reference/std/memory/auto_ptr/release/" rel="nofollow">http://www.cplusplus.com/reference/std/memory/auto_ptr/release/</a></p>
</blockquote>
<p>Ne da skannte ich nicht sieht abe rganz gut aus.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>aber die smart-pointer-variante beim wachsen müßte man wegen exceptionunsicherheit wohl als falsch bewerten.</p>
</blockquote>
<p>Wieso?</p>
<pre><code class="language-cpp">int *pMyMember;
void Enlarge()
{
    SmartPointer pNewPointer(new int);
    Copy pMyMember to pNewPointer;
  Entweder:
    delete[] pMymember;
    pMyMember=inhalt pNewPointer;
    pNewPointer=Null;
  Oder:
    Swap pNewPoinetr pMyMember
};
</code></pre>
<p>Wäre doch eigentlich beides Exceptionsicher, auch wenn beide Varianten mit den Boost Pointern wohl eh nicht gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1694812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1694812</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Sun, 12 Apr 2009 13:52:37 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Boost smart-pointern on Sun, 12 Apr 2009 13:55:25 GMT]]></title><description><![CDATA[<p>Xebov schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>aber die smart-pointer-variante beim wachsen müßte man wegen exceptionunsicherheit wohl als falsch bewerten.</p>
</blockquote>
<p>Wieso?</p>
<pre><code class="language-cpp">int *pMyMember;
void Enlarge()
{
    SmartPointer pNewPointer(new int);
    Copy pMyMember to pNewPointer;

    delete[] pMymember;
    pMymember=inhalt Smartpointer
};
</code></pre>
</blockquote>
<p>mir scheint, du hast nicht rohen speocher angefordert und per placement new dorthineinkonstruiert. davon hing ich hingegen aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1694818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1694818</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 12 Apr 2009 13:55:25 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Boost smart-pointern on Sun, 12 Apr 2009 14:03:08 GMT]]></title><description><![CDATA[<p>Also ind em Beispiel ist natürlich vorausgesetzt das der Int-zeiger Speicher hält usw.</p>
<p>Nein ich hole mir meinen Speiche rimemr Häppchenweise wenn ich dich richtig verstehe gingst du davon aus, das ich mir einmal nen großen Brocken am Programmstart hole und ihn dann selbst Verteile?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1694821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1694821</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Sun, 12 Apr 2009 14:03:08 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Boost smart-pointern on Sun, 12 Apr 2009 14:06:24 GMT]]></title><description><![CDATA[<p>Xebov schrieb:</p>
<blockquote>
<p>Also ind em Beispiel ist natürlich vorausgesetzt das der Int-zeiger Speicher hält usw.</p>
<p>Nein ich hole mir meinen Speiche rimemr Häppchenweise wenn ich dich richtig verstehe gingst du davon aus, das ich mir einmal nen großen Brocken am Programmstart hole und ihn dann selbst Verteile?</p>
</blockquote>
<p>nein, auch häppchenweise.<br />
sagen wie mal zu angang 100 ints. und dann bei jedem wachsen verdoppeln.<br />
jedes push_back belegt einen weiteren meiner anfanhs 100 plätzchen. klappt ein push_back nicht, weils voll ist, muß halt gewachsen werden.<br />
und um nicht nur ints als elemente verwalten zu könnenm das dann als template. und weil die elemente evtl teuer zu konstruoeren sind, konstruierte ich erst im push_back per placement-new.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1694823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1694823</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 12 Apr 2009 14:06:24 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Boost smart-pointern on Sun, 12 Apr 2009 15:23:06 GMT]]></title><description><![CDATA[<p>Ah ok jetzt evrstehe ich wie du das meisnt, so mache ich es nicht, also ich hole mir den Platz und Konstruiere gleich alles. Für mich ist halt etwas im Sinen meines Beispiels gefragt aber der auto_ptr scheint dafür ja ganz gut geeignet zu sein um mal temporär was zu halten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1694868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1694868</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Sun, 12 Apr 2009 15:23:06 GMT</pubDate></item></channel></rss>