<?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[[Anfänger] Operator und Memoryleak ; C++0x Rvalue]]></title><description><![CDATA[<p>Hallo,</p>
<p><strong>1.)</strong> Um in C++ mehr Übung zu bekommen, bastle ich an einer kleinen Rechenbibliothek und da stieß ich auf folgendes Problem:</p>
<pre><code class="language-cpp">class Byte : public Number{
  typedef char _byte;

public:
   virtual Number* operator +(Byte *in) const;
   virtual Number operator +(Byte &amp;in) const;
}

// Version 1
Number* Byte::operator +(Byte *in) const
{
  const _byte t = in-&gt;data + this-&gt;data;

  if(t &lt; this-&gt;data)
    return new Short(((short) this-&gt;data) + in-&gt;data);
  else
    return new Byte(t);
}

// Version 2
Number operator +(Byte &amp;in) const 
{
  Number res;
  const _byte t = in.data + this-&gt;data;

  if(t &lt; this-&gt;data)
    res = Short(((short) this-&gt;data) + in.data);
  else
    res = Byte(t);

  return res;
}
</code></pre>
<p>So, folgendes verursacht natürlich ein Leak</p>
<pre><code class="language-cpp">Byte *n1, *n2, *n3, *res;
n1 = new Byte(4);
n2 = new Byte(6);
n3 = new Byte(5);

res = n1 + n2 + n3; // Eine Byte-Instanz geht hier verloren, welche ist nicht definiert.

// ----------------------------
Byte b1(5);
Byte b1(6);
Byte b1(5);

Byte res = b1 + b2 + b3; // Keine Leaks, aber alles auf dem Stack!
</code></pre>
<p>Meine Frage hierzu.<br />
- Gibt es Richtlinien, Empfehlungen,... wann new eingesetzt werden soll?<br />
- In Version 2 wird das Ergebnis im Operator erzeugt und eine Kopie hier von zurückgegeben. Somit führt das Programm bei zwei arithmetischen Aktionen drei überflüssige Kopien durch. In wie weit ist das sinnvoll bzw. optimiert das der Compiler entsprechend?</p>
<p>2.) Der C++0x Draft und Rvalue</p>
<pre><code class="language-cpp">class Byte {
   Byte(Byte&amp;&amp; v) { this-&gt;data = v.data; v.data = NULL; } // msdn.blog
   Byte&amp; operator= (Byte&amp;&amp; v) { this-&gt;data = v.data; v.data = NULL; return *this;}   

   virtual Number&amp;&amp; operator +(Byte &amp;&amp;in) const;
}

// Version 3
Number&amp;&amp; operator +(Byte &amp;&amp;in) const 
{
  Number &amp;&amp;res; // Geht das, oder verliere ich res nach Methoden ende?
  const _byte t = in.data + this-&gt;data;

  if(t &lt; this-&gt;data)
    res = Short(((short) this-&gt;data) + in.data);
  else
    res = Byte(t);

  return res;
}
</code></pre>
<p>Behebt diese Sprachneuerung das Problem? Oder hab ich da was falsch verstanden?</p>
<pre><code class="language-cpp">Byte b1(5);
Byte b1(6);
Byte b1(5);

Byte res = b1 + b2 + b3; // Keine zusätzlichen Kopien

Byte *hb = new Byte(res); // Verschiebe res in den Heap
// Ab hier dürfte ich res nicht mehr verwenden,
// da ich sonst eine Kopie erzeugen muss.

Byte *hb2 = new Byte(*hb); // Wenn ich jetzt das richtig
// verstehe, muss ich hb löschen bzw. mind. den Destruktor
// aufrufen.
delete hb;
// Oder eben
// hb-&gt;~Byte();
// hb = new (hb) Byte(16);
</code></pre>
<p>Besitzt das Objekt eine move und copy Konstruktor. Woher weiß der Compiler, welchen er nehmen soll? Wie kann man das festlegen?</p>
<p>In den folgenden Beiträgen wird die Handhabung von rvalue unterschiedliche Beschreiben. Im <a href="http://www.artima.com/cppsource/rvalue.html" rel="nofollow">ersten Beitrag</a> wird std::move() verwendet und der <a href="http://blogs.msdn.com/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx" rel="nofollow">msdn.blog</a> verzichtet darauf. Ist die Verwendung eher guter Sil (man sieht was geschiet) oder hat sich die Spezifikation in diesem Zeitraum geändert?</p>
<p>Ich frage deswegen, da ich beim GCC 4.4.1 kein std::move finde.<br />
GCC 4.4.1 mit -std=c++0x</p>
<p>Achja, wann werden die Unicode string literals beim GCC umgesetzt? Gibt es Alternativen?</p>
<p>Gruß,<br />
Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/252292/anfänger-operator-und-memoryleak-c-0x-rvalue</link><generator>RSS for Node</generator><lastBuildDate>Mon, 14 Sep 2026 13:26:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/252292.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 17 Oct 2009 16:53:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Anfänger] Operator und Memoryleak ; C++0x Rvalue on Sat, 17 Oct 2009 16:53:38 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p><strong>1.)</strong> Um in C++ mehr Übung zu bekommen, bastle ich an einer kleinen Rechenbibliothek und da stieß ich auf folgendes Problem:</p>
<pre><code class="language-cpp">class Byte : public Number{
  typedef char _byte;

public:
   virtual Number* operator +(Byte *in) const;
   virtual Number operator +(Byte &amp;in) const;
}

// Version 1
Number* Byte::operator +(Byte *in) const
{
  const _byte t = in-&gt;data + this-&gt;data;

  if(t &lt; this-&gt;data)
    return new Short(((short) this-&gt;data) + in-&gt;data);
  else
    return new Byte(t);
}

// Version 2
Number operator +(Byte &amp;in) const 
{
  Number res;
  const _byte t = in.data + this-&gt;data;

  if(t &lt; this-&gt;data)
    res = Short(((short) this-&gt;data) + in.data);
  else
    res = Byte(t);

  return res;
}
</code></pre>
<p>So, folgendes verursacht natürlich ein Leak</p>
<pre><code class="language-cpp">Byte *n1, *n2, *n3, *res;
n1 = new Byte(4);
n2 = new Byte(6);
n3 = new Byte(5);

res = n1 + n2 + n3; // Eine Byte-Instanz geht hier verloren, welche ist nicht definiert.

// ----------------------------
Byte b1(5);
Byte b1(6);
Byte b1(5);

Byte res = b1 + b2 + b3; // Keine Leaks, aber alles auf dem Stack!
</code></pre>
<p>Meine Frage hierzu.<br />
- Gibt es Richtlinien, Empfehlungen,... wann new eingesetzt werden soll?<br />
- In Version 2 wird das Ergebnis im Operator erzeugt und eine Kopie hier von zurückgegeben. Somit führt das Programm bei zwei arithmetischen Aktionen drei überflüssige Kopien durch. In wie weit ist das sinnvoll bzw. optimiert das der Compiler entsprechend?</p>
<p>2.) Der C++0x Draft und Rvalue</p>
<pre><code class="language-cpp">class Byte {
   Byte(Byte&amp;&amp; v) { this-&gt;data = v.data; v.data = NULL; } // msdn.blog
   Byte&amp; operator= (Byte&amp;&amp; v) { this-&gt;data = v.data; v.data = NULL; return *this;}   

   virtual Number&amp;&amp; operator +(Byte &amp;&amp;in) const;
}

// Version 3
Number&amp;&amp; operator +(Byte &amp;&amp;in) const 
{
  Number &amp;&amp;res; // Geht das, oder verliere ich res nach Methoden ende?
  const _byte t = in.data + this-&gt;data;

  if(t &lt; this-&gt;data)
    res = Short(((short) this-&gt;data) + in.data);
  else
    res = Byte(t);

  return res;
}
</code></pre>
<p>Behebt diese Sprachneuerung das Problem? Oder hab ich da was falsch verstanden?</p>
<pre><code class="language-cpp">Byte b1(5);
Byte b1(6);
Byte b1(5);

Byte res = b1 + b2 + b3; // Keine zusätzlichen Kopien

Byte *hb = new Byte(res); // Verschiebe res in den Heap
// Ab hier dürfte ich res nicht mehr verwenden,
// da ich sonst eine Kopie erzeugen muss.

Byte *hb2 = new Byte(*hb); // Wenn ich jetzt das richtig
// verstehe, muss ich hb löschen bzw. mind. den Destruktor
// aufrufen.
delete hb;
// Oder eben
// hb-&gt;~Byte();
// hb = new (hb) Byte(16);
</code></pre>
<p>Besitzt das Objekt eine move und copy Konstruktor. Woher weiß der Compiler, welchen er nehmen soll? Wie kann man das festlegen?</p>
<p>In den folgenden Beiträgen wird die Handhabung von rvalue unterschiedliche Beschreiben. Im <a href="http://www.artima.com/cppsource/rvalue.html" rel="nofollow">ersten Beitrag</a> wird std::move() verwendet und der <a href="http://blogs.msdn.com/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx" rel="nofollow">msdn.blog</a> verzichtet darauf. Ist die Verwendung eher guter Sil (man sieht was geschiet) oder hat sich die Spezifikation in diesem Zeitraum geändert?</p>
<p>Ich frage deswegen, da ich beim GCC 4.4.1 kein std::move finde.<br />
GCC 4.4.1 mit -std=c++0x</p>
<p>Achja, wann werden die Unicode string literals beim GCC umgesetzt? Gibt es Alternativen?</p>
<p>Gruß,<br />
Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1793897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1793897</guid><dc:creator><![CDATA[Siassei]]></dc:creator><pubDate>Sat, 17 Oct 2009 16:53:38 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Operator und Memoryleak ; C++0x Rvalue on Sat, 17 Oct 2009 17:24:55 GMT]]></title><description><![CDATA[<p>Siassei schrieb:</p>
<blockquote>
<pre><code class="language-cpp">res = n1 + n2 + n3;
</code></pre>
</blockquote>
<p>Zeiger können nicht zueinander addiert werden, das ist also schlicht ill-formed.<br />
Im Allgemeinen sind bei Operatorüberladung vollständige Objekte involviert und es werden ggf. neue Objekte zurückgegeben. Das ist mit Polymorphie mittels abstrakter Basisklassen nicht vereinbar.</p>
<pre><code class="language-cpp">Number &amp;&amp;res; // Geht das, oder verliere ich res nach Methoden ende?
</code></pre>
<p>Res ist immer noch eine Referenz und kein Objekt und muss sofort initialisiert werden.</p>
<p>Siassei schrieb:</p>
<blockquote>
<p>Besitzt das Objekt eine move und copy Konstruktor. Woher weiß der Compiler, welchen er nehmen soll?</p>
</blockquote>
<p>Durch Überladungauflösung. Eine modifizierbare lvalue-Referenz bindet nur an modifizierbare lvalues. rvalue-Referenzen binden nur an rvalues. lvalue-Referenzen auf const binden an lvalues oder rvalues - ist das Argument allerdings nicht konstant, ist eine Qualifikationskonvertierung notwendig, so dass diese Variante schlechter ist, falls nicht-const Alternativen zur Verfügung stehen. Der Mechanismus ist der gleiche, der heute benutzt wird, um const- und nicht-const-Überladungen zu unterscheiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1793912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1793912</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 17 Oct 2009 17:24:55 GMT</pubDate></item></channel></rss>