<?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[Smartpointer, wozu?]]></title><description><![CDATA[<p>Welchen vorteil bieten shared_ptr?<br />
Außer:</p>
<ul>
<li>kein explizites delete</li>
<li>keine Memoryleaks bei exceptions</li>
</ul>
<p>Ich schrecke tendenziell davor zurück, da shared_ptr intern speicher allokieren. Exceptions hab ich sowieso ausgeschaltet und delete zu schreiben ist auch kein Problem. Was spricht noch dafür bzw. in welchen Situationen kommt man nicht drum rum?</p>
<p>MfG<br />
DDR-RAM</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/171380/smartpointer-wozu</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 11:59:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/171380.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 24 Jan 2007 21:13:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Smartpointer, wozu? on Wed, 24 Jan 2007 21:13:36 GMT]]></title><description><![CDATA[<p>Welchen vorteil bieten shared_ptr?<br />
Außer:</p>
<ul>
<li>kein explizites delete</li>
<li>keine Memoryleaks bei exceptions</li>
</ul>
<p>Ich schrecke tendenziell davor zurück, da shared_ptr intern speicher allokieren. Exceptions hab ich sowieso ausgeschaltet und delete zu schreiben ist auch kein Problem. Was spricht noch dafür bzw. in welchen Situationen kommt man nicht drum rum?</p>
<p>MfG<br />
DDR-RAM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1216430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216430</guid><dc:creator><![CDATA[DDR-RAM]]></dc:creator><pubDate>Wed, 24 Jan 2007 21:13:36 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer, wozu? on Wed, 24 Jan 2007 22:00:53 GMT]]></title><description><![CDATA[<p>Es ist nicht nur so, dass man kein delete aufrufen braucht, das wäre auch nicht das Problem, sondern man kann es auch nicht vergessen. Und dies passiert schneller als man denkt; auch ohne Exceptions. Und wenn es nur das übliche ist, wie:</p>
<pre><code class="language-cpp">T* p = new T(...);
    // viel Code
    if( Problem ) // dieser Code wurde erst später eingefügt
        return;   
    // viel Code
    delete p;
</code></pre>
<p>Ein weiterer Vorteil, den insbesondere der boost::shared_ptr bietet, ist das Hinzufügen einer beliebigen delete-Funktion. Das ist besonders dann schick, wenn man z.B. mit der Win-API arbeitet (geht sicher auch bei anderen APIs). Zum Beispiel:</p>
<pre><code class="language-cpp">// Bem.: HANDLE ist eine void*
    HANDLE hnd = CreateFile( ... );
    if( hnd == INVALID_HANDLE_VALUE ) return Fehler;
    boost::shared_ptr&lt; void &gt; file( hnd, ::CloseHandle );
    // usw.
    // Zugriff auf das Handle via file.get()
</code></pre>
<p>Auch hier wieder der Vorteil, dass das File in jedem Fall wieder geschlossen wird (CloseHandle( HANDLE )), sobald der Scope verlassen wird.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1216476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216476</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 24 Jan 2007 22:00:53 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer, wozu? on Wed, 24 Jan 2007 22:18:01 GMT]]></title><description><![CDATA[<p>Zusätzlich kannst du Smartptr schön in deinen Klassen benutzen anstatt rohen Zeigern...</p>
<p>Du musst dich dann nicht um den Copy-C'tor kümmern, da die SmrtPtr wissen wie sie sich zu kopieren haben.<br />
Desweiteren kannst du dann so bestimmen was noch beim Kopieren deiner SmrtPtr passieren soll -&gt; Stichwort: Referenzzählung</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1216487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216487</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 24 Jan 2007 22:18:01 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer, wozu? on Wed, 24 Jan 2007 23:05:25 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Es ist nicht nur so, dass man kein delete aufrufen braucht, das wäre auch nicht das Problem, sondern man kann es auch nicht vergessen. Und dies passiert schneller als man denkt; auch ohne Exceptions. Und wenn es nur das übliche ist, wie:</p>
<pre><code class="language-cpp">T* p = new T(...);
    // viel Code
    if( Problem ) // dieser Code wurde erst später eingefügt
        return;   
    // viel Code
    delete p;
</code></pre>
</blockquote>
<p>hm, und das? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<pre><code class="language-cpp">T tWithAutomaticStorage(...);
// viel Code
if( Problem ) // dieser Code wurde erst später eingefügt
    return;   
// viel Code
</code></pre>
<p>Mir ist schon klar, das man eine delete vergessen könnte. Allerdings konnte ich bis jetzt die übeltäter in der Regel aufspüren und das dauerte noch nicht mal solange. (bitte keine Kommentare zur Projektgröße).</p>
<blockquote>
<p>Ein weiterer Vorteil, den insbesondere der boost::shared_ptr bietet, ist das Hinzufügen einer beliebigen delete-Funktion. Das ist besonders dann schick, wenn man z.B. mit der Win-API arbeitet (geht sicher auch bei anderen APIs). Zum Beispiel:</p>
<pre><code class="language-cpp">// Bem.: HANDLE ist eine void*
    HANDLE hnd = CreateFile( ... );
    if( hnd == INVALID_HANDLE_VALUE ) return Fehler;
    boost::shared_ptr&lt; void &gt; file( hnd, ::CloseHandle );
    // usw.
    // Zugriff auf das Handle via file.get()
</code></pre>
<p>Auch hier wieder der Vorteil, dass das File in jedem Fall wieder geschlossen wird (CloseHandle( HANDLE )), sobald der Scope verlassen wird.</p>
</blockquote>
<p>Für Wrapperklassen vielleicht ganz interessant, aber das ist jetzt ja schon fast ein anderes Anwendungsgebiet.</p>
<p>Freak_Coder schrieb:</p>
<blockquote>
<p>Zusätzlich kannst du Smartptr schön in deinen Klassen benutzen anstatt rohen Zeigern...</p>
</blockquote>
<p>Ja, genau darum geht es prinzipiell.</p>
<blockquote>
<p>Du musst dich dann nicht um den Copy-C'tor kümmern, da die SmrtPtr wissen wie sie sich zu kopieren haben.</p>
</blockquote>
<p>Ja, aber 0815-ptr sind auch CopyConstructable und Assignable.</p>
<blockquote>
<p>Desweiteren kannst du dann so bestimmen was noch beim Kopieren deiner SmrtPtr passieren soll -&gt; Stichwort: Referenzzählung</p>
</blockquote>
<p>Ja genau das macht der smart_ptr ja, deshalb keine delete's <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Also smart_ptr sind fast idiotensicher. (Achtung zyklische abhängigkeiten und exceptions zwischen new expression und constructor <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> )<br />
Mit nem normalen pointer gehört man schon fast zur C-Fraktion.<br />
Wie gesagt, EH interessiert mich atm nicht, weil ich es deaktiviert habe und für das aktuelle Projekt auch nicht aktivieren werde.</p>
<p>Was mich besonders an den smart_ptr stört, ist die zusätzliche interne speicher-allokation.<br />
Ich glaube ich schreibe baue mir nen eigenen SmartPtr.<br />
Danke für die Antworten.</p>
<p>MfG<br />
DDR-RAM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1216507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216507</guid><dc:creator><![CDATA[DDR-RAM]]></dc:creator><pubDate>Wed, 24 Jan 2007 23:05:25 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer, wozu? on Wed, 24 Jan 2007 23:32:33 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8880">@DDR-RAM</a>: &quot;shared_ptr&quot; implementiert wie der Name schon sagt &quot;shared ownership&quot;. Es gibt viele Situationen wo es mühsam ist einen einzigen &quot;owner&quot; festzulegen, bzw. wo man sogar gezwungen ist manche Objekte sehr lange am Leben zu lassen, bloss weil es in manchen seltenen Fällen sein könnte dass sie noch irgendwo referenziert werden. In solchen Fällen ist es halt sehr praktisch &quot;shared ownership&quot; zu haben. &quot;intrusive_ptr&quot; ist im Prinzip dasselbe, bloss funktioniert &quot;intrusive_ptr&quot; nur wenn im Objekt selbst eine Möglichkeit existiert Referenzen zu zählen. &quot;spared_ptr&quot; kommt ohne das aus, allerdings zahlt man dafür den Preis einer zusätzlichen dynamischen Speicheranforderung.</p>
<p>EDIT: verwenden doch intrusive_ptr. Natürlich kannst du auch eine &quot;linked list&quot; Implementierung eines smart_ptr machen, die dürfte ohne Multithreading sogar schneller sein, mit allerdings sicher langsamer.</p>
<p>Ausser dem was &quot;intrusive_ptr&quot; macht und eben der &quot;linked list&quot; Version wüsste ich aber keine Möglichkeit auf die zusätzliche Speicheranforderung zu verzichten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1216509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216509</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 24 Jan 2007 23:32:33 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer, wozu? on Wed, 24 Jan 2007 23:12:34 GMT]]></title><description><![CDATA[<p>ich glaube du suchst boost::scoped_ptr</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1216510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216510</guid><dc:creator><![CDATA[.......]]></dc:creator><pubDate>Wed, 24 Jan 2007 23:12:34 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer, wozu? on Wed, 24 Jan 2007 23:37:49 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8880">@DDR-RAM</a>: &quot;shared_ptr&quot; implementiert wie der Name schon sagt &quot;shared ownership&quot;. Es gibt viele Situationen wo es mühsam ist einen einzigen &quot;owner&quot; festzulegen, bzw. wo man sogar gezwungen ist manche Objekte sehr lange am Leben zu lassen, bloss weil es in manchen seltenen Fällen sein könnte dass sie noch irgendwo referenziert werden. In solchen Fällen ist es halt sehr praktisch &quot;shared ownership&quot; zu haben.</p>
</blockquote>
<p>An library-grenzen?</p>
<blockquote>
<p>&quot;intrusive_ptr&quot; ist im Prinzip dasselbe, bloss funktioniert &quot;intrusive_ptr&quot; nur wenn im Objekt selbst eine Möglichkeit existiert Referenzen zu zählen.</p>
</blockquote>
<p>Ich werd sowas wahrscheinlich als front-end verwenden.</p>
<blockquote>
<p>&quot;spared_ptr&quot; kommt ohne das aus, allerdings zahlt man dafür den Preis einer zusätzlichen dynamischen Speicheranforderung.</p>
</blockquote>
<p>Also shared_ptr sind nicht schlechtes, mit weak_ptr zusammen hört sich das fast nach gratis gc an, bei der der Entwickler viel anpassen kann durch den spezifischen finalizer. Für Basisklassenzeiger fände ich es aber auch ganz nett, wenn sie die Fähigkeiten eines shared_ptr hätten, Referenzzählung und finalisierung kann man ja auch irgendwie in dieser Klasse erledigen.<br />
Was macht eigentlich std::auto_ptr?</p>
<p>MfG<br />
DDR-RAM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1216521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216521</guid><dc:creator><![CDATA[DDR-RAM]]></dc:creator><pubDate>Wed, 24 Jan 2007 23:37:49 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer, wozu? on Thu, 25 Jan 2007 00:14:29 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;memory&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

int main(int argc, char* argv[])
{
  auto_ptr&lt;string&gt; a(new string(&quot;Hallo!&quot;));

  cout &lt;&lt; &quot;a zeigt auf: &quot; &lt;&lt; a.get() &lt;&lt; endl;

  auto_ptr&lt;string&gt; b = a;

  cout &lt;&lt; &quot;a zeigt auf: &quot; &lt;&lt; a.get() &lt;&lt; endl;
  cout &lt;&lt; &quot;b zeigt auf: &quot; &lt;&lt; b.get() &lt;&lt; endl;

  return 0;
}
</code></pre>
<p>Ergebnis:</p>
<pre><code>a zeigt auf: 003212A8
a zeigt auf: 00000000
b zeigt auf: 003212A8
</code></pre>
<p>auto_ptr gibt immer die Verantwortung weiter, soll heißen es gibt immer nur einen Besitzer. Also das genaue Gegenteil von shared_ptr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1216534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216534</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Thu, 25 Jan 2007 00:14:29 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer, wozu? on Thu, 25 Jan 2007 00:39:06 GMT]]></title><description><![CDATA[<p>auto_ptr dient primär einem einzigen Zweck: als sichere Variante der Rückgabe von dynamisch allokierten Objekten durch Funktionen (oder als Übergabeparameter, falls Ownership transferiert werden soll). Für alles andere gibt es bessere Alternativen. Insbesondere als Klassenmember ist auto_ptr nicht geeignet. Grundsätzlich sollte ohnehin die einfachste Art von Smartpointer, die eine gestellte Aufgabe erfüllen kann, gewählt werden. Das ist im Regelfall scoped_ptr bzw. scoped_array.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1216537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216537</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 25 Jan 2007 00:39:06 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer, wozu? on Thu, 25 Jan 2007 07:22:16 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Grundsätzlich sollte ohnehin die einfachste Art von Smartpointer, die eine gestellte Aufgabe erfüllen kann, gewählt werden. Das ist im Regelfall scoped_ptr bzw. scoped_array.</p>
</blockquote>
<p>Wobei auto_ptr genauso so einfach ist. Sofern nichts kopiert wird, degeneriert dieser zu einem scoped_ptr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1216578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216578</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Thu, 25 Jan 2007 07:22:16 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer, wozu? on Thu, 25 Jan 2007 08:53:22 GMT]]></title><description><![CDATA[<p>Ich finde bloß den Namen &quot;scoped_ptr&quot; aussagekräftiger. Der Name &quot;auto_ptr&quot; suggeriert mehr als er kann. Ist aber rein psychologisch. <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/1216628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216628</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 25 Jan 2007 08:53:22 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer, wozu? on Thu, 25 Jan 2007 10:23:37 GMT]]></title><description><![CDATA[<p>groovemaster schrieb:</p>
<blockquote>
<p>Wobei auto_ptr genauso so einfach ist. Sofern nichts kopiert wird, degeneriert dieser zu einem scoped_ptr.</p>
</blockquote>
<p>Das ist widersprüchlich. Die Fähigkeit, in bestimmter Weise kopierbar zu sein, verliert der auto_ptr ja nicht dadurch, dass man keinen Gebrauch davon macht. Auch z.B. ein intrusive_ptr verhält sich da nicht anders, <em>wenn</em> (hier kommt es wieder) der interne Referenzcounter des Objekts für keinen anderen Zweck genutzt wird. Es kommt wohl darauf an, was man unter <em>einfach</em> subsumieren will. Jedenfalls schweift das etwas vom Thema ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1216727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216727</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 25 Jan 2007 10:23:37 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer, wozu? on Thu, 25 Jan 2007 13:50:54 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Die Fähigkeit, in bestimmter Weise kopierbar zu sein, verliert der auto_ptr ja nicht dadurch, dass man keinen Gebrauch davon macht.</p>
</blockquote>
<p>Das ist richtig. Nur entsteht dabei kein Overhead, wenn die Kopiersemantik nicht genutzt wird. Das meinte ich mit &quot;einfach&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1216867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216867</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Thu, 25 Jan 2007 13:50:54 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer, wozu? on Thu, 25 Jan 2007 17:50:23 GMT]]></title><description><![CDATA[<p>DDR-RAM schrieb:</p>
<blockquote>
<blockquote>
<p>&quot;spared_ptr&quot; kommt ohne das aus, allerdings zahlt man dafür den Preis einer zusätzlichen dynamischen Speicheranforderung.</p>
</blockquote>
<p>Also shared_ptr sind nicht schlechtes, mit weak_ptr zusammen hört sich das fast nach gratis gc an, bei der der Entwickler viel anpassen kann durch den spezifischen finalizer.</p>
</blockquote>
<p>Oha, Vorsicht. shared_ptr ist weit davon entfernt &quot;gratis&quot; zu sein. Jedesmal wenn du einen nicht-leeren shared_ptr konstuierst oder zerstörst kostet das ein InterlockedIncrement/InterlockedDecrement, und interlocked instructions sind teuer. Alleine das herrumreichen eines shared_ptr by Value ist also schon teuer genug, wobei man das ja noch verhindern kann indem man einfach ne const-ref auf den shared_ptr übergibt.</p>
<p>Aber versteh' mich nicht falsch, ich verwende shared_ptr häufig, einfach weil die Dinger so wahnsinnig praktisch sind. Bei Programmteilen die hoch optimiert sein müssen (weil sie so oft durchlaufen werden) überlege ich mir aber gut ob ich nicht vielleicht auf shared_ptr verzichten kann, oder einen Weg finden wie ich keine Kopien anlegen muss, bzw. eben so wenig wie möglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1217079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1217079</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 25 Jan 2007 17:50:23 GMT</pubDate></item></channel></rss>