<?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 Design Frage]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Frage zu &quot;intrusive reference counting&quot;. Ich habe eine Basisklasse Object, von der alle meine Klassen erben. Object besitzt den reference counter sowie die Methoden IncRef() und DecRef(). Der Ctor von Object setzt den reference counter auf 0.</p>
<p>Dann habe ich noch einen Smart Pointer SmartPtr. Der Ctor sieht so aus:</p>
<pre><code class="language-cpp">SmartPtr&lt;T&gt;::SmartPtr(T* t) {
m_ptr = t;
if(t) {
   t-&gt;IncRef();
}
}
</code></pre>
<p>Nun habe ich viele Factorymethoden und ich würde es dem Anwender gerne überlassen, ob er Smart Pointer verwendet oder nicht. Ich wollte meine Factorymethoden eigentlich so designen (hier ein Beispiel mit Foo):</p>
<pre><code class="language-cpp">Foo* createFoo(int i) { 
Foo* p = new Foo(i);
p-&gt;IncRef();   // Ref count == 1
return p;

// Anwendung:
Foo* f = createFoo(2);  // Foo hat ref count == 1
// Benutze foo
f-&gt;DecRef();    // Foo ref count == 0 =&gt; delete
</code></pre>
<p>Sollte so ja klappen. Das Problem ist nun, wenn der Nutzer optional SmartPtr einsetzt:</p>
<pre><code class="language-cpp">SmartPtr p = createFoo(2);
</code></pre>
<p>Nach dieser Zeile hat das Foo object aber einen ref count von 2! Es sollte aber eigentlich einen Ref Count von 1 haben.</p>
<p>Ich könnte nun das IncRef() aus der Factory nehmen, dann hat das gelieferte Foo einen ref counter von 0 und der Einsatz von Smart Pointern klappt dann. Allerdings ist die Benutzung ohne Smart Pointer dann wieder umständlich, weil der Anwender dann explizit nach jedem createFoo() ein IncRef() aufrufen müsste um den Zähler auf 1 zu erhöhen.</p>
<p>Ich hoffe ihr versteht mein Dilemma. Hat wer eine Idee, wie ich das lösen könnte, so dass man die gelieferten Objekte manuell aber auch mit SmartPtr verwenden kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/246045/smartpointer-design-frage</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 06:48:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246045.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 22 Jul 2009 11:47:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to SmartPointer Design Frage on Wed, 22 Jul 2009 11:47:55 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Frage zu &quot;intrusive reference counting&quot;. Ich habe eine Basisklasse Object, von der alle meine Klassen erben. Object besitzt den reference counter sowie die Methoden IncRef() und DecRef(). Der Ctor von Object setzt den reference counter auf 0.</p>
<p>Dann habe ich noch einen Smart Pointer SmartPtr. Der Ctor sieht so aus:</p>
<pre><code class="language-cpp">SmartPtr&lt;T&gt;::SmartPtr(T* t) {
m_ptr = t;
if(t) {
   t-&gt;IncRef();
}
}
</code></pre>
<p>Nun habe ich viele Factorymethoden und ich würde es dem Anwender gerne überlassen, ob er Smart Pointer verwendet oder nicht. Ich wollte meine Factorymethoden eigentlich so designen (hier ein Beispiel mit Foo):</p>
<pre><code class="language-cpp">Foo* createFoo(int i) { 
Foo* p = new Foo(i);
p-&gt;IncRef();   // Ref count == 1
return p;

// Anwendung:
Foo* f = createFoo(2);  // Foo hat ref count == 1
// Benutze foo
f-&gt;DecRef();    // Foo ref count == 0 =&gt; delete
</code></pre>
<p>Sollte so ja klappen. Das Problem ist nun, wenn der Nutzer optional SmartPtr einsetzt:</p>
<pre><code class="language-cpp">SmartPtr p = createFoo(2);
</code></pre>
<p>Nach dieser Zeile hat das Foo object aber einen ref count von 2! Es sollte aber eigentlich einen Ref Count von 1 haben.</p>
<p>Ich könnte nun das IncRef() aus der Factory nehmen, dann hat das gelieferte Foo einen ref counter von 0 und der Einsatz von Smart Pointern klappt dann. Allerdings ist die Benutzung ohne Smart Pointer dann wieder umständlich, weil der Anwender dann explizit nach jedem createFoo() ein IncRef() aufrufen müsste um den Zähler auf 1 zu erhöhen.</p>
<p>Ich hoffe ihr versteht mein Dilemma. Hat wer eine Idee, wie ich das lösen könnte, so dass man die gelieferten Objekte manuell aber auch mit SmartPtr verwenden kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747526</guid><dc:creator><![CDATA[marld]]></dc:creator><pubDate>Wed, 22 Jul 2009 11:47:55 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Wed, 22 Jul 2009 12:19:47 GMT]]></title><description><![CDATA[<p>Ich halte nicht viel von diesem Design. Du bietest von deiner Klasse aus Funktionalitaet an, die im Zusammenhang mit SmartPointern genutzt wird, soll aber auch problemlos ohne benutzt werden koennen.</p>
<p>Wenn du Referencecounting ueber SmartPointer anbietest, dann sollten auch nur diese Referencecounting nutzen (die Faktory sollten den Refcount nicht erhoehen). Desweiteren ... was macht DecRef() wenn der Counter 0 wird. Ich hoffe nicht, das Objekt vernichten. Aus dem Symmetrieprinzip heraus ist nur die Factory fuer das Erzeugen und Vernichten verantwortlich. Also der SmartPointer(oder manuell) sagt factory-&gt;destroy( object* ) und setzt den internen m_ptr = 0. Einen interessanten Abschnitt ueber Symmetrie gab es in der ix 4/2009 zu lesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747559</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 22 Jul 2009 12:19:47 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Wed, 22 Jul 2009 13:25:39 GMT]]></title><description><![CDATA[<p>DecRef() wird definitiv das Objekt zerstören, wenn ref counter == 0 (das ist der Sinn des ganzen reference countings).</p>
<p>Es ist auch keine richtige Factory. Es ist einfach ein Ding, dass Objekte erzeugt. Was mit denen dann passiert ist ihr Wurst (vergleichbar mit den DirectX COM Funktionen wie createDevice(); es gibt da auch kein destroyDevice()).</p>
<p>Wäre das Design am besten, wenn ich also nur noch Smart Pointer zurückgebe?<br />
Also statt dem:</p>
<pre><code class="language-cpp">Foo* createFoo(int i) { 
Foo* p = new Foo(i);
p-&gt;IncRef();   // Ref count == 1
return p; }

// Anwendung:
Foo* f = createFoo(2);  // Foo hat ref count == 1
// Benutze foo
f-&gt;DecRef();    // Foo ref count == 0 =&gt; delete
</code></pre>
<p>Nur noch das:</p>
<pre><code class="language-cpp">SmartPtr&lt;Foo&gt;* createFoo(int i) { 
SmartPtr&lt;Foo&gt;* p = new Foo(i);
return p; }

// Anwendung:
SmartPtr&lt;Foo&gt; f = createFoo(2);  // Foo hat ref count == 1
// Benutze foo
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747606</guid><dc:creator><![CDATA[marld]]></dc:creator><pubDate>Wed, 22 Jul 2009 13:25:39 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Wed, 22 Jul 2009 13:48:58 GMT]]></title><description><![CDATA[<blockquote>
<p>DecRef() wird definitiv das Objekt zerstören, wenn ref counter == 0</p>
</blockquote>
<p>Dann aendere es. Das ist naemlich im Sinne der Symmetrie schlecht.</p>
<blockquote>
<p>Es ist einfach ein Ding, dass Objekte erzeugt. ... vergleichbar mit den DirectX COM</p>
</blockquote>
<p>Also ist es doch eine Faktory! Auch ist mir egal wie Microsoft und COM das macht. Auch scheint es sowas wie Release Device zu geben ... aber ich programmiere kein DirectX.</p>
<blockquote>
<p>Wäre das Design am besten, wenn ich also nur noch Smart Pointer zurückgebe?</p>
</blockquote>
<p>Nein! Sondern so wie ich es beschrieben habe. Methoden fuer Objecterzeugung/-vernichtung und Referencecounting entkoppeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747623</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 22 Jul 2009 13:48:58 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Wed, 22 Jul 2009 13:50:23 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Dann aendere es. Das ist naemlich im Sinne der Symmetrie schlecht.</p>
</blockquote>
<p>Mir ehrlich gesagt ziemlich egal, was du mit deiner blöden Symmetrie hast. Jeder Reference Counting SmartPtr arbeitet so und fertig.</p>
<blockquote>
<p>Also ist es doch eine Faktory! Auch ist mir egal wie Microsoft und COM das macht.</p>
</blockquote>
<p>Mir aber nicht, da ich mit COM arbeite. Außerdem ist eine Objektzerstör Funktion völlig überflüssig, wenn man bereits Ref Counting hat.</p>
<blockquote>
<p>Nein! Sondern so wie ich es beschrieben habe. Methoden fuer Objecterzeugung/-vernichtung und Referencecounting entkoppeln.</p>
</blockquote>
<p>Ich würde gerne noch die Meinung ANDERER User hier hören:)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747628</guid><dc:creator><![CDATA[marld]]></dc:creator><pubDate>Wed, 22 Jul 2009 13:50:23 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Wed, 22 Jul 2009 13:53:52 GMT]]></title><description><![CDATA[<p>Ganz spontan würde ich &quot;createFoo&quot; einen SmartPointer zurückgeben lassen. Oder was spricht dagegen (Reference-Counting ist ja sowieso in den Objekten eingebaut, nicht im Zeiger)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747630</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 22 Jul 2009 13:53:52 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Wed, 22 Jul 2009 14:02:10 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich würde gerne noch die Meinung ANDERER User hier hören:)</p>
</blockquote>
<p>Sorry, das ich dein Design nicht so toll finde, aber wenn du nur fuer dein Design gratuliert werden und nicht ueber Aenderungen nachdenken moechtest, bitte ... Da bin ich wirklich der falsche. Auch verbiete ich hier niemanden den Mund.</p>
<p>Desweiteren:</p>
<pre><code class="language-cpp">pd3dDevice-&gt;Release();
pd3dDevice = NULL;
</code></pre>
<p>Google war mein Freund.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747634</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 22 Jul 2009 14:02:10 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Wed, 22 Jul 2009 14:02:05 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Ganz spontan würde ich &quot;createFoo&quot; einen SmartPointer zurückgeben lassen. Oder was spricht dagegen (Reference-Counting ist ja sowieso in den Objekten eingebaut, nicht im Zeiger)?</p>
</blockquote>
<p>Reference Counting ist bereits in allen Objekten eingebaut ja. Der Smart Pointer würde lediglich das Reference Counting automatisieren (wenn der Smart Pointer den Scope verlässt, ruft er DecRef() auf usw.)</p>
<p>Ich tendiere mittlerweile auch dazu einen SmartPtr zurückzugeben. Der einzige Nachteil wäre eben, dass der Benutzer nicht mehr ganz so elegant auch ohne SmartPtr arbeiten könnte. Wenn er ohne SmartPtr arbeiten will, würde das dann ja quasi so aussehen:</p>
<pre><code class="language-cpp">SmartPtr&lt;Foo&gt; createFoo();

SmatrPtr&lt;Foo&gt; p = createFoo();  // ref count == 1
Foo* f = p.get();               // get() liefert das Objekt, auf das SmartPtr zeigt
f-&gt;IncRef();                    // ref count 2. Wird benötigt, weil ja p DecRef() aufruft, wenn es den Scope verlässt
</code></pre>
<p>Is also möglich, aber halt net ganz sooo schön.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747636</guid><dc:creator><![CDATA[marld]]></dc:creator><pubDate>Wed, 22 Jul 2009 14:02:05 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Wed, 22 Jul 2009 14:03:33 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Desweiteren:</p>
<pre><code class="language-cpp">pd3dDevice-&gt;Release();
pd3dDevice = NULL;
</code></pre>
<p>Google war mein Freund.</p>
</blockquote>
<p>Und inwiefern is das hier relevant?<br />
Release() entspricht 1:1 meinem DecRef(). Es gibt ein createDevice() aber kein destroyDevice().</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747639</guid><dc:creator><![CDATA[marld]]></dc:creator><pubDate>Wed, 22 Jul 2009 14:03:33 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Wed, 22 Jul 2009 14:08:27 GMT]]></title><description><![CDATA[<blockquote>
<p>Und inwiefern is das hier relevant?</p>
</blockquote>
<p>Du hast mir dem Vergleich COM angefangen, nicht ich.</p>
<blockquote>
<p>Jeder Reference Counting SmartPtr arbeitet so und fertig.</p>
</blockquote>
<p>Erstens: Das ist falsch. Mir ging es aber auch nicht um den SmartPointer, der kann ruhig das Objekt vernichten, wenn der Zaehler auf null faellt, DecRef() aber nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747643</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 22 Jul 2009 14:08:27 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Wed, 22 Jul 2009 14:15:04 GMT]]></title><description><![CDATA[<p>[quote=&quot;knivil&quot;]<br />
Du hast mir dem Vergleich COM angefangen, nicht ich./quote]<br />
lol?? Was isn das für eine &quot;Logik&quot;? Du kamst damit an, dass die Factory ein destroy() anbieten soll. Dann habe ich gesagt das ich das nicht so machen will und COM als Beispiel genannt, dass das so macht wie ich auch. Und jetzt zitierst du willkürlich ein COM Code Schnipsel, das nur das zeigt was ich bereits gesagt habe. Omg...</p>
<blockquote>
<p>Mir ging es aber auch nicht um den SmartPointer, der kann ruhig das Objekt vernichten, wenn der Zaehler auf null faellt, DecRef() aber nicht.</p>
</blockquote>
<p>Du hast offenbar noch immer nicht verstanden, dass Reference Counting auch ohne Smart Pointer funktioniert. Siehe COM. Du solltest dir wirklich mal boost::intrusive_ptr anschauen, bevor du hier weiter nervst.</p>
<p>Wie gesagt, über Meinungen ANDERER User freu ich mich dennoch;)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747652</guid><dc:creator><![CDATA[marld]]></dc:creator><pubDate>Wed, 22 Jul 2009 14:15:04 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Wed, 22 Jul 2009 14:16:12 GMT]]></title><description><![CDATA[<p>marld schrieb:</p>
<blockquote>
<p>Ich tendiere mittlerweile auch dazu einen SmartPtr zurückzugeben. Der einzige Nachteil wäre eben, dass der Benutzer nicht mehr ganz so elegant auch ohne SmartPtr arbeiten könnte.</p>
</blockquote>
<p>Er kann ja so oder so nicht ohne SmartPtr arbeiten, da Reference-Counting und Creation/Deletion ja verschmolzen sind (das ist eigentlich nicht sonderlich schön, da muss ich knivil absolut zustimmen).<br />
Ich würde jedenfalls entweder voll auf SmartPtr setzen oder die beiden Konzepte entkoppeln. Ein Zwischending funktioniert imho nicht gut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747655</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 22 Jul 2009 14:16:12 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Wed, 22 Jul 2009 14:20:03 GMT]]></title><description><![CDATA[<p>Wo ist das denn bitte verschmolzen? Der Benutzer kann vollständig ohne SmartPtr arbeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747662</guid><dc:creator><![CDATA[marld]]></dc:creator><pubDate>Wed, 22 Jul 2009 14:20:03 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Wed, 22 Jul 2009 14:22:34 GMT]]></title><description><![CDATA[<p>marld schrieb:</p>
<blockquote>
<p>Wo ist das denn bitte verschmolzen? Der Benutzer kann vollständig ohne SmartPtr arbeiten.</p>
</blockquote>
<pre><code class="language-cpp">Foo* f = createFoo(2);  // Foo hat ref count == 1
// Benutze foo
f-&gt;DecRef();    // Foo ref count == 0 =&gt; delete
</code></pre>
<p>Das DecRef ist doch ein SmartPtr-Ding. Ohne SmartPtr sähe es so aus:</p>
<pre><code class="language-cpp">Foo* f = createFoo(2);  // Foo hat ref count von &quot;undefiniert&quot;
// Benutze foo
destroyFoo( f );
</code></pre>
<p>Und konsequent mit SmartPtr so:</p>
<pre><code class="language-cpp">SmartPtr&lt;Foo&gt; f = createFoo();
// Benutze foo
// Hier wird automatisch abgeräumt
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1747665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747665</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 22 Jul 2009 14:22:34 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Wed, 22 Jul 2009 14:29:24 GMT]]></title><description><![CDATA[<p>marld schrieb:</p>
<blockquote>
<p>Wo ist das denn bitte verschmolzen? Der Benutzer kann vollständig ohne SmartPtr arbeiten.</p>
</blockquote>
<p>dann halt intrisive. wenn die klasse die intrusion über sich ergehen ließ, dann soll die factory auch einen smart pointer zurückgeben und nichts anderes. der empfänger des smart pointers und besitzer des objekts kann dann immernoch entscheiden, daß er an seine diener rohe zeiger verschickt, weil er eh der besitzer bleiben will.<br />
normalerweise werden eh nur klassen smartpointerbefähigt, die vermutlich herumgeschubst werden, wie netzwerkpakete oder tokens oder jobs.<br />
außerdem ist ja noch das</p>
<pre><code class="language-cpp">Packet* packet=factory.create();//kein smart pointer, ich bin ein berliner tor
foo(); //dadrin passiert ein throw
//speicherloch
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1747668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747668</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 22 Jul 2009 14:29:24 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Wed, 22 Jul 2009 14:29:53 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Das DecRef ist doch ein SmartPtr-Ding.</p>
</blockquote>
<p>Nein, eben nicht! DecRef() und IncRef() sind lediglich 2 Methoden, die eine Oberklasse Object anbietet, von der alle Klassen ableiten. Das hat NICHTS mit einem Smart Pointer zu tun!</p>
<p>volkard schrieb:</p>
<blockquote>
<p>dann halt intrisive. wenn die klasse die intrusion über sich ergehen ließ, dann soll die factory auch einen smart pointer zurückgeben und nichts anderes</p>
</blockquote>
<p>Japp, so werd ichs jetzt auch machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747677</guid><dc:creator><![CDATA[marld]]></dc:creator><pubDate>Wed, 22 Jul 2009 14:29:53 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Wed, 22 Jul 2009 14:31:36 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Foo* createFoo(int i) { 
   Foo* p = new Foo(i); 
   p-&gt;IncRef();   // Ref count == 1 
   return p; 
}

// Anwendung: 
Foo* f = createFoo(2);  // Foo hat ref count == 1 
// Benutze foo 
f-&gt;DecRef();    // Foo ref count == 0 =&gt; delete
</code></pre>
<p>Dafür refCounting ist doch echt nicht nötig...<br />
Foo produziert immer neue Objekte, also eine nicht denkende, blöde factory.<br />
Diese werden dann benutzt. Werden die auch irgendwie weitergegeben? Also im Kontext einer Klasse per getter angeboten? Dann macht ReferenceCounting schon Sinn. Ansonsten ist es nur unnötiger Ballast, und hat mMn nix in der Klasse selber zu suchen.<br />
Außerdem, wenn RefCounting, dann automatisiert. Wenn ein Benutzer deiner Klasse(n) vergisst, die per createFoo erzeugten Objekte per DecRef() freizugeben, oder am Ende meint &quot;Ich hab Pointer, weg damit -&gt; delete foo;&quot;, hast du ziemlichen Stress. Memleaks oder SegFault.</p>
<p>Darum würde ich den RefCounter aus dem Objekt rausnehmen und entweder nur Pointer produzieren, und dem User das freigeben überlassen, oder eben gleich nen SmartPointer zurückgeben.</p>
<p>Ich tendiere eher zu normalen Pointern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747681</guid><dc:creator><![CDATA[knödl0r]]></dc:creator><pubDate>Wed, 22 Jul 2009 14:31:36 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Thu, 23 Jul 2009 09:31:40 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">f-&gt;DecRef();    // Foo ref count == 0 =&gt; delete
</code></pre>
<p>Wie wird denn das Objekt vernichtet? Vielleicht so:</p>
<pre><code class="language-cpp">delete this
</code></pre>
<p>Du bist verdammt! <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/1748087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748087</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 23 Jul 2009 09:31:40 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Fri, 24 Jul 2009 02:25:06 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<pre><code class="language-cpp">f-&gt;DecRef();    // Foo ref count == 0 =&gt; delete
</code></pre>
<p>Wie wird denn das Objekt vernichtet? Vielleicht so:</p>
<pre><code class="language-cpp">delete this
</code></pre>
<p>Du bist verdammt! <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>
<p>Ja klar so. Wo soll das Problem sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748604</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 24 Jul 2009 02:25:06 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Fri, 24 Jul 2009 07:55:06 GMT]]></title><description><![CDATA[<p>Ich finde es ehrlich gesagt auch unschön, über</p>
<pre><code class="language-cpp">Foo* f = createFoo(2);
</code></pre>
<p>eine Instanz zu erstellen, die man mit</p>
<pre><code class="language-cpp">f-&gt;DecRef();
</code></pre>
<p>wieder löscht. Was spricht denn gegen eine einheitliche Schnittstelle zur Erzeugung und Zerstörung von Instanzen, also etwas wie</p>
<pre><code class="language-cpp">destroyFoo(f);
</code></pre>
<p>? (Das ist einfach meine Ansicht, ich würde das nie so machen...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748667</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 24 Jul 2009 07:55:06 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Fri, 24 Jul 2009 10:52:00 GMT]]></title><description><![CDATA[<blockquote>
<p>einheitliche Schnittstelle zur Erzeugung und Zerstörung von Instanzen</p>
</blockquote>
<p>Das ist das Symmetrieprinzip, von dem ich rede.</p>
<blockquote>
<p>Ja klar so. Wo soll das Problem sein?</p>
</blockquote>
<p>delete this halte ich fuer grundsaetzlich boese, ganz einfach weil wieder das Symmetrieprinzip verletzt ist. Ein Objekt kann sich nicht selber erzeugen, also sollte es sich auch nicht selbst zerstoeren. Sauber programmiert man anders. Auch kann das Objekt auf dem Stack liegen, was vielelicht hier nicht der Fall sein wird/kann. Auch weiss ich nicht, wie ob Code nach einem delete this (z.B. in Form von einem return) undefiniertes Verhalten erzeugt. Normalerweise ist dieses Konstrukt ueberfluessig und kann durch besseres Programmdesign entfernt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748788</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 24 Jul 2009 10:52:00 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Fri, 24 Jul 2009 10:54:23 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>delete this halte ich fuer grundsaetzlich boese, ganz einfach weil wieder das Symmetrieprinzip verletzt ist. Ein Objekt kann sich nicht selber erzeugen, also sollte es sich auch nicht selbst zerstoeren. Sauber programmiert man anders.</p>
</blockquote>
<p>Mag sein, aber ich hab mal gelesen, dass wenigstens unter win dies die einzige Möglichkeit ist, ein via LoadLibrary dynamisch geladenes Objekt (Plugin) ordentlich zu löschen, das muss einfach aus dem Speicherbereich der dll heraus geschehen. Weshalb ich mittlerweile im Plugin-Interface den Destruktor + destroy()-Methode private mache und den PluginManager als friend deklariere, welcher seinerseits eine Methode zum löschen anbietet... Damit garantiert nix falsch geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748797</guid><dc:creator><![CDATA[plaquine]]></dc:creator><pubDate>Fri, 24 Jul 2009 10:54:23 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Fri, 24 Jul 2009 11:02:08 GMT]]></title><description><![CDATA[<p>Ich kann dir nicht folgen: Die DLL/Plugin (fuer was eigentlich) or whatever kann fuer Objekte einfach create und destroy anbieten. Ich verwende also fuer Objekte der DLL die Funktionen der DLL zum Erzeugen und Vernichten. Zumindestens implementiere ich es so bei .so-Bibliotheken unter Linux.</p>
<blockquote>
<p>hab mal gelesen</p>
</blockquote>
<p>Eine etwas schwache Argumentation. Vielelicht war es einfach schlechtes Plugindesign. Und dein Beispiel ist eher speziell. Im Allgemeinen wuerde ich immer nach besseren Moeglichkeiten als delete this suchen. Hier gibt es die bestimmt.</p>
<blockquote>
<p>LoadLibrary dynamisch geladenes Objekt</p>
</blockquote>
<p>Keine Ahnung wie Windowsprogrammierung so aussieht, aber ladet man nicht Bibliotheken anstatt Objekte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748799</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 24 Jul 2009 11:02:08 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Fri, 24 Jul 2009 13:59:25 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>delete this halte ich fuer grundsaetzlich boese, ganz einfach weil wieder das Symmetrieprinzip verletzt ist. Ein Objekt kann sich nicht selber erzeugen, also sollte es sich auch nicht selbst zerstoeren. Sauber programmiert man anders. (...) Normalerweise ist dieses Konstrukt ueberfluessig und kann durch besseres Programmdesign entfernt werden.</p>
</blockquote>
<p>Intrusive Reference Counting ist an sich, von einem bestimmten Standpunkt aus betrachtet, unsauber. Intrusive Reference Counting vermischt Dinge die eigentlich nicht zusammengehören, nämlich die &quot;lifetime control&quot; und das eigentliche Objekt. Es macht die Sache aber nicht besser, die AddRef und Release Funktionen als nicht-Member zu implementieren. IMO macht das die Sache sogar noch schlimmer, denn der Zähler ist Teil des Objekts, also sollte er auch über Member-Funktionen angesprochen werden.</p>
<p>Intrusive Reference Counting ist eine Optimierung, und wie die meisten Optimierungen, streng genommen nicht ganz &quot;sauber&quot;. Es ist aber Common Practice und leicht zu verstehen. Daher verstehe ich deine &quot;Bedenken&quot; nicht ganz.</p>
<p>Wenn du es &quot;sauber&quot; willst, dann verzichte ganz auf &quot;Intrusive Reference Counting&quot; (&quot;counted body&quot;), und verwende &quot;counted handle&quot; stattdessen.</p>
<blockquote>
<p>Auch weiss ich nicht, wie ob Code nach einem delete this (z.B. in Form von einem return) undefiniertes Verhalten erzeugt.</p>
</blockquote>
<p>Es erzeugt kein UB, solange man this danach nichtmehr dereferenziert, oder sonstwie auf Member des Objekts zugreift. Das typische &quot;delete this; return;&quot; ist völlig problemlos.</p>
<p>p.S.: genau das, nämlich dass sich viele Leute nicht sicher sind, ob &quot;delete this&quot; denn &quot;OK&quot; ist, ist der Grund, warum viele Leute es als &quot;böse&quot; verdonnern. Überleg dir mal bessere Argumente, oder hör auf etwas zu verteufeln, was du nicht verstehst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748921</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 24 Jul 2009 13:59:25 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Fri, 24 Jul 2009 18:25:40 GMT]]></title><description><![CDATA[<blockquote>
<p>einem bestimmten Standpunkt aus betrachtet, unsauber.</p>
</blockquote>
<p>Ich habe verschiedene Standpunkte probiert, leider ist es bei mir von allen Standpunkten fuer dieses Problem unsauber. Auch moechte ich mich nicht vom Speziellen hier dargestelltem Design zum Allgemeinen wegbewegen.</p>
<blockquote>
<p>Intrusive Reference Counting vermischt Dinge die eigentlich nicht zusammengehören</p>
</blockquote>
<p>Deswegen ist es schlechtes Design.</p>
<blockquote>
<p>AddRef und Release Funktionen als nicht-Member zu implementieren</p>
</blockquote>
<p>Darum geht es mir nicht.</p>
<blockquote>
<p>Es ist aber Common Practice</p>
</blockquote>
<p>Ich verweise da gern auf ein Essay von Paul Graham. Hier ein kleiner Auszug:</p>
<blockquote>
<p>Within large organizations, the phrase used to describe this approach is &quot;industry best practice.&quot; Its purpose is to shield the pointy-haired boss from responsibility: if he chooses something that is &quot;industry best practice,&quot; and the company loses, he can't be blamed. He didn't choose, the industry did.</p>
</blockquote>
<blockquote>
<p>Wenn du es &quot;sauber&quot; willst, dann verzichte ganz auf &quot;Intrusive Reference Counting&quot; (&quot;counted body&quot;), und verwende &quot;counted handle&quot; stattdessen.</p>
</blockquote>
<p>Hier gehts wohl weniger um mich.</p>
<blockquote>
<p>p.S.: genau das, nämlich dass sich viele Leute nicht sicher sind, ob &quot;delete this&quot; denn &quot;OK&quot; ist, ist der Grund, warum viele Leute es als &quot;böse&quot; verdonnern. Überleg dir mal bessere Argumente, oder hör auf etwas zu verteufeln, was du nicht verstehst.</p>
</blockquote>
<p>Bullshit. Meine anderen Argumente hast du ignoriert. Oder welche sind stark genug? Muss erst der Mond auf die Erde stuerzen ... Die Optimierung halte ich hier fuer fragwuerdig, Common Practice siehe oben auch. Und nur weil etwas kein undefiniertes Verhalten erzeugt, heisst es noch lange nicht, das z.B. delete this &quot;OK&quot; ist. Es ist fast nie okay. Wenn man so argumentiert, dann sollte man auch angehende C++ User nicht darauf hinweisen, dass sie Elemente der Standardbibliothek benutzen sollen, wenn sie im C-Stil programmieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749071</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 24 Jul 2009 18:25:40 GMT</pubDate></item><item><title><![CDATA[Reply to SmartPointer Design Frage on Sat, 25 Jul 2009 00:46:33 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21632">@knivil</a>:<br />
Selber bullshit.</p>
<p>Aber glaub was du willst, ich hab grad echt keinen Geist mich mit dir rumzustreiten.</p>
<p>Blub.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749216</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 25 Jul 2009 00:46:33 GMT</pubDate></item></channel></rss>