<?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 läuft nicht, wie er soll]]></title><description><![CDATA[<p>Hey ihr,</p>
<p>Ich habe einen Smartpointer programmiert.<br />
Doch leider funktioniert er irgendwie nicht.<br />
Wenn ich folgenden Quelltext ausführe, müsste eigentlich der =-Operator dafür sorgen, dass bei Zuweisung eines Objektes der Counter des linken Objektes decrementiert, und der Counter des rechten Objektes incrementiert wird.<br />
Doch dummerweise werden irgendwie beide incrementiert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f622.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--crying_face"
      title=";-("
      alt="😢"
    /></p>
<p>Die Ausgabe lautet nämlich:</p>
<blockquote>
<p>Es gibt 2 Objekte.<br />
Es gibt 2 Objekte.<br />
Es gibt 1 Objekte.</p>
</blockquote>
<p>wo sie eigentlich so sein sollte:</p>
<blockquote>
<p>Es gibt 2 Objekte.<br />
Es gibt 0 Objekte.<br />
Es gibt 1 Objekte.</p>
</blockquote>
<p>Doch irgendwie läuft das nicht :-(^^</p>
<p>Hier ist mein Quelltext:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;
class Smartpoint;
class Counter
{
   private:            
      friend class Smartpoint;
      int use;
      int *i_point;
      ~Counter(){}
      Counter(int* u) : use(1), i_point(u){}
   public:
      int getvar(void)
      {
         return use;    
      }
};
class Smartpoint
{
   private:
      int i_var;
      Counter * c;
   public:   
      Smartpoint(int var, int *count) : i_var(var), c(new Counter(count)) {}      
      Smartpoint(const Smartpoint&amp; ref)
      {
         i_var = ref.i_var;
         c = ref.c;
         ++ref.c-&gt;i_point;
      }
      ~Smartpoint()
      {
         if(--c-&gt;use == 0)
            delete c;
      }      
      Smartpoint&amp; operator=(const Smartpoint&amp; ref)
      {
         ++ref.c-&gt;use;

         if(--c-&gt;use == 0)
            delete c;
         i_var = ref.i_var;
         c = ref.c;
         return *this;  
      }
      void seti_var(int);
      void setc(int*);
      int geti_var(void);
      int* getc(void);
      Counter* Smartpoint::getcc(void)
      {
         return c;
      }      
};
void Smartpoint::seti_var(int i)
{
   i_var = i;     
}
void Smartpoint::setc(int *i)
{
   c-&gt;i_point = i;
}
int Smartpoint::geti_var(void)
{
   return i_var;
}
int* Smartpoint::getc(void)
{
   return c-&gt;i_point;     
}
using namespace std;
void tellme(Smartpoint, Smartpoint, Smartpoint);
int main(void)
{
   cout &lt;&lt; &quot;Das folgende Programm soll zeigen, was ein Smartpointer ist, und wie damit umgegangen werden kann!&quot; &lt;&lt; endl;
   int * drei = new int(3);
   int * vier = new int(4);   
   int * fuenf = new int(5);      
   Smartpoint S(3,drei);   //Smartpointobjekt erstellen.
   Smartpoint Z(4,vier);   //Noch ein Smartpointobjekt erstellen   
   Smartpoint U(5,fuenf);  //Noch ein Smartpointobjekt erstellen

   Z = S;
   tellme(S,Z,U);
   system(&quot;Pause&quot;);    
}
void tellme(Smartpoint S, Smartpoint Z, Smartpoint U)
{
   cout &lt;&lt; &quot;Es gibt &quot; &lt;&lt; S.getcc()-&gt;getvar() &lt;&lt; &quot; Objekte.&quot; &lt;&lt; endl;
   cout &lt;&lt; &quot;Es gibt &quot; &lt;&lt; Z.getcc()-&gt;getvar() &lt;&lt; &quot; Objekte.&quot; &lt;&lt; endl;
   cout &lt;&lt; &quot;Es gibt &quot; &lt;&lt; U.getcc()-&gt;getvar() &lt;&lt; &quot; Objekte.&quot; &lt;&lt; endl;         
}
</code></pre>
<p>bye</p>
<p>David</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/204004/smartpointer-läuft-nicht-wie-er-soll</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 07:54:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/204004.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 29 Jan 2008 08:16:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Smartpointer läuft nicht, wie er soll on Tue, 29 Jan 2008 08:16:11 GMT]]></title><description><![CDATA[<p>Hey ihr,</p>
<p>Ich habe einen Smartpointer programmiert.<br />
Doch leider funktioniert er irgendwie nicht.<br />
Wenn ich folgenden Quelltext ausführe, müsste eigentlich der =-Operator dafür sorgen, dass bei Zuweisung eines Objektes der Counter des linken Objektes decrementiert, und der Counter des rechten Objektes incrementiert wird.<br />
Doch dummerweise werden irgendwie beide incrementiert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f622.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--crying_face"
      title=";-("
      alt="😢"
    /></p>
<p>Die Ausgabe lautet nämlich:</p>
<blockquote>
<p>Es gibt 2 Objekte.<br />
Es gibt 2 Objekte.<br />
Es gibt 1 Objekte.</p>
</blockquote>
<p>wo sie eigentlich so sein sollte:</p>
<blockquote>
<p>Es gibt 2 Objekte.<br />
Es gibt 0 Objekte.<br />
Es gibt 1 Objekte.</p>
</blockquote>
<p>Doch irgendwie läuft das nicht :-(^^</p>
<p>Hier ist mein Quelltext:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;
class Smartpoint;
class Counter
{
   private:            
      friend class Smartpoint;
      int use;
      int *i_point;
      ~Counter(){}
      Counter(int* u) : use(1), i_point(u){}
   public:
      int getvar(void)
      {
         return use;    
      }
};
class Smartpoint
{
   private:
      int i_var;
      Counter * c;
   public:   
      Smartpoint(int var, int *count) : i_var(var), c(new Counter(count)) {}      
      Smartpoint(const Smartpoint&amp; ref)
      {
         i_var = ref.i_var;
         c = ref.c;
         ++ref.c-&gt;i_point;
      }
      ~Smartpoint()
      {
         if(--c-&gt;use == 0)
            delete c;
      }      
      Smartpoint&amp; operator=(const Smartpoint&amp; ref)
      {
         ++ref.c-&gt;use;

         if(--c-&gt;use == 0)
            delete c;
         i_var = ref.i_var;
         c = ref.c;
         return *this;  
      }
      void seti_var(int);
      void setc(int*);
      int geti_var(void);
      int* getc(void);
      Counter* Smartpoint::getcc(void)
      {
         return c;
      }      
};
void Smartpoint::seti_var(int i)
{
   i_var = i;     
}
void Smartpoint::setc(int *i)
{
   c-&gt;i_point = i;
}
int Smartpoint::geti_var(void)
{
   return i_var;
}
int* Smartpoint::getc(void)
{
   return c-&gt;i_point;     
}
using namespace std;
void tellme(Smartpoint, Smartpoint, Smartpoint);
int main(void)
{
   cout &lt;&lt; &quot;Das folgende Programm soll zeigen, was ein Smartpointer ist, und wie damit umgegangen werden kann!&quot; &lt;&lt; endl;
   int * drei = new int(3);
   int * vier = new int(4);   
   int * fuenf = new int(5);      
   Smartpoint S(3,drei);   //Smartpointobjekt erstellen.
   Smartpoint Z(4,vier);   //Noch ein Smartpointobjekt erstellen   
   Smartpoint U(5,fuenf);  //Noch ein Smartpointobjekt erstellen

   Z = S;
   tellme(S,Z,U);
   system(&quot;Pause&quot;);    
}
void tellme(Smartpoint S, Smartpoint Z, Smartpoint U)
{
   cout &lt;&lt; &quot;Es gibt &quot; &lt;&lt; S.getcc()-&gt;getvar() &lt;&lt; &quot; Objekte.&quot; &lt;&lt; endl;
   cout &lt;&lt; &quot;Es gibt &quot; &lt;&lt; Z.getcc()-&gt;getvar() &lt;&lt; &quot; Objekte.&quot; &lt;&lt; endl;
   cout &lt;&lt; &quot;Es gibt &quot; &lt;&lt; U.getcc()-&gt;getvar() &lt;&lt; &quot; Objekte.&quot; &lt;&lt; endl;         
}
</code></pre>
<p>bye</p>
<p>David</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445466</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Tue, 29 Jan 2008 08:16:11 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer läuft nicht, wie er soll on Tue, 29 Jan 2008 08:29:15 GMT]]></title><description><![CDATA[<p>Bist Du sicher, dass Du im Copy-Ctor von Smartpointer den Zeiger inkrementieren möchtest, und nicht den Zähler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445471</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 29 Jan 2008 08:29:15 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer läuft nicht, wie er soll on Tue, 29 Jan 2008 08:45:54 GMT]]></title><description><![CDATA[<p>Wiso?<br />
Mein Kopierkonstruktor wird ja garnicht aufgerufen.<br />
Nur der = Operator, welchen ich überladen habe.<br />
Incrementiert oder decrementiert wird ja nur die Variable 'use', welche sich in meiner Zählerklasse befindet.<br />
Doch es läuft nicht <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/1445480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445480</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Tue, 29 Jan 2008 08:45:54 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer läuft nicht, wie er soll on Tue, 29 Jan 2008 09:01:16 GMT]]></title><description><![CDATA[<p>Doch, der Kopierkonstruktor wird dreimal aufgerufen, nämlich wenn S, Z und U aus main in die Parameter der Funktion tellme kopiert werden. Aber die Frage steht weiterhin, unabhängig ob der Kopierkonstruktor benutzt wird: Warum inkrementierst Du den Zeiger i_point?</p>
<p>Darüberhinaus, wieso muss die Ausgabe zu dem Zeitpunkt &quot;0&quot; sein? Das wäre doch schlicht gelogen, da ja der Smartpointer Z zu dem Zeitpunkt nach seinem Usecount gefragt wird, und damit zweifellos existiert und auf ein Objekt zeigt. Meiner Meinung nach macht der Code bis auf den erwähnten Copy-Ctor (der zu einem Double-Free am Ende von main führt) alles richtig. Auf Exception-Sicherheit o.ä. gehe ich dabei aber noch nicht ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445485</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 29 Jan 2008 09:01:16 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer läuft nicht, wie er soll on Tue, 29 Jan 2008 09:02:38 GMT]]></title><description><![CDATA[<p>Der Copy-Konstruktor wird schon alleine dann aufgerufen, wenn du tellme aufrufst, da du diesem keine Referenz übergibst.</p>
<p>EDIT: zu lange gelesen. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1445487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445487</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 29 Jan 2008 09:02:38 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer läuft nicht, wie er soll on Tue, 29 Jan 2008 09:05:41 GMT]]></title><description><![CDATA[<p>dumme frage:<br />
sollten smartpointer nicht eigentlich dazu da sein, das ganze new und delete auch weg zu lassen? das sollte doch implizit in der hülle des smartpointer objektes geschehen und der anwender sollte doch (meines wissens nach) nichts damit zu tun haben. dachte smartpointer sind im endeffekt keine pointer, sondern eher lokale objekte, welche z.b. den operator -&gt; überladen haben, um an den inhalt des objektes an sich zu kommen, aber ich kann mich, natürlich, auch täuschen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445489</guid><dc:creator><![CDATA[Vorden]]></dc:creator><pubDate>Tue, 29 Jan 2008 09:05:41 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer läuft nicht, wie er soll on Tue, 29 Jan 2008 09:10:17 GMT]]></title><description><![CDATA[<p>Nunja, das new kann Dir niemand abnehmen, da dafür der Smartpointer die Signatur aller möglichen Konstruktoren abbilden müsste (was natürlich mit etwas Aufwand auch möglich, aber m.M.n. nicht praktikabel ist). Stattdessen übergibt man dem Smartpointer üblicherweise direkt das Ergebnis des new-Ausdrucks, so dass man selbst den nackten Zeiger nie &quot;in den Händen&quot; (sprich in einer Variablen) hält. Das delete (oder Custom-Delete) übernimmt dann der Smartpointer.</p>
<pre><code class="language-cpp">{
   smart_ptr&lt;Typ&gt; x( new Typ( /* hier Argumente einsetzen */ ) );
   /* x benutzen, herumreichen, zuweisen, verfallen lassen */
} 
/* x stirbt, und wenn kein weiterer Verweis auf das Ergebnis unseres &quot;new Typ&quot; existiert, wird das Objekt dabei gelöscht */
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1445490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445490</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 29 Jan 2008 09:10:17 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer läuft nicht, wie er soll on Tue, 29 Jan 2008 09:12:43 GMT]]></title><description><![CDATA[<p>Oh ihr habt recht.<br />
Der Kopierkonstruktor wird tatsächlich 3 mal aufgerufen.<br />
Zudem habe ich den Fehler, dass i_point incrementiert wird schon behoben.<br />
Es muss natürlich use incrementiert werden!</p>
<p>Nun lautet die Ausgabe:</p>
<pre><code>Es gibt 4 Objekte.
Es gibt 4 Objekte.
Es gibt 2 Objekte.
</code></pre>
<p>Erst erstelle ich S/Z/U es gibt also von jedem Objekt genau 1.<br />
Danach weise ich Z = S zu.<br />
Es müsste also nun zweimal S und 0 Mal Z geben.<br />
Dann kopiere ich die Objekte in die Funktion und es müsste nun 3 Objekte von Z geben, null von S und zwei von U.</p>
<pre><code>Es gibt 0 Objekte.
Es gibt 3 Objekte.
Es gibt 2 Objekte.
</code></pre>
<p>Doch nur für U stimmt das ganze...-.- <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>welche z.b. den operator -&gt; überladen haben</p>
</blockquote>
<p>Den kann man doch garnicht überladen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445493</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Tue, 29 Jan 2008 09:12:43 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer läuft nicht, wie er soll on Tue, 29 Jan 2008 09:11:44 GMT]]></title><description><![CDATA[<p>joar, naja, überzeugt <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 />
aber, wenn man z.b. einen allocator angeben würde, wäre es möglich, dass das allokieren im Konstruktor des Smartpointers implizit geschieht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445494</guid><dc:creator><![CDATA[Vorden]]></dc:creator><pubDate>Tue, 29 Jan 2008 09:11:44 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer läuft nicht, wie er soll on Tue, 29 Jan 2008 09:17:12 GMT]]></title><description><![CDATA[<p>777 schrieb:</p>
<blockquote>
<p>Erst erstelle ich S/Z/U es gibt also von jedem Objekt genau 1.<br />
Danach weise ich Z = S zu.<br />
Es müsste also nun zweimal S und 0 Mal Z geben.</p>
</blockquote>
<p>Etwas, was nicht existiert, kannst Du auch nicht nach seiner Existenz fragen. S und Z zeigen nach der Zuweisung auf dasselbe Objekt. Logischerweise haben auch beide Smartpointer den selben Usecount. Das Objekt, <strong>auf das Z mal gezeigt hat</strong>, ist weg.</p>
<p>777 schrieb:</p>
<blockquote>
<blockquote>
<p>welche z.b. den operator -&gt; überladen haben</p>
</blockquote>
<p>Den kann man doch garnicht überladen?</p>
</blockquote>
<p>Doch, kann man. Schau Dir mal die Smartpointer der Standardbibliothek an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445498</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 29 Jan 2008 09:17:12 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer läuft nicht, wie er soll on Tue, 29 Jan 2008 10:07:41 GMT]]></title><description><![CDATA[<p>Tatsächlich:</p>
<p>Das erste bei der Erstellung von S.<br />
Das zweite, bei der Zuweisung von Z zu S.<br />
Das dritte beim kopieren von S und das vierte beim kopieren von Z (was ja S ist)<br />
THX<br />
cya<br />
David</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445522</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Tue, 29 Jan 2008 10:07:41 GMT</pubDate></item></channel></rss>