<?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[Smart Poiner class Frage]]></title><description><![CDATA[<p>Ich bin gerade im kapitel 13.5 vom C++ Primer (Lehrbuch) und lese mir gerade einen Zuweisungsoperator durch, der die Verwendung einer Smart-Pointer-Class berücksichtigt, allerdings verstehe ich die Logik bei einer Anweisung überhaupt nicht:</p>
<pre><code class="language-cpp">HasPtr&amp; HasPtr::operator=(const HasPtr &amp;rhs)
{
  ++rhs.ptr-&gt;use;
  if(--ptr-&gt;use == 0) delete ptr;  //was soll diese Abfrage? Schritt 1 schließt doch hier das true aus?
  ptr = rhs.ptr;
  val = rhs.val;
  return *this:
}
</code></pre>
<p>hier noch die dazu gehörenden Klassen:</p>
<pre><code class="language-cpp">class HasPtr
{
  public:
  HasPtr(int* p, int i): ptr(new U_Ptr(o)), val(i) {}
  HasPtr(const HasPtr &amp;orig): ptr(orig.ptr), val(orig.val) {++ptr-&gt;use;}
  HasPtr&amp; operator=(const HasPtr&amp;);
  ~HasPtr() { if (--ptr-&gt;use == 0) delete ptr;}
  pirvate:
  U_ptr *ptr;
  int val;
};

class U_Ptr
{
  friend class HasPtr;
  int *p;
  size_z use;
  U_Ptr(int *p): ip(p), use(1) {};
  ~U_Ptr() {}
};
</code></pre>
<p>wär schön wenn mir das jemand erklären könnte, bzw n besipiel geben könnte wo diese Bedingung true ergibt und der ptr gelöscht würde.</p>
<p>lg S.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/261064/smart-poiner-class-frage</link><generator>RSS for Node</generator><lastBuildDate>Sun, 31 May 2026 05:34:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/261064.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 12 Feb 2010 20:44:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Smart Poiner class Frage on Fri, 12 Feb 2010 20:44:36 GMT]]></title><description><![CDATA[<p>Ich bin gerade im kapitel 13.5 vom C++ Primer (Lehrbuch) und lese mir gerade einen Zuweisungsoperator durch, der die Verwendung einer Smart-Pointer-Class berücksichtigt, allerdings verstehe ich die Logik bei einer Anweisung überhaupt nicht:</p>
<pre><code class="language-cpp">HasPtr&amp; HasPtr::operator=(const HasPtr &amp;rhs)
{
  ++rhs.ptr-&gt;use;
  if(--ptr-&gt;use == 0) delete ptr;  //was soll diese Abfrage? Schritt 1 schließt doch hier das true aus?
  ptr = rhs.ptr;
  val = rhs.val;
  return *this:
}
</code></pre>
<p>hier noch die dazu gehörenden Klassen:</p>
<pre><code class="language-cpp">class HasPtr
{
  public:
  HasPtr(int* p, int i): ptr(new U_Ptr(o)), val(i) {}
  HasPtr(const HasPtr &amp;orig): ptr(orig.ptr), val(orig.val) {++ptr-&gt;use;}
  HasPtr&amp; operator=(const HasPtr&amp;);
  ~HasPtr() { if (--ptr-&gt;use == 0) delete ptr;}
  pirvate:
  U_ptr *ptr;
  int val;
};

class U_Ptr
{
  friend class HasPtr;
  int *p;
  size_z use;
  U_Ptr(int *p): ip(p), use(1) {};
  ~U_Ptr() {}
};
</code></pre>
<p>wär schön wenn mir das jemand erklären könnte, bzw n besipiel geben könnte wo diese Bedingung true ergibt und der ptr gelöscht würde.</p>
<p>lg S.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1854891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854891</guid><dc:creator><![CDATA[Jud4s]]></dc:creator><pubDate>Fri, 12 Feb 2010 20:44:36 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Poiner class Frage on Fri, 12 Feb 2010 20:54:47 GMT]]></title><description><![CDATA[<p>nein<br />
schritt 1 erhöht den counter für RHS<br />
schritt 2 vermindert den couter für LHS(this)</p>
<p>das das so rum geschrieben ist, hat den grund, dass sonst selbstzuweisung nicht funktionieren würde...<br />
(andersrum wär es vrmtl intuitiver)</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1854894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854894</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 12 Feb 2010 20:54:47 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Poiner class Frage on Fri, 12 Feb 2010 21:03:05 GMT]]></title><description><![CDATA[<p>Bin mir nicht sicher ob ich dich verstanden habe.<br />
Könntest du/jemand mir vll schritt für schritt aufschreiben was bei obj = obj bei diesem Zuweisungsoberator passiert? Vll versteh ich es dann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1854896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854896</guid><dc:creator><![CDATA[Jud4s]]></dc:creator><pubDate>Fri, 12 Feb 2010 21:03:05 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Poiner class Frage on Fri, 12 Feb 2010 21:30:31 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">// Bezieht sich auf den rechten Operanden der Zuweisung
++rhs.ptr-&gt;use;

// Bezieht sich auf this.ptr
if(--ptr-&gt;use == 0) delete ptr;
</code></pre>
<p>Bei einer Selbstzuweisung wird zuerst rhs.ptr inkrementiert. rhs.ptr entspricht hierbei aber this.ptr (oder einfach ptr). In der folgenden if-Abfrage wird ptr dektrementiert, sodass am Ende gar nichts passiert ist.</p>
<p>bnz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1854904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854904</guid><dc:creator><![CDATA[bnz]]></dc:creator><pubDate>Fri, 12 Feb 2010 21:30:31 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Poiner class Frage on Fri, 12 Feb 2010 21:32:08 GMT]]></title><description><![CDATA[<p>Beispiel einer normalen Zuweisung:</p>
<pre><code>A = B;

                         Counter A                 Counter B
Start                       1                         3
++rhs.ptr-&gt;use;             1                         4
if(--ptr-&gt;use == 0)         0                         4
 -&gt; delete von ptr in A.
ptr = rhs.ptr;              4                         4
</code></pre>
<p>Selbstzuweisung:</p>
<pre><code>A = A;

                         Counter A                 Counter A
Start                       1                         1
++rhs.ptr-&gt;use;             2                         2
if(--ptr-&gt;use == 0)         1                         1
 -&gt; Kein delete.
ptr = rhs.ptr;              1                         1
</code></pre>
<p>Wenn bei der Selbstzuweisung zuerst die Überprüfung kommen würde:</p>
<pre><code>A = A;

                         Counter A                 Counter A
Start                       1                         1
if(--ptr-&gt;use == 0)         0                         0
 -&gt; delete von ptr in A.
++rhs.ptr-&gt;use;             CRASH; BUMM; PATAMM; BENG
</code></pre>
<p>Grüssli <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/1854905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854905</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 12 Feb 2010 21:32:08 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Poiner class Frage on Fri, 12 Feb 2010 21:35:46 GMT]]></title><description><![CDATA[<p>danke, jetzt versteh ich. Ich hatte garnicht bedacht das die zuweisung erst nach der überprüfung ist. Jetzt macht das ganze sinn. Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1854906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854906</guid><dc:creator><![CDATA[Jud4s]]></dc:creator><pubDate>Fri, 12 Feb 2010 21:35:46 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Poiner class Frage on Fri, 12 Feb 2010 21:34:27 GMT]]></title><description><![CDATA[<p>Jud4s schrieb:</p>
<blockquote>
<p>jo, zu dem Schluss bin ich auch gekommen^^, nur ich habe mich gefragt wieso zwei sinnloszeilen schreiben? Da muss doch ein tieferer Sinn liegen.</p>
</blockquote>
<p>Sinnlos? Wieso sollen die sinnlos sein? Die beziehen sind auf unterschiedliche Objekte!</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1854907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854907</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 12 Feb 2010 21:34:27 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Poiner class Frage on Fri, 12 Feb 2010 21:39:06 GMT]]></title><description><![CDATA[<p>war auf den vorposter bezogen</p>
<p>noch ne Frage zum Thema:</p>
<p>dieser ganze Code wurde ja geschrieben damit das kein crash ergibt:</p>
<pre><code class="language-cpp">int* ip = new int(42);

HasPtr ptr(ip,10);

delete ip;

ptr.set_ptr_val(0);
</code></pre>
<p>aber das problem besteht doch immernoch?<br />
Wenn der Benutzer es lustig findet ip zu deleten wird doch auch der new int gelöscht oder? Oder ist das hier so wie bei Java das solange eine Referenz (in dem Falle Pointer) auf das Objekt verweist lebt es?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1854908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854908</guid><dc:creator><![CDATA[Jud4s]]></dc:creator><pubDate>Fri, 12 Feb 2010 21:39:06 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Poiner class Frage on Sat, 13 Feb 2010 01:43:56 GMT]]></title><description><![CDATA[<p>man benutzt so nen teil ja auch so:</p>
<pre><code class="language-cpp">HasPtr foo(new int(42));

foo.set_val(14);
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1854933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854933</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 13 Feb 2010 01:43:56 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Poiner class Frage on Sat, 13 Feb 2010 11:33:28 GMT]]></title><description><![CDATA[<p>ok, danke ihr habt mir sehr geholfen :D.<br />
habt ihr auch mit diesem Buch gelern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1854997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854997</guid><dc:creator><![CDATA[Jud4s]]></dc:creator><pubDate>Sat, 13 Feb 2010 11:33:28 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Poiner class Frage on Sat, 13 Feb 2010 13:26:52 GMT]]></title><description><![CDATA[<p>ich nicht - aber der c++ primer hat auf jeden fall nen sehr guten ruf <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/1855030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1855030</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 13 Feb 2010 13:26:52 GMT</pubDate></item></channel></rss>