<?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[Memory leak bei überladenen Operatoren verhindern]]></title><description><![CDATA[<p>Hallo alle zusammen,</p>
<p>ich will mal einige numerische Verfahren implementieren und bin dabei auf eine Frage gestoßen. Meine Klassendefinition sieht so aus:</p>
<pre><code class="language-cpp">class Matrix {
    [...]
    Matrix&amp; operator=(const Matrix&amp; original);
    Matrix&amp; operator+(const Matrix&amp; summand);
    [...]
    int m_rows, m_cols;
};

[...]

Matrix&amp; Matrix::operator+(const Matrix&amp; original) {
    Matrix* tmp = new Matrix(m_rows, m_cols);
    [...]
    return *tmp;
}
</code></pre>
<p>Das Problem ergibt sich dann, wenn ich sowas schreibe wie:</p>
<pre><code class="language-cpp">Matrix a,b,c;
c = a + b;
</code></pre>
<p>Dann erzeugt a + b ja eine neue Instanz von Matrix, die nach der Zuweisung als verwaistes Objekt im Speicher liegt. (Wie) Kann man sowas elegant umgehen?</p>
<p>Gruß Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/209123/memory-leak-bei-überladenen-operatoren-verhindern</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 12:33:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/209123.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 26 Mar 2008 22:54:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Memory leak bei überladenen Operatoren verhindern on Wed, 26 Mar 2008 22:54:10 GMT]]></title><description><![CDATA[<p>Hallo alle zusammen,</p>
<p>ich will mal einige numerische Verfahren implementieren und bin dabei auf eine Frage gestoßen. Meine Klassendefinition sieht so aus:</p>
<pre><code class="language-cpp">class Matrix {
    [...]
    Matrix&amp; operator=(const Matrix&amp; original);
    Matrix&amp; operator+(const Matrix&amp; summand);
    [...]
    int m_rows, m_cols;
};

[...]

Matrix&amp; Matrix::operator+(const Matrix&amp; original) {
    Matrix* tmp = new Matrix(m_rows, m_cols);
    [...]
    return *tmp;
}
</code></pre>
<p>Das Problem ergibt sich dann, wenn ich sowas schreibe wie:</p>
<pre><code class="language-cpp">Matrix a,b,c;
c = a + b;
</code></pre>
<p>Dann erzeugt a + b ja eine neue Instanz von Matrix, die nach der Zuweisung als verwaistes Objekt im Speicher liegt. (Wie) Kann man sowas elegant umgehen?</p>
<p>Gruß Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1481062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481062</guid><dc:creator><![CDATA[gurumusch]]></dc:creator><pubDate>Wed, 26 Mar 2008 22:54:10 GMT</pubDate></item><item><title><![CDATA[Reply to Memory leak bei überladenen Operatoren verhindern on Wed, 26 Mar 2008 22:58:54 GMT]]></title><description><![CDATA[<p>Kommst du zufällig von Java?</p>
<p>In C++ müssen Objekte nämlich nicht mit new angelegt werden.</p>
<p>Du kannst auch einfach schreiben:</p>
<pre><code class="language-cpp">Matrix&amp; Matrix::operator+(const Matrix&amp; original) { 
    Matrix tmp(m_rows, m_cols); 
    [...] 
    return tmp; 
}
</code></pre>
<p>Auf Member wird dann per . anstatt -&gt; zugegriffen.</p>
<p>Ps:<br />
Außerdem solltest du keine Referenz zurückgeben, da die sonst auf ein gelöschtes Objekt zeigt, da der Scope der Funktion verlassen wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1481063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481063</guid><dc:creator><![CDATA[The-Kenny]]></dc:creator><pubDate>Wed, 26 Mar 2008 22:58:54 GMT</pubDate></item><item><title><![CDATA[Reply to Memory leak bei überladenen Operatoren verhindern on Wed, 26 Mar 2008 23:03:54 GMT]]></title><description><![CDATA[<p>Nicht Matrix&amp; zurückgeben, sondern einfach Matrix.<br />
Copy- Constructor und Assignment- Operator muss implementiert sein.</p>
<p>Edit: Nimm Dir doch als Bsp. std::complex&lt;T&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1481065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481065</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Wed, 26 Mar 2008 23:03:54 GMT</pubDate></item><item><title><![CDATA[Reply to Memory leak bei überladenen Operatoren verhindern on Wed, 26 Mar 2008 23:16:38 GMT]]></title><description><![CDATA[<p>Ja, ich komme tatsächlich von Java und habe noch nicht viel Erfahrung mit c++, aber bei solchen Projekten ist dann Operatorüberladung einfach deutlich von Vorteilen.<br />
Bei der Methode mit den Copy-Konstruktoren würde dann doch bei</p>
<pre><code class="language-cpp">a = b + c * d;
</code></pre>
<p>z.B für c * d und für b + c * d je eine Instanz erzeugt werden. Endet dann deren Scope am Ende der Zeile?</p>
<p>Gruß Andreas</p>
<p>PS: Danke für eure schnellen Antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1481073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481073</guid><dc:creator><![CDATA[gurumusch]]></dc:creator><pubDate>Wed, 26 Mar 2008 23:16:38 GMT</pubDate></item><item><title><![CDATA[Reply to Memory leak bei überladenen Operatoren verhindern on Thu, 27 Mar 2008 00:58:53 GMT]]></title><description><![CDATA[<p>gurumusch schrieb:</p>
<blockquote>
<p>[...]Endet dann deren Scope am Ende der Zeile?</p>
</blockquote>
<p>Der Scope liegt zwischen den geschwungenen Klammern:</p>
<pre><code class="language-cpp">{
    obj a;
    {
        obj b;
    }//b wird zerstört
}//a wird zerstört
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1481098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481098</guid><dc:creator><![CDATA[The-Kenny]]></dc:creator><pubDate>Thu, 27 Mar 2008 00:58:53 GMT</pubDate></item><item><title><![CDATA[Reply to Memory leak bei überladenen Operatoren verhindern on Thu, 27 Mar 2008 07:01:46 GMT]]></title><description><![CDATA[<p>c++ besitzt tatsächlich harte scopes. im gegensatz zu java werden lokale objekte (ohne new erzeugt) sofort bei verlassen ihres scopes zerstört.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1481123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481123</guid><dc:creator><![CDATA[javac++]]></dc:creator><pubDate>Thu, 27 Mar 2008 07:01:46 GMT</pubDate></item><item><title><![CDATA[Reply to Memory leak bei überladenen Operatoren verhindern on Thu, 27 Mar 2008 07:42:26 GMT]]></title><description><![CDATA[<p>Danke für eure Hilfe. Also, jetzt sieht es dann so aus:</p>
<pre><code class="language-cpp">class Matrix {
    [...]
    Matrix(const Matrix&amp; original)
    Matrix operator=(const Matrix&amp; original);
    Matrix operator+(const Matrix&amp; summand);
    [...]
    int m_rows, m_cols;
};

[...]
</code></pre>
<p>Ich schätze, ich werde werde c++ an der Stelle auch etwas besser verstehen, wenn ich es erstmal 2-3 mal debuggt habe.</p>
<p>Gruß Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1481129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481129</guid><dc:creator><![CDATA[gurumusch]]></dc:creator><pubDate>Thu, 27 Mar 2008 07:42:26 GMT</pubDate></item><item><title><![CDATA[Reply to Memory leak bei überladenen Operatoren verhindern on Thu, 27 Mar 2008 08:24:48 GMT]]></title><description><![CDATA[<p>Um die temporären Variablen und ihr Verhalten zu beobachten und verstehen könntest du im Kontruktor und Destruktor ein kurzes cout-statement einbauen - dann siehst du auch wie der Kompiler die temporären Objekte eventuell wegoptimiert..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1481149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481149</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 27 Mar 2008 08:24:48 GMT</pubDate></item><item><title><![CDATA[Reply to Memory leak bei überladenen Operatoren verhindern on Thu, 27 Mar 2008 11:10:08 GMT]]></title><description><![CDATA[<p>Beim Assignement Operator sollte eine Referenz zurückgegeben werden.<br />
(Sorry, dass ich das nicht schon oben geschrieben habe.)</p>
<pre><code class="language-cpp">// Dekl.
Matrix&amp; operator=(const Matrix&amp; original);

// Impl.
Matrix&amp; Matrix::operator=(const Matrix&amp; original)
{
   //
   // kopieren der Member...
   //
   return *this;
}
</code></pre>
<p>Bei den Überladungen +, -, *, / sollten Kopien zurückgegeben werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1481172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1481172</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Thu, 27 Mar 2008 11:10:08 GMT</pubDate></item></channel></rss>