<?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[double free or corruption (top)]]></title><description><![CDATA[<p>Hallo,</p>
<p>meine erster Eintrag hier.<br />
Ich habe mir die folgende Klasse Matrix geschrieben, die auch soweit funktioniert.</p>
<pre><code>template&lt;typename T&gt;
class matrix{
public:
    matrix(T zeilen_, T spalten_):zeilen(zeilen_),spalten(spalten_){matrix_=new T[zeilen*spalten];}
    ~matrix(){delete[] matrix_;}

    T size_zeilen(){return(zeilen);}
    T size_spalten(){return(spalten);}
    T&amp; operator()(T i, T j){return(matrix_[((i*spalten)+j)]);}
    T* operator[](T i){return(matrix_+i*spalten);}

private:
    T zeilen, spalten;
    T *matrix_;
};
</code></pre>
<p>Mit dem Additionsoperator</p>
<pre><code>template&lt;typename T&gt;
matrix&lt;T&gt; operator+( matrix&lt;T&gt; lhs, matrix&lt;T&gt; rhs){

    matrix&lt;T&gt; neu(lhs.size_zeilen(),lhs.size_spalten());
    for(int i=0;i&lt;lhs.size_zeilen();i++)
    {
        for(int j=0;j&lt;lhs.size_spalten();j++)
        {
            neu(i,j) = lhs(i,j)+rhs(i,j);
        }
    }

    //cout&lt;&lt;&amp;neu(10,10)&lt;&lt;endl;
    return(neu);
}
</code></pre>
<p>Main Funktion</p>
<pre><code>int main()
{
    matrix&lt;int&gt; B(20,20);
    matrix&lt;int&gt; A(20,20);

    for(int i =0;i&lt;20;i++){
        for(int j =0;j&lt;20;j++){
            B(i,j)=1;
            A(i,j) = 2;
            //cout&lt;&lt;B[i][j];
        }
    }

    matrix&lt;int&gt; Z(20,20);
    Z = A + B;
    for(int i = 0;i&lt;19;i++)
    {
        for(int j = 0;j&lt;20;j++)
        {
            cout&lt;&lt;Z(i,j);
        }
        cout&lt;&lt;endl;
    }

    //cout&lt;&lt;&amp;Z(10,10)&lt;&lt;endl;

    return 0;
}
</code></pre>
<p>Folgendes Problem stellt sich ein.<br />
Deklariere und Initialisiere die Matrizen A und B diese sollen zu Z addiert werden, funktioniert.<br />
Nun beim übergeben der Matrix neu (Summe von A und B), die am ende gelöscht wird, jedoch Z zeigt immer noch auf neu und beim return 0 kommt halt logischerweise folgende Fehlermeldung: double free or corruption (top).<br />
Z zeigt auf einen Speicherbereich der nicht mehr existiert....</p>
<p>Wie löse ich dieses Problem?</p>
<p>Vielen Dank <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/topic/329678/double-free-or-corruption-top</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 20:55:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/329678.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 03 Dec 2014 14:28:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to double free or corruption (top) on Wed, 03 Dec 2014 14:37:21 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>meine erster Eintrag hier.<br />
Ich habe mir die folgende Klasse Matrix geschrieben, die auch soweit funktioniert.</p>
<pre><code>template&lt;typename T&gt;
class matrix{
public:
    matrix(T zeilen_, T spalten_):zeilen(zeilen_),spalten(spalten_){matrix_=new T[zeilen*spalten];}
    ~matrix(){delete[] matrix_;}

    T size_zeilen(){return(zeilen);}
    T size_spalten(){return(spalten);}
    T&amp; operator()(T i, T j){return(matrix_[((i*spalten)+j)]);}
    T* operator[](T i){return(matrix_+i*spalten);}

private:
    T zeilen, spalten;
    T *matrix_;
};
</code></pre>
<p>Mit dem Additionsoperator</p>
<pre><code>template&lt;typename T&gt;
matrix&lt;T&gt; operator+( matrix&lt;T&gt; lhs, matrix&lt;T&gt; rhs){

    matrix&lt;T&gt; neu(lhs.size_zeilen(),lhs.size_spalten());
    for(int i=0;i&lt;lhs.size_zeilen();i++)
    {
        for(int j=0;j&lt;lhs.size_spalten();j++)
        {
            neu(i,j) = lhs(i,j)+rhs(i,j);
        }
    }

    //cout&lt;&lt;&amp;neu(10,10)&lt;&lt;endl;
    return(neu);
}
</code></pre>
<p>Main Funktion</p>
<pre><code>int main()
{
    matrix&lt;int&gt; B(20,20);
    matrix&lt;int&gt; A(20,20);

    for(int i =0;i&lt;20;i++){
        for(int j =0;j&lt;20;j++){
            B(i,j)=1;
            A(i,j) = 2;
            //cout&lt;&lt;B[i][j];
        }
    }

    matrix&lt;int&gt; Z(20,20);
    Z = A + B;
    for(int i = 0;i&lt;19;i++)
    {
        for(int j = 0;j&lt;20;j++)
        {
            cout&lt;&lt;Z(i,j);
        }
        cout&lt;&lt;endl;
    }

    //cout&lt;&lt;&amp;Z(10,10)&lt;&lt;endl;

    return 0;
}
</code></pre>
<p>Folgendes Problem stellt sich ein.<br />
Deklariere und Initialisiere die Matrizen A und B diese sollen zu Z addiert werden, funktioniert.<br />
Nun beim übergeben der Matrix neu (Summe von A und B), die am ende gelöscht wird, jedoch Z zeigt immer noch auf neu und beim return 0 kommt halt logischerweise folgende Fehlermeldung: double free or corruption (top).<br />
Z zeigt auf einen Speicherbereich der nicht mehr existiert....</p>
<p>Wie löse ich dieses Problem?</p>
<p>Vielen Dank <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/2430922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430922</guid><dc:creator><![CDATA[User01815]]></dc:creator><pubDate>Wed, 03 Dec 2014 14:37:21 GMT</pubDate></item><item><title><![CDATA[Reply to double free or corruption (top) on Wed, 03 Dec 2014 14:42:34 GMT]]></title><description><![CDATA[<p>Nein, Z ist ja kein Pointer. Z ist ein Objekt auf dem Stack.<br />
Das Problem ist, dass du mit <code>neu</code> ein Objekt zurückgibst, welches selbst einen Pointer namens <code>matrix_</code> hat.</p>
<p>Zum Verständis: wenn das Objekt zurückgegeben wird, werden die Elemente 1:1 vom alten ( <code>neu</code> ) zum neuen ( <code>Z</code> ) Objekt zugewiesen. Auch der <code>matrix_</code> -Pointer. Aber danach wird für <code>neu</code> der Destruktor aufgerufen, und der Speicherbereich, auf den der Pointer zeigte, wird ungültig.</p>
<p>Wenn am Ende von <code>main</code> Z zerstört werden soll, wird WIEDER die gleiche Adresse zum Freigeben weitergegeben. Der Speicherbereich wurde aber bereits freigegeben.</p>
<p>Lösung: noch den =-Operator überladen, damit dieser eine tiefe Kopie deines Objektes macht. Damit jedes Objekt seinen eigenen Speicherbereich hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430926</guid><dc:creator><![CDATA[dachschaden]]></dc:creator><pubDate>Wed, 03 Dec 2014 14:42:34 GMT</pubDate></item><item><title><![CDATA[Reply to double free or corruption (top) on Wed, 03 Dec 2014 15:03:03 GMT]]></title><description><![CDATA[<p>Benutze std::vector statt new/delete</p>
<p>operator+ sollte sicher auch keine Kopien machen.</p>
<p>return ist kein Funktionsaufruf, () ist überflüssig</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430937</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 03 Dec 2014 15:03:03 GMT</pubDate></item><item><title><![CDATA[Reply to double free or corruption (top) on Wed, 10 Dec 2014 13:52:29 GMT]]></title><description><![CDATA[<p>Danke für die Antworten.</p>
<p>Hab den Operator= folgend überladen damit geht es nun.</p>
<pre><code>matrix&lt;T&gt;&amp; operator=(matrix&lt;T&gt; rhs){
        if (this == &amp;rhs)
            return *this;

        swap(matrix_,rhs.matrix_);
        return *this;
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2432146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2432146</guid><dc:creator><![CDATA[User01815]]></dc:creator><pubDate>Wed, 10 Dec 2014 13:52:29 GMT</pubDate></item><item><title><![CDATA[Reply to double free or corruption (top) on Wed, 10 Dec 2014 14:03:53 GMT]]></title><description><![CDATA[<p>Fehlt immer noch Copyctor.<br />
Mach dir dein Leben nicht schwerer als ohnehin und benutze std::vector. Dann sparste dir das schreiben von Konstruktor, Destruktor, Kopierkonstruktor und Assignmentoperator bei keinen Geschwindigkeitsverlust.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2432150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2432150</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 10 Dec 2014 14:03:53 GMT</pubDate></item><item><title><![CDATA[Reply to double free or corruption (top) on Wed, 10 Dec 2014 14:17:35 GMT]]></title><description><![CDATA[<p>User01815 schrieb:</p>
<blockquote>
<p>Danke für die Antworten.</p>
<p>Hab den Operator= folgend überladen damit geht es nun.</p>
<pre><code>matrix&lt;T&gt;&amp; operator=(matrix&lt;T&gt; rhs){
        if (this == &amp;rhs)
            return *this;

        swap(matrix_,rhs.matrix_);
        return *this;
    }
</code></pre>
</blockquote>
<p>Das if kannste dir sparen, das wird nie wahr sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2432155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2432155</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Wed, 10 Dec 2014 14:17:35 GMT</pubDate></item></channel></rss>