<?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[Einige Fragen zu Smartptr]]></title><description><![CDATA[<p>Hi,</p>
<ol>
<li></li>
</ol>
<p>Nutzt ihr Smartpointer anstatt von jedem Zeiger oder fallen euch Ausnahmen ein?</p>
<ol start="2">
<li></li>
</ol>
<p>Ich bin nicht ganz sicher, wann ich weak_ptr und wann shared_ptr benutzen sollte. Was, wenn ich beispielsweise einer Funktion, die irgendwas macht, einen Zeiger übergeben möchte, der in der aufrufenden Funktion als shared_ptr bekannt ist?</p>
<p>Quasi so:</p>
<pre><code class="language-cpp">class Test{};

typedef shared_ptr&lt;Test&gt; TestPtrSh;
typedef weak_ptr&lt;Test&gt;   TestPtrWe;

void foo(/* welcher ptr? */ obj)
{
// mache etwas mit obj
}

int main()
{
TestPtrSh obj;
foo(obj);
return 0;
}
</code></pre>
<p>shared_ptr hat ja anscheinend schon ein bisschen zu tun, zählt intern Referenzen mit etc. Wenn ich da bei jedem Funktionsaufruf eine Instanz erstellen und danach zerstören lassen würde, wäre das evtl. Overhead, daher macht da für mich der weak_ptr mehr Sinn, oder?</p>
<ol start="3">
<li></li>
</ol>
<p>Wie nennt ihr eure typedefs, wenn ihr shared_- und weak_ptr nutzt? <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>Danke und Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274066/einige-fragen-zu-smartptr</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 19:04:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274066.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 19 Sep 2010 04:12:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Sun, 19 Sep 2010 04:12:11 GMT]]></title><description><![CDATA[<p>Hi,</p>
<ol>
<li></li>
</ol>
<p>Nutzt ihr Smartpointer anstatt von jedem Zeiger oder fallen euch Ausnahmen ein?</p>
<ol start="2">
<li></li>
</ol>
<p>Ich bin nicht ganz sicher, wann ich weak_ptr und wann shared_ptr benutzen sollte. Was, wenn ich beispielsweise einer Funktion, die irgendwas macht, einen Zeiger übergeben möchte, der in der aufrufenden Funktion als shared_ptr bekannt ist?</p>
<p>Quasi so:</p>
<pre><code class="language-cpp">class Test{};

typedef shared_ptr&lt;Test&gt; TestPtrSh;
typedef weak_ptr&lt;Test&gt;   TestPtrWe;

void foo(/* welcher ptr? */ obj)
{
// mache etwas mit obj
}

int main()
{
TestPtrSh obj;
foo(obj);
return 0;
}
</code></pre>
<p>shared_ptr hat ja anscheinend schon ein bisschen zu tun, zählt intern Referenzen mit etc. Wenn ich da bei jedem Funktionsaufruf eine Instanz erstellen und danach zerstören lassen würde, wäre das evtl. Overhead, daher macht da für mich der weak_ptr mehr Sinn, oder?</p>
<ol start="3">
<li></li>
</ol>
<p>Wie nennt ihr eure typedefs, wenn ihr shared_- und weak_ptr nutzt? <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>Danke und Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954254</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sun, 19 Sep 2010 04:12:11 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Sun, 19 Sep 2010 08:42:31 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Hi,</p>
<ol>
<li></li>
</ol>
<p>Nutzt ihr Smartpointer anstatt von jedem Zeiger oder fallen euch Ausnahmen ein?</p>
<ol start="2">
<li></li>
</ol>
<p>Ich bin nicht ganz sicher, wann ich weak_ptr und wann shared_ptr benutzen sollte. Was, wenn ich beispielsweise einer Funktion, die irgendwas macht, einen Zeiger übergeben möchte, der in der aufrufenden Funktion als shared_ptr bekannt ist?</p>
<p>Quasi so:</p>
<pre><code class="language-cpp">class Test{};

typedef shared_ptr&lt;Test&gt; TestPtrSh;
typedef weak_ptr&lt;Test&gt;   TestPtrWe;

void foo(/* welcher ptr? */ obj)
{
// mache etwas mit obj
}

int main()
{
TestPtrSh obj;
foo(obj);
return 0;
}
</code></pre>
<p>shared_ptr hat ja anscheinend schon ein bisschen zu tun, zählt intern Referenzen mit etc. Wenn ich da bei jedem Funktionsaufruf eine Instanz erstellen und danach zerstören lassen würde, wäre das evtl. Overhead, daher macht da für mich der weak_ptr mehr Sinn, oder?</p>
<ol start="3">
<li></li>
</ol>
<p>Wie nennt ihr eure typedefs, wenn ihr shared_- und weak_ptr nutzt? <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>Danke und Grüße!</p>
</blockquote>
<p>ad 1) Nicht grundsätzlich. Erstens gibt es Fälle, wo sich der Aufwand nicht<br />
lohnt, weil sich z.B. alles innerhalb einer übersichtlichen Funktion abspielt.<br />
Zweitens ist der Overhead zwar meistens vernachlässigbar, aber eben nicht<br />
immer: Ich habe bei geometrischen Algorithmen häufig Millionen kleiner<br />
Objekte, und da spürt man den Einsatz von shared Pointern ganz deutlich in<br />
der Laufzeit.</p>
<p>ad 2) Du verwendest Boost? Ist gut dokumentiert. In Deinem Fall ist ein<br />
shared Pointer gut.</p>
<p>ad 3) Ein Pointer auf ein Triangle heißt bei mir pTriangle. Welche<br />
Pointertype ich dafür einsetze, brauche ich nicht im Namen zu hinterlegen,<br />
das weiß ich für die Fälle, wo ich es mache.</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954275</guid><dc:creator><![CDATA[gcc]]></dc:creator><pubDate>Sun, 19 Sep 2010 08:42:31 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Sun, 19 Sep 2010 10:15:41 GMT]]></title><description><![CDATA[<p>Zu 1)<br />
Ich würde sagen, dass bei mir <code>shared_ptr</code> die Ausnahme darstellt und nicht umgekehrt. <code>shared_ptr</code> kommt nur dort zum Einsatz, wo die Besitzverhältnisse nicht ganz klar sind.</p>
<p>Zu 2)<br />
Kommt ganz auf die Situation an. Wenn du in <code>foo</code> allerdings mit dem Objekt arbeiten willst, kommst du um den <code>shared_ptr</code> nicht herum. Dazu kannst du mal die Dokumentation von Boost lesen.</p>
<p>Zu 3)<br />
Kommt ganz auf die Situation und Bibliothek an. Von Pointer über Iterator bis hin zu Handle ist alles möglich.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954293</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 19 Sep 2010 10:15:41 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Sun, 19 Sep 2010 10:54:32 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Okay. Also vorweg, ich benutze boost. Eigentlich möchte ich ja von der automatischen Deallokation profitieren. Mein Lieblingsfall ist halt die Map auf Zeiger eines Objektes, bei der ich im dtor normalerweise durchiterieren und jedes Element mit delete zerstören müsste. Hier freue ich mich, wenn das automatisch geschieht. Im boost-Beispiel wird für einen STL-Container der shared_ptr für solche Fälle genutzt.</p>
<p>Jetzt weiß ich so viel, dass scoped_ptr non-copyable ist und daher einfach der Inhalt dahinter deleted wird, wenn der Scope aus ist. shared_ptr ist halt copyable. und weak_ptr... Anscheinend nur, wenn man den gerade Mal weiterreichen will, weil Zugriff ja auch nur über shared_ptr-Nutzung geht.</p>
<p>Für mich heißt das aber, dass ich quasi überall, wo ich im ctor einer eigenen Klasse ein Objekt auf dem Heap erstellen und im dtor zerstören würde, jetzt einen Smartptr einsetze. Meistens reicht wohl der scoped_ptr.</p>
<p>Ok, ich laber zu viel, freue mich halt immer, wenn jemand meine Missverständnisse aufdeckt.</p>
<p>Aber dann hier so paar Fragen:</p>
<ol>
<li>Brauche ich shared_ptr für STL-Container, weil die da intern mit rumkopieren könnten oder reicht scoped_ptr?</li>
<li>Häufiger Fall ist ja, dass ich eine Klasse habe, die wiederum Klassenobjekte als Attribute hält. Die werden aber nicht selten dynamisch erstellt/gelöscht. Da würde ich dann schon gerne smart_ptr nehmen, weil ansonsten der dtor alles selbst deleten muss. Ist das ein gutes Beispiel für einen Smartptr oder kommt's auch hier drauf an?</li>
<li>Wenn Performance keine Rolle spielt, was spricht dann gg. smartptr statt normalen Zeigern? Ich würde eigentlich erstere mit meinem Wissensstand immer bevorzugen wg. Exception-Safety und auch um Tippaufwand (delete ...) zu sparen.</li>
</ol>
<p>Doku hab ich mir schon durch gelesen, bin durch die Eigenschaften der verschiedenen Pointer aber leider nicht in der Lage zu sagen, wo smartptr ggü. normalem Zeiger besser ist, außer wenn es Mal performacekritisch wird. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954302</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sun, 19 Sep 2010 10:54:32 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Sun, 19 Sep 2010 11:08:56 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Häufiger Fall ist ja, dass ich eine Klasse habe, die wiederum Klassenobjekte als Attribute hält. Die werden aber nicht selten dynamisch erstellt/gelöscht.</p>
</blockquote>
<p>Eisflamme schrieb:</p>
<blockquote>
<ol start="3">
<li>Wenn Performance keine Rolle spielt, was spricht dann gg. smartptr statt normalen Zeigern? Ich würde eigentlich erstere mit meinem Wissensstand immer bevorzugen wg. Exception-Safety und auch um Tippaufwand (delete ...) zu sparen.</li>
</ol>
</blockquote>
<p>Willst Du schönes C++ betreiben, dann meide smart pointers. Du hattest zum Beispiel Conatiner mit Löschverantwortung genannt, das ist dann Sache des Containers, vielleicht boost::ptr_map, aber boost ist nicht verpflichtend. Objekte in Objekten brauchen gar keine Zeiger (du kennst Initialisiererlisten).<br />
Was Du da anstrebst, ist nicht mehr C++. Wieso nimmst Du nicht Java oder C#? Da klappt alles, was Du Dir heute wünscht, und wirst erst viel später auf Probleme knallen, die Du in C++ nicht hättest. Wenn Du Java/C# innerhalb von C++ simulierst, wirst Du zuerst viele Probleme mit der Simulation haben und viel Lernzeit verlieren, und später, wenn die Simulation einigermaßen läuft, auf die Java/C#-Probleme.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954311</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 19 Sep 2010 11:08:56 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Sun, 19 Sep 2010 11:19:05 GMT]]></title><description><![CDATA[<p>Ich bin sehr an schönem C++ interessiert und auch kein großer Java/C#-Fan. <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="😉"
    /> Deswegen frage ich hier ja nach, wann ich einen normalen Zeigern und wann Smartptr verwenden soll. Viele hier, bei denen ich davon ausgehe, sie seien stilstarke Programmierer, nutzen doch Smartptr und boost bietet das ja vermutlich auch nicht zum Spaß an.</p>
<p>Wann sollte ich denn jetzt was nutzen?</p>
<p>Und ich nutze nicht grundsätzlich Zeiger, wenn nicht nötig, aber einfaches Beispiel: Ich habe einen Renderer, bei welchem man 3D-Modelle zum Rendern &quot;anmelden&quot; kann. Diese geraten dadurch in den Renderzyklus. Wenn ein Objekt nicht mehr in dem Container des Renderers ist, ist es aber nicht erwünscht, dass es zerstört wird, also ist das nicht der typische RAII-Fall.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954313</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sun, 19 Sep 2010 11:19:05 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Sun, 19 Sep 2010 11:26:48 GMT]]></title><description><![CDATA[<p>Ich würde sagen, das wichtigste ist, überhaupt pointers zu vermeiden. Wenn das nicht geht, sind smart pointers wohl sehr oft besser als rohe Zeiger. Außer manchmal, wenn wie bei ptrmap noch angemessener ist.</p>
<blockquote>
<p>Und ich nutze nicht grundsätzlich Zeiger, wenn nicht nötig, aber einfaches Beispiel: Ich habe einen Renderer, bei welchem man 3D-Modelle zum Rendern &quot;anmelden&quot; kann. Diese geraten dadurch in den Renderzyklus. Wenn ein Objekt nicht mehr in dem Container des Renderers ist, ist es aber nicht erwünscht, dass es zerstört wird, also ist das nicht der typische RAII-Fall.</p>
</blockquote>
<p>Das wäre wohl einer der Fälle, wo rohe Zeiger mal besser als smart pointer sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954321</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 19 Sep 2010 11:26:48 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Sun, 19 Sep 2010 11:32:37 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Wann sollte ich denn jetzt was nutzen?</p>
</blockquote>
<p>Den Smart Pointer, den ich am meisten benutzt ist wohl <code>scoped_ptr</code> oder selbst <code>std::auto_ptr</code> . Den shared Pointer benutze ich so gut, wie gar nie. Die verwaltenden Container von boost hingegen benutze ich immer mal wieder gerne.<br />
Normale Zeiger benutze ich überall dort, wo ich nichts mit Speicher zu tun habe, die nullbarkeit aber brauche (optionale Funktionalität z.B), ansonsten nehme ich Referenzen.</p>
<blockquote>
<p>Und ich nutze nicht grundsätzlich Zeiger, wenn nicht nötig, aber einfaches Beispiel: Ich habe einen Renderer, bei welchem man 3D-Modelle zum Rendern &quot;anmelden&quot; kann. Diese geraten dadurch in den Renderzyklus. Wenn ein Objekt nicht mehr in dem Container des Renderers ist, ist es aber nicht erwünscht, dass es zerstört wird, also ist das nicht der typische RAII-Fall.</p>
</blockquote>
<p>Naja. Was bringt es dir, wenn du ein Objekt hast, welches nicht zerstört ist, aber auf das du nicht mehr zugreifen kannst? - Wenn es das wäre, dann hast du ja noch irgendwo einen Zeiger darauf und das Objekt wird nicht zerstört, wenn du es aus dem Container entfernst, sondern der Referenzzähler wird dann einfach um eins nach unten gehen.</p>
<p>//Edit<br />
Obwohl ich eine Möglichkeit für den Renderer mit Smart Pointer genannt habe, unterstütze ich die Meinung von volkard hier keine Smart Pointer einzusetzen. Der Container hat ja nichts mit dem Speicher zu tun. Der Aufrufer muss einfach dafür sorgen, dass das Objekt genug lange lebt, dass es da keine Probleme gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954322</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 19 Sep 2010 11:32:37 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Sun, 19 Sep 2010 12:20:54 GMT]]></title><description><![CDATA[<p>Wollte gerade nachfragen, wie ich das Problem denn mit smart_ptr überhaupt lösen könnte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Aber ok, hab den Punkt. Ich überdenke Mal meinen Aufbau nochmal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954337</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sun, 19 Sep 2010 12:20:54 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Sun, 19 Sep 2010 14:13:53 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Nutzt ihr Smartpointer anstatt von jedem Zeiger oder fallen euch Ausnahmen ein?</p>
</blockquote>
<p>Nein, höchstens vor besitzenden Zeigern. Für passive Verweise reichen rohe Zeiger oder Referenzen meistens.</p>
<p>Eisflamme schrieb:</p>
<blockquote>
<p>Ich bin nicht ganz sicher, wann ich weak_ptr und wann shared_ptr benutzen sollte. Was, wenn ich beispielsweise einer Funktion, die irgendwas macht, einen Zeiger übergeben möchte, der in der aufrufenden Funktion als shared_ptr bekannt ist?</p>
</blockquote>
<p>Zwei Dinge sind mir bisher etwas negativ aufgefallen:</p>
<ul>
<li><code>shared_ptr</code> wird oft überbewertet, und deshalb auch oft aus Faulheit missbraucht. Wie volkard z.B. erwähnt hat, solltest du z.B. lieber Pointer-Container statt Container mit <code>shared_ptr</code> verwenden. Und für lokale RAII-Zeiger nimmst du <code>scoped_ptr</code> . Oder fürs Transferieren von Besitz <code>auto_ptr</code> . Oder für die Übergabe an Funktionen normale Zeiger oder Referenzen, wenn die Quelle gültig bleibt. <code>shared_ptr</code> benötigst du nur, wenn du wirklich geteilte Besitzverhältnisse hast. Und <code>weak_ptr</code> , wenn du Zeiger haben willst, die das Objekt nicht am Leben erhalten.</li>
<li>Es gibt ein paar bekannte Smart-Pointer (siehe Punkt 1), doch keiner davon hat Kopiersemantik. Merkwürdigerweise scheinen das auch nur wenige Leute zu benötigen, oder die meisten stricken es von Hand nach. Ein Einsatzbereich ist zum Beispiel das Pimpl-Idiom, doch auf der <a href="http://www.boost.org/doc/libs/1_44_0/libs/smart_ptr/shared_ptr.htm" rel="nofollow">Boost-Seite</a> empfehlen sie dafür tatsächlich <code>shared_ptr</code> . <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="🙄"
    /></li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/1954372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954372</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 19 Sep 2010 14:13:53 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Mon, 20 Sep 2010 08:25:08 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Nutzt ihr Smartpointer anstatt von jedem Zeiger oder fallen euch Ausnahmen ein?</p>
</blockquote>
<p>Ja, bei besitzenden Zeigern, es sei den ich verwende eine Datenstruktur die Zeiger entsprechend behandelt (wie z.B. die Pointercontainer von Boost). Wobei ich nach Möglichkeit die &quot;billigen&quot; Smartpointer wie boost::scoped_ptr verwende, und die &quot;teuren&quot; wie shared_ptr/weak_ptr nur wenn nötig.</p>
<p>Eisflamme schrieb:</p>
<blockquote>
<p>Wie nennt ihr eure typedefs, wenn ihr shared_- und weak_ptr nutzt? <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>
</blockquote>
<p>Ich benutze kaum typedefs, es sei den die Konstrukte werden wirklich lang (und für ein boost::scoped_ptr&lt;Typ&gt; würde ich noch kein typedef verwenden).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954626</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 20 Sep 2010 08:25:08 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Mon, 20 Sep 2010 10:11:12 GMT]]></title><description><![CDATA[<p>Noch zwei Fragen:</p>
<ol>
<li></li>
</ol>
<p>Anderer Fall ist, wenn ich Factory-Zeug nutze (siehe anderer Thread mit &quot;dickem ctor&quot; und so), dann erhalte ich zwangsläufig ja auch einen Zeiger, den ich irgendwo speichern muss.</p>
<p>Dann wäre doch ein scoped_ptr ganz nett. Aber da der normalerweise direkt initialisiert werden muss, was mit meiner Factory nicht geht, würde das dann ja quasi so ablaufen:</p>
<pre><code class="language-cpp">class Model;
class Application{
private:
scoped_ptr&lt;Model&gt; model_;
public:
Application();
};

// in Application.cpp:
Application::Application()
{
model_.reset(Factory.CreateModel());
}
</code></pre>
<p>Jetzt wirkt es für mich irgendwie etwas unnatürlich, dieses reset. Kann auch Blödsinn sein, aber so würde ich das dann doch machen. Ist das in euren Augen jetzt schlecht, das so zu lösen? Was spricht gegen den scoped_ptr an dieser Stelle und dafür, das model_ selbst im dtor zu deleten?</p>
<ol start="2">
<li></li>
</ol>
<p>Ne ganz andere Frage, die jetzt so an das geht, was volkard von wegen Zeiger vermeiden sagt:<br />
Was mache ich denn bei Containern? push_back nutzt bei nem vector ja z.B. einen copy-ctor, oder? Was, wenn ich den für mein Objekt eigentlich sperren lassen möchte, weil er keinen Sinn ergibt?<br />
Oder ich möchte ein performantes Einfügen in den vector gestatten. Wenn ich bei meinem Model die ganzen Modelldaten kopiere, ist das ein extremer Overhead, den ich bei der Arbeit mit Zeigern nicht hätte.</p>
<p>Auch wenn ich jetzt wahrscheinlich wieder C++ im Ganzen missverstehe, freue ich mich auf eure Hilfe. <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/1954688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954688</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Mon, 20 Sep 2010 10:11:12 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Mon, 20 Sep 2010 10:18:45 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<ol start="2">
<li></li>
</ol>
<p>Ne ganz andere Frage, die jetzt so an das geht, was volkard von wegen Zeiger vermeiden sagt:<br />
Was mache ich denn bei Containern? push_back nutzt bei nem vector ja z.B. einen copy-ctor, oder? Was, wenn ich den für mein Objekt eigentlich sperren lassen möchte, weil er keinen Sinn ergibt?</p>
</blockquote>
<p>Heute Zeiger, morgen zunehmend emplace_back. Auf keinen Fall unnötige Standardkonstruktoren oder gar Kopierkonstruktoren machen; dann täten Zeiger weniger weh.</p>
<blockquote>
<p>Oder ich möchte ein performantes Einfügen in den vector gestatten. Wenn ich bei meinem Model die ganzen Modelldaten kopiere, ist das ein extremer Overhead, den ich bei der Arbeit mit Zeigern nicht hätte.</p>
</blockquote>
<p>Extremes Kopieren von Vector? Naja, manchmal zwei Kopierungen pro Einfügung. Aber vielleicht ruckelig. Große Objekte vielleicht lieber mit verketteten Listen verwalten.<br />
Aber Modelle riechen für mich recht stark nach Zeigern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954695</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 20 Sep 2010 10:18:45 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Mon, 20 Sep 2010 10:25:44 GMT]]></title><description><![CDATA[<p>In der ganzen 3D-Umgebung habe ich halt viel mit so dicken Datenobjekten zu tun. Da gibt es z.B. auch Texturen oder intensive Materialsachen.</p>
<p>Das würdest Du alles mit rohen Zeigern basteln? Oder bieten sich bei Maps dann so diese boost::ptr_map an oder was das ist (ich schaue mir das auch nochmal an demnächst)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954701</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Mon, 20 Sep 2010 10:25:44 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Mon, 20 Sep 2010 12:52:36 GMT]]></title><description><![CDATA[<p>Wenn du zum Beispiel die Ressourcen zu Beginn des Programms durch einen Ressourcen Manager laden lässt und dieser am Ende des Programmes die Ressourcen wieder freigibt, wieso sollte man da nicht normale Zeiger verwenden?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954781</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 20 Sep 2010 12:52:36 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Mon, 20 Sep 2010 13:36:04 GMT]]></title><description><![CDATA[<p>Dann kapier ich nicht, was scoped_ptr und shared_ptr überhaupt sollen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Wenn das irgendwo steht und ich's überlesen hab, reicht mir auch der Hinweis, so ist's nicht!</p>
<p>In der Boost-Lib. steht, dass Smartptr fast wie normale Pointer sind, nur automatisch den Speicher freigeben. Also hätte ich die jetzt genommen, wenn es umständlich ist (wie bei ner map, wo man alle Elemente durchgehen muss, um alles zu löschen, na ja).</p>
<p>shared_ptr nutzt jetzt aus, wenn der Zeiger von verschiedenen Leuten genutzt wird ohne dass Verantwortlichkeiten klar sind, das kann in Einzelfällen Mal sein, gut. Aber scoped_ptr dürfte ich dann ja nach deiner Logik nicht verwenden, denn der wird am Ende seines Blocks zerstört. Wenn Block == Klasse, ist der dtor verantwortlich. Wenn Block &lt; Klasse, greift ja wieder die Aussage von irgendwo hier im Thread, dass man die Übersichtlichkeit hat und es daher doch selbst machen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954794</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Mon, 20 Sep 2010 13:36:04 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Mon, 20 Sep 2010 15:31:57 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Dann kapier ich nicht, was scoped_ptr und shared_ptr überhaupt sollen.</p>
</blockquote>
<p>scoped_ptr ist immer dann gut, wenn man lokal Objekte auf den Heap erzeugen muss (z.B. weil eine Bibliothek nicht mit Stackvariablen klar kommt). Dieser Smartpointer ist bei mir auch der mit Abstand am häufigsten verwendete. shared_ptr/weak_ptr ist genau dann sinnvoll, wenn ein Objekt a) von vielen Anderen gleichzeitig verwendet werden muss, und b) keine zentrale Zerstörung möglich ist.</p>
<p>Sobald die Objekthaltung aber an einer Stelle erfolgen kann (was ich eher für die Regel halte), sollte man shared_ptr nicht verwenden.</p>
<p>Eisflamme schrieb:</p>
<blockquote>
<p>In der Boost-Lib. steht, dass Smartptr fast wie normale Pointer sind, nur automatisch den Speicher freigeben.</p>
</blockquote>
<p>Im Grundsatz stimmt dies auch, nur kann, je nach Smartpointer, der Verwaltungsaufwand recht hoch sein. Sofern man entweder auf Zeiger verzichten kann, oder wenn es möglich ist, die Erzeugung und Zerstörung an einer Stelle halten, sollte man sich eher auf Objekte, ptr_container oder billige Smartpointer beschränken.</p>
<p>Eisflamme schrieb:</p>
<blockquote>
<p>Also hätte ich die jetzt genommen, wenn es umständlich ist (wie bei ner map, wo man alle Elemente durchgehen muss, um alles zu löschen, na ja).</p>
</blockquote>
<p>Die prt_container machen eben dies von Haus aus, ohne eine Referenzzählung durchzuführen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954876</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 20 Sep 2010 15:31:57 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Mon, 20 Sep 2010 16:34:28 GMT]]></title><description><![CDATA[<p>Ich hoffe ich hijacke jetzt nicht den Thread, aber ich hab ne Frage dazu. Mir sind shared_ptr etc relativ unbekannt und ich brauch mal nen mehr praktisches Beispiel in einfacheren Worten.<br />
Folgende Situation:</p>
<p>Ich verwende in einem Spiel relativ viele Listen mit Zeigern auf Objekte. Die jeweiligen Klassen übernehmen den Besitz dieser Objekte wie Quads etc. Demnach muss ich die Listen auch jedesmal im Destruktor durchlaufen und die Objekte mit delete löschen, damit es keine Lecks im Speicher gibt. Allerdings sollen andere Klassen oder die Hauptroutine von diesen Objekten jeweils Zeiger erhalten bei Events wie Kollissionen etc.<br />
Mir gehts hauptsächlich darum, dass am Ende des Programnmes oder wenn die Klasse die die Liste führt zerstört wird, der std::vector oder std::list aufgeräumt wird ohne dass ich das manuell machen muss (bzw die Objekte die darin leben).<br />
Welcher Container wäre hier der richtige?<br />
std::auto_ptr()?</p>
<p>rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954899</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Mon, 20 Sep 2010 16:34:28 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Tue, 21 Sep 2010 00:12:18 GMT]]></title><description><![CDATA[<p>Ok, das meiste habe ich jetzt verstanden, aber zum scoped_ptr bin ich immer noch nicht sicher:</p>
<blockquote>
<p>scoped_ptr ist immer dann gut, wenn man lokal Objekte auf den Heap erzeugen muss (z.B. weil eine Bibliothek nicht mit Stackvariablen klar kommt).</p>
</blockquote>
<ol>
<li>
<p>Lokal heisst innerhalb einer meiner Funktionen? Wo am Anfang das new steht und am Ende das delete? Das ist fuer mich per se aber dann auch kein Argument, es sei denn, man ist sich ueber das Exceptionverhalten der aufgerufenen Bibliotheksfunktion nicht sicher... aber das sollte man imo sowieso immer sein, oder?</p>
</li>
<li>
<p>Das mit den geteilten Verantwortlichkeiten verstehe ich eigentlich auch nicht mehr so ganz. Ich wuerde fast immer dafuer sorgen, dass irgend ein Objekt eben die Hauptverantwortlichkeit traegt, sonst fliegt ein Zeiger ja irgendwie random im Raum rum. Hat jemand dafuer ein Beispiel?</p>
</li>
<li>
<p>Ist es dann ratsam immer die ptr-Container zu nehmen, wenn ich einen Container mit Objektzeigern (wie bei meinem Model) nutze? Oder gibt es auch hier nicht auf den ersten Blick ersichtliche Nachteile?</p>
</li>
</ol>
<p>Snorcher24:<br />
auto_ptr ist ja kein Container. Und ohne deine Frage damit komplett zu beantworten, tut es diese Seite aber zumindest zum Grossteil: <a href="http://www.boost.org/doc/libs/1_44_0/libs/ptr_container/doc/ptr_container.html" rel="nofollow">http://www.boost.org/doc/libs/1_44_0/libs/ptr_container/doc/ptr_container.html</a> <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="🙂"
    /> Sieht nett aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955075</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Tue, 21 Sep 2010 00:12:18 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Tue, 21 Sep 2010 01:12:41 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Ok, das meiste habe ich jetzt verstanden, aber zum scoped_ptr bin ich immer noch nicht sicher:</p>
<blockquote>
<p>scoped_ptr ist immer dann gut, wenn man lokal Objekte auf den Heap erzeugen muss (z.B. weil eine Bibliothek nicht mit Stackvariablen klar kommt).</p>
</blockquote>
<ol>
<li>
<p>Lokal heisst innerhalb einer meiner Funktionen? Wo am Anfang das new steht und am Ende das delete? Das ist fuer mich per se aber dann auch kein Argument, es sei denn, man ist sich ueber das Exceptionverhalten der aufgerufenen Bibliotheksfunktion nicht sicher... aber das sollte man imo sowieso immer sein, oder?</p>
</li>
<li>
<p>Das mit den geteilten Verantwortlichkeiten verstehe ich eigentlich auch nicht mehr so ganz. Ich wuerde fast immer dafuer sorgen, dass irgend ein Objekt eben die Hauptverantwortlichkeit traegt, sonst fliegt ein Zeiger ja irgendwie random im Raum rum. Hat jemand dafuer ein Beispiel?</p>
</li>
<li>
<p>Ist es dann ratsam immer die ptr-Container zu nehmen, wenn ich einen Container mit Objektzeigern (wie bei meinem Model) nutze? Oder gibt es auch hier nicht auf den ersten Blick ersichtliche Nachteile?</p>
</li>
</ol>
<p>Snorcher24:<br />
auto_ptr ist ja kein Container. Und ohne deine Frage damit komplett zu beantworten, tut es diese Seite aber zumindest zum Grossteil: <a href="http://www.boost.org/doc/libs/1_44_0/libs/ptr_container/doc/ptr_container.html" rel="nofollow">http://www.boost.org/doc/libs/1_44_0/libs/ptr_container/doc/ptr_container.html</a> <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="🙂"
    /> Sieht nett aus.</p>
</blockquote>
<p>Jau, hab mich für boost::ptr_vector entschieden <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 />
Danke trotzdem<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955081</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Tue, 21 Sep 2010 01:12:41 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Tue, 21 Sep 2010 02:05:34 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<ol>
<li></li>
</ol>
<p>Nutzt ihr Smartpointer anstatt von jedem Zeiger oder fallen euch Ausnahmen ein?</p>
</blockquote>
<p>Ich nutze fast ausschliesslich Smart-Pointer. Wobei Smart-Pointer jetzt nicht automatisch shared_ptr bedeutet. scoped_ptr ist auch ein Smart-Pointer, sogar der konzeptionell fragwürdige auto_ptr ist ein Smart-Pointer. Interessant dass die Anti-shared_ptr Fraktion das wiedermal total ignoriert hat <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>
<p>Ausnahmen gibt es aber natürlich. z.B. wenn man Zeiger als schnelle Iteratoren über Arrays verwendet. Als Beispiel fallen mir ein: Software-Rendering, Low-Level String-Manipulation, Parser etc.</p>
<p>Wo ich kann versuche ich allerdings ganz auf Zeiger zu verzichten, seien sie nun &quot;smart&quot; oder nicht. z.B. indem ich Referenzen statt Zeigern übergebe.</p>
<blockquote>
<ol start="2">
<li></li>
</ol>
<p>Ich bin nicht ganz sicher, wann ich weak_ptr und wann shared_ptr benutzen sollte.</p>
</blockquote>
<p>weak_ptr verwende ich fast nur um Zyklen aufzubrechen. Ganz ganz selten mal ohne dass es zu Zyklen kommen könnte, wenn z.B. ein Objekt ein anderes kennen soll, aber dessen Zerstörung nicht verhindern (weil das Objekt z.B. viel Resourcen verschlingt). Solche Fälle sind allerdings selten, und lassen sich dann auch oft eleganter lösen.</p>
<blockquote>
<p>Was, wenn ich beispielsweise einer Funktion, die irgendwas macht, einen Zeiger übergeben möchte, der in der aufrufenden Funktion als shared_ptr bekannt ist?</p>
</blockquote>
<p>Kommt drauf an.<br />
Wenn die Funktion nicht &quot;shared ownership&quot; übernehmen muss, dann musst du keinen shared_ptr übergeben, es reicht eine Referenz.<br />
Wenn die Funktion &quot;shared ownership&quot; übernehmen darf, dann übergibt einen &quot;shared_ptr const&amp;&quot;. weak_ptr macht IMO gar keinen Sinn.</p>
<blockquote>
<p>shared_ptr hat ja anscheinend schon ein bisschen zu tun, zählt intern Referenzen mit etc. Wenn ich da bei jedem Funktionsaufruf eine Instanz erstellen und danach zerstören lassen würde, wäre das evtl. Overhead, daher macht da für mich der weak_ptr mehr Sinn, oder?</p>
</blockquote>
<p>weak_ptr hat gleich viel oder mehr Overhead. Du musst ja den weak_ptr erstmal locken bevor du ihn verwenden kannst. Dabei entsteht ein shared_ptr. Der muss auch irgendwie konstruiert und wieder zerstört werden.<br />
Entweder du übergibst wie schon erwähnt eine Referenz, oder eine (const) Referenz auf den shared_ptr, oder ggf. noch einen rohen Pointer (macht IMO nur Sinn wenn der Zeiger null sein darf).</p>
<p>BTW: der Referenz-Zähler wird - sofern die Boost mit Threading-Support konfiguriert ist - atomar inkrementiert und dekrementiert (-&gt; Interlocked Instructions). 1x shared_ptr kopieren und gleich wieder zerstören kann da gleich mal 100+ Zyklen brauchen, auch wenn alles Inline erweitert wird. Und die meisten Compiler können Interlocked-Aufrufe auch nicht wegoptimieren, was die Sache doppelt schlimm macht <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>
<blockquote>
<ol start="3">
<li></li>
</ol>
<p>Wie nennt ihr eure typedefs, wenn ihr shared_- und weak_ptr nutzt? <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>
</blockquote>
<p>Ich verwende meist gar keine typedefs.<br />
Dort wo sie in unseren Projekten verwendet werden, heissen sie</p>
<pre><code class="language-cpp">typederf boost::shared_ptr&lt;Type&gt; TypePtr;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1955087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955087</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 21 Sep 2010 02:05:34 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Smartptr on Tue, 21 Sep 2010 08:20:06 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<ol>
<li>Lokal heisst innerhalb einer meiner Funktionen? Wo am Anfang das new steht und am Ende das delete? Das ist fuer mich per se aber dann auch kein Argument, es sei denn, man ist sich ueber das Exceptionverhalten der aufgerufenen Bibliotheksfunktion nicht sicher... aber das sollte man imo sowieso immer sein, oder?</li>
</ol>
</blockquote>
<p>Grundsätzlich gibt es zum scoped_ptr mehr als ein Argument. Das Exceptionverhalten ist eines davon, das andere ist das man unproblematisch ein return in eine Funktion bauen kann. Ich bin ein Favorit davon Funktionen so früh als möglich zu beenden (ist mir lieber als verschachtelte if-Konstrukte).</p>
<p>Eisflamme schrieb:</p>
<blockquote>
<ol start="2">
<li>Das mit den geteilten Verantwortlichkeiten verstehe ich eigentlich auch nicht mehr so ganz. Ich wuerde fast immer dafuer sorgen, dass irgend ein Objekt eben die Hauptverantwortlichkeit traegt, sonst fliegt ein Zeiger ja irgendwie random im Raum rum. Hat jemand dafuer ein Beispiel?</li>
</ol>
</blockquote>
<p>Wenn du genau das hast: Ein Objekt trägt die Hauptverantwortung, dann sind shared_ptr fehl am Platz und ptr-Container besser.</p>
<p>Ein Beispiel für den Einsatz von einem shared_ptr könnte z.B. sein, wenn zwei nicht modale Masken auf gleiche Daten zugreifen sollen, aber nicht klar ist, welche zuerst geschlossen wird. Wenn beide die Daten per shared_ptr halten, ist sichergestellt, das die Daten erst mit der letzten gelöscht werden.</p>
<p>Eisflamme schrieb:</p>
<blockquote>
<ol start="3">
<li>Ist es dann ratsam immer die ptr-Container zu nehmen, wenn ich einen Container mit Objektzeigern (wie bei meinem Model) nutze? Oder gibt es auch hier nicht auf den ersten Blick ersichtliche Nachteile?</li>
</ol>
</blockquote>
<p>Ich weiß nicht ob das inzwischen geändert wurde (wir haben hier eine ältere Boost-Bibliothek im Einsatz), aber die Schnittstellen der ptr-Container haben sich imho nicht mit allen STL-Konstrukten vertragen (was aber nur selten bei mir zum tragen kam).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955164</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 21 Sep 2010 08:20:06 GMT</pubDate></item></channel></rss>