<?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[Probleme mit Pointerübergabe und Heap Speicher]]></title><description><![CDATA[<p>Hallo C++ Community,</p>
<p>und zwar habe ich ein Problem mit der Übergabe von Instanzen oder ein Problem mit dem Heap, bin mir da nicht ganz sicher.</p>
<p>Erstmal zum Verständnis: Ich möchte ein Klasse zur Berechnung mit Matrizen programmieren.<br />
Habe mir dazu ne Klasse Matrix erschaffen, welche in einer Headerdatei steht.</p>
<pre><code>//Matrix.h

#ifndef Matrix_H
    #define Matrix_H

#include &lt;iostream&gt;
#include &lt;ostream&gt;
#include &lt;iomanip&gt;

enum Matrix_Error{NO_ERROR = 0, DIMENSION_ERROR = 1, MATRIX_NOT_FILLED = 2, DIMENSION_TO_HIGH = 3};

class Matrix
{
private:
    int rows;
    int cols;
    double* pArray = NULL;
    Matrix_Error err = NO_ERROR;

public:
    Matrix()
        :rows(0), cols(0)
    {
        pArray = new double[rows * cols];
    }

    Matrix(int _rows, int _columns)
        :rows(_rows), cols(_columns)
    {
        pArray = new double[rows * cols];

        for(int i = 0; i &lt; rows * cols; i++)
        {
            pArray[i]  = 0;
        }
    }

    double* operator[](int row)
    {
        return &amp;pArray[row * cols];
    }

    ~Matrix()
    {
        delete [] pArray;
        pArray = NULL;
    }

    //Memberfunctions
    void Get();
    Matrix operator +(Matrix &amp;m2);
};

#endif // Matrix_H
</code></pre>
<p>Die Klasse funktioniert so, dass ich mir mit</p>
<pre><code>Matrix mat(3,3);
</code></pre>
<p>Eine 3 x 3 Matrix erschaffe.<br />
Diese kann ich dann einfach verwalten wie ein 2-dimensionales Array, dazu habe ich den Operator [] überladen.<br />
Als Memberfunktionen habe ich jetzt als Beispiel mal den '+' Operator und die Funktion Get().<br />
Get gibt mir einfach die Matrix in das Konsolenfenster.</p>
<p>Definiert habe ich die Funktionen in einer Matrix.cpp</p>
<pre><code>//Matrix.cpp
#include &quot;Matrix.h&quot;
#include &lt;cmath&gt;
#include &lt;iostream&gt;

void Matrix::Get()
{
    Matrix m(*this);

    for(int i = 0; i &lt; rows; i++)
    {
        std::cout &lt;&lt; &quot;(&quot;;

        for(int j = 0; j &lt; cols; j++)
        {
            std::cout &lt;&lt; std::setw(5) &lt;&lt; m[i][j] &lt;&lt; &quot; &quot;;
        }

        std::cout &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;
    }
}

Matrix Matrix::operator +(Matrix &amp;m2)
{
    Matrix m1(*this), tmp(rows, cols);

    if(m1.rows != m2.rows || m1.cols != m2.cols)
    {
        SetError(DIMENSION_ERROR);
        return tmp;
    } else
    {
        for(int i = 0; i &lt; rows; i++)
        {
            for(int j = 0; j &lt; cols; j++)
            {
                tmp[i][j] = m1[i][j] + m2[i][j];
            }
        }

        return tmp;
    }
}
</code></pre>
<p>Jetzt zu meinen Problem:</p>
<p>Wenn ich mir in main() 2 2x2-Matrizen erschaffe und diese addieren möchte, werden diese irgendwie nicht korrekt an meinen +-operator übergeben.</p>
<p>Stattdessen hat meine erste übergeben Matrix m1(*this) als werte (0 0 0 0)<br />
und meine Matrix m2 (1.39575e-307 0 0 0).</p>
<p>Irgendwie verstehe ich nicht warum, da mein Programm gestern noch einwandfrei funktionierte?</p>
<p>Meine main() Funktion zum testen sieht so aus:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;ctime&gt;
#include &lt;cstdlib&gt;
#include &quot;Matrix.h&quot;

using namespace std;

void FillMatrix(Matrix &amp;mat)
{
    int r, c;
    time_t t;

    time(&amp;t);
    srand((unsigned int)t);

    mat.GetDimensions(r, c);

    for(int i = 0; i &lt; r; i++)
    {
        for(int j = 0; j &lt; c; j++)
        {
            mat[i][j] = (double)(rand() % 99 + 1);
        }
    }
}

int main()
{
    Matrix mat1(3, 3), mat2(3, 3), mat3;

    FillMatrix(mat1);
    FillMatrix(mat2);

    mat1.Get();
    cout &lt;&lt; &quot;+&quot; &lt;&lt; endl;
    mat2.Get();
    cout &lt;&lt; &quot;=&quot; &lt;&lt; endl;
    mat3 = mat1 + mat2;
    mat3.Get();

    return 0;
}
</code></pre>
<p>Vielen Dank schonmal für eure Hilfe.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/337849/probleme-mit-pointerübergabe-und-heap-speicher</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 16:44:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/337849.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 04 May 2016 12:34:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit Pointerübergabe und Heap Speicher on Wed, 04 May 2016 12:34:55 GMT]]></title><description><![CDATA[<p>Hallo C++ Community,</p>
<p>und zwar habe ich ein Problem mit der Übergabe von Instanzen oder ein Problem mit dem Heap, bin mir da nicht ganz sicher.</p>
<p>Erstmal zum Verständnis: Ich möchte ein Klasse zur Berechnung mit Matrizen programmieren.<br />
Habe mir dazu ne Klasse Matrix erschaffen, welche in einer Headerdatei steht.</p>
<pre><code>//Matrix.h

#ifndef Matrix_H
    #define Matrix_H

#include &lt;iostream&gt;
#include &lt;ostream&gt;
#include &lt;iomanip&gt;

enum Matrix_Error{NO_ERROR = 0, DIMENSION_ERROR = 1, MATRIX_NOT_FILLED = 2, DIMENSION_TO_HIGH = 3};

class Matrix
{
private:
    int rows;
    int cols;
    double* pArray = NULL;
    Matrix_Error err = NO_ERROR;

public:
    Matrix()
        :rows(0), cols(0)
    {
        pArray = new double[rows * cols];
    }

    Matrix(int _rows, int _columns)
        :rows(_rows), cols(_columns)
    {
        pArray = new double[rows * cols];

        for(int i = 0; i &lt; rows * cols; i++)
        {
            pArray[i]  = 0;
        }
    }

    double* operator[](int row)
    {
        return &amp;pArray[row * cols];
    }

    ~Matrix()
    {
        delete [] pArray;
        pArray = NULL;
    }

    //Memberfunctions
    void Get();
    Matrix operator +(Matrix &amp;m2);
};

#endif // Matrix_H
</code></pre>
<p>Die Klasse funktioniert so, dass ich mir mit</p>
<pre><code>Matrix mat(3,3);
</code></pre>
<p>Eine 3 x 3 Matrix erschaffe.<br />
Diese kann ich dann einfach verwalten wie ein 2-dimensionales Array, dazu habe ich den Operator [] überladen.<br />
Als Memberfunktionen habe ich jetzt als Beispiel mal den '+' Operator und die Funktion Get().<br />
Get gibt mir einfach die Matrix in das Konsolenfenster.</p>
<p>Definiert habe ich die Funktionen in einer Matrix.cpp</p>
<pre><code>//Matrix.cpp
#include &quot;Matrix.h&quot;
#include &lt;cmath&gt;
#include &lt;iostream&gt;

void Matrix::Get()
{
    Matrix m(*this);

    for(int i = 0; i &lt; rows; i++)
    {
        std::cout &lt;&lt; &quot;(&quot;;

        for(int j = 0; j &lt; cols; j++)
        {
            std::cout &lt;&lt; std::setw(5) &lt;&lt; m[i][j] &lt;&lt; &quot; &quot;;
        }

        std::cout &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;
    }
}

Matrix Matrix::operator +(Matrix &amp;m2)
{
    Matrix m1(*this), tmp(rows, cols);

    if(m1.rows != m2.rows || m1.cols != m2.cols)
    {
        SetError(DIMENSION_ERROR);
        return tmp;
    } else
    {
        for(int i = 0; i &lt; rows; i++)
        {
            for(int j = 0; j &lt; cols; j++)
            {
                tmp[i][j] = m1[i][j] + m2[i][j];
            }
        }

        return tmp;
    }
}
</code></pre>
<p>Jetzt zu meinen Problem:</p>
<p>Wenn ich mir in main() 2 2x2-Matrizen erschaffe und diese addieren möchte, werden diese irgendwie nicht korrekt an meinen +-operator übergeben.</p>
<p>Stattdessen hat meine erste übergeben Matrix m1(*this) als werte (0 0 0 0)<br />
und meine Matrix m2 (1.39575e-307 0 0 0).</p>
<p>Irgendwie verstehe ich nicht warum, da mein Programm gestern noch einwandfrei funktionierte?</p>
<p>Meine main() Funktion zum testen sieht so aus:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;ctime&gt;
#include &lt;cstdlib&gt;
#include &quot;Matrix.h&quot;

using namespace std;

void FillMatrix(Matrix &amp;mat)
{
    int r, c;
    time_t t;

    time(&amp;t);
    srand((unsigned int)t);

    mat.GetDimensions(r, c);

    for(int i = 0; i &lt; r; i++)
    {
        for(int j = 0; j &lt; c; j++)
        {
            mat[i][j] = (double)(rand() % 99 + 1);
        }
    }
}

int main()
{
    Matrix mat1(3, 3), mat2(3, 3), mat3;

    FillMatrix(mat1);
    FillMatrix(mat2);

    mat1.Get();
    cout &lt;&lt; &quot;+&quot; &lt;&lt; endl;
    mat2.Get();
    cout &lt;&lt; &quot;=&quot; &lt;&lt; endl;
    mat3 = mat1 + mat2;
    mat3.Get();

    return 0;
}
</code></pre>
<p>Vielen Dank schonmal für eure Hilfe.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494877</guid><dc:creator><![CDATA[AlexR]]></dc:creator><pubDate>Wed, 04 May 2016 12:34:55 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Pointerübergabe und Heap Speicher on Wed, 04 May 2016 12:54:30 GMT]]></title><description><![CDATA[<p>1. Deine Ressourcenverwaltung ist falsch. Regel der großen Drei/Fünf nicht beachtet.<br />
2. Designfehler: Eine Matrix sollte sowieso nichts mit Ressourcenverwaltung am Hut haben. Das ist nicht ihre Kernaufgabe. Lass eine Ressourcenverwaltungsklasse das machen und dafür dann richtig.<br />
3. Solche Ressourcenverwaltungsklassen gibt es natürlich schon haufenweise fertig in der Standardbibliothek. Hier böte sich beispielsweise sehr stark std::vector an. Der macht dann auch Punkt 1 richtig.</p>
<p>Wenn die Probleme nach Behebung dieser Fehler weiter bestehen, dann melde dich noch einmal. Den Rest des Codes habe ich mir nämlich nicht weiter angesehen, nachdem ich dieses Problem erkannt hatte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494879</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 04 May 2016 12:54:30 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Pointerübergabe und Heap Speicher on Wed, 04 May 2016 13:05:04 GMT]]></title><description><![CDATA[<p>Warum erzeugst du überhaupt eine Kopie von this?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494880</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 04 May 2016 13:05:04 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Pointerübergabe und Heap Speicher on Wed, 04 May 2016 13:13:42 GMT]]></title><description><![CDATA[<p>Hab ich mir schon gedacht, dass irgendwas mit der Speicherverwaltung nicht funktioniert, da mein Programm auch häufig absürzt.</p>
<p>Werde denke in den sauren Apfel beißen müssen und mir die Klasse mit std::vectoren neu schreiben müssen.</p>
<p>Die Kopie von this habe ich mir erstellt, da ich mit einer neuen Matrix handlicher arbeiten kann.</p>
<p>Danke für eure Hilfe</p>
<p>Gruß</p>
<p>Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494882</guid><dc:creator><![CDATA[AlexR]]></dc:creator><pubDate>Wed, 04 May 2016 13:13:42 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Pointerübergabe und Heap Speicher on Wed, 04 May 2016 13:33:55 GMT]]></title><description><![CDATA[<p>AlexR schrieb:</p>
<blockquote>
<p>Die Kopie von this habe ich mir erstellt, da ich mit einer neuen Matrix handlicher arbeiten kann.</p>
</blockquote>
<p>Ja dann ...<br />
Bei Matrizenrechnung kommt es ja auf Performance nicht an ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494883</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 04 May 2016 13:33:55 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Pointerübergabe und Heap Speicher on Wed, 04 May 2016 13:38:33 GMT]]></title><description><![CDATA[<p>Mit einem std::vector brauchst du zusätzlich auch keine Kopieroperatoren implementieren, was du jetzt auch nicht hast, deswegen die Laufzeitfehler, das macht der std::vector selbst. Auch kannst du dir überlegen, ob du nicht lieber auf statische Arrays mit zur Kompilierzeit bekannten Größen setzt, schließlich ändert so eine Matrix selten ihre Größe während der Laufzeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494885</guid><dc:creator><![CDATA[Techel]]></dc:creator><pubDate>Wed, 04 May 2016 13:38:33 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Pointerübergabe und Heap Speicher on Wed, 04 May 2016 13:41:29 GMT]]></title><description><![CDATA[<p>Kopie, um handlicher zu arbeiten?! Und das bei einer Ausgabefunktion? Das erschließt sich mir nicht.</p>
<p>Und dein erster Konstuktor, der rows=0, cols=0 setzt, der macht dann ein <code>new double[0]</code> , gibt dir also einen Pointer, den du nicht sinnvoll nutzen kannst.</p>
<p>Also ersetze pArray doch einfach durch einen <code>vector&lt;double&gt; daten</code> . Dein 2. Konstruktor wird auch einfacher:</p>
<pre><code>Matrix(int _rows, int _columns)
    : rows(_rows)
    , cols(_columns)
    , daten(_rows * _cols)
{}
</code></pre>
<p>Dein Destruktor fällt komplett weg und dein operator[] kann praktisch gleich bleiben, wo ist also der saure Apfel, in den du beißen musst?</p>
<p>(Es gibt natürlich schon haufenweise Bibliotheken für Matrix-Multiplikation, ich nehme also an, du machst das zum Lernen?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494886</guid><dc:creator><![CDATA[wob]]></dc:creator><pubDate>Wed, 04 May 2016 13:41:29 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Pointerübergabe und Heap Speicher on Wed, 04 May 2016 14:45:46 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke für eure Antworten. Hab das Array jetzt durch einen std::vector ersetzt.<br />
Funktioniert soweit erstmal.</p>
<p>Ein Problem habe ich aber noch, da es anscheinend sehr verpönt ist eine Kopie von *this zu erzeugen.</p>
<p>Wenn ich die Kopie nicht mache, wie kann ich denn dann auf die einzelnen Elemente meiner Instanz zugreifen?</p>
<p>wenn ich versuche über this[i][j] die daten zu bekommen, ist meine Ausgabe auf die Konsole total falsch.<br />
Benutze ich jedoch die Kopie von this stimmt meine Ausgabe mit Get().</p>
<p>Was kann ich also machen um per Get() die richtigen Ausgaben zu bekommen?</p>
<p>Meine Motivation hinter dem ganzen ist mehr C++ zu lernen.<br />
Finde es irgendwie cool was eigenes zu erschaffen, auch wenn es effizienter wäre auf eine fertige Bibliothek zuzugreifen.</p>
<p>Danke und Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494901</guid><dc:creator><![CDATA[AlexR]]></dc:creator><pubDate>Wed, 04 May 2016 14:45:46 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Pointerübergabe und Heap Speicher on Wed, 04 May 2016 14:52:11 GMT]]></title><description><![CDATA[<p>AlexR schrieb:</p>
<blockquote>
<p>Ein Problem habe ich aber noch, da es anscheinend sehr verpönt ist eine Kopie von *this zu erzeugen.</p>
</blockquote>
<p>Nicht verpönt, hier aber total unnötig - es gibt einfach keinen Grund dazu.</p>
<p>AlexR schrieb:</p>
<blockquote>
<p>Wenn ich die Kopie nicht mache, wie kann ich denn dann auf die einzelnen Elemente meiner Instanz zugreifen?</p>
<p>wenn ich versuche über this[i][j] die daten zu bekommen, ist meine Ausgabe auf die Konsole total falsch.</p>
</blockquote>
<p>Entweder operierst du direkt auf dem entsprechenden Member (in deinem Code <code>pArray</code> ) oder greifst mit <code>(*this)[i][j]</code> darauf zu. Mit <code>(*this)</code> dereferenzierst du den Zeiger auf das eigene Objekt und erhältst eine Referenz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494903</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 04 May 2016 14:52:11 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Pointerübergabe und Heap Speicher on Wed, 04 May 2016 14:52:58 GMT]]></title><description><![CDATA[<p>AlexR schrieb:</p>
<blockquote>
<p>wenn ich versuche über this[i][j] die daten zu bekommen,</p>
</blockquote>
<p>(*this)[i][j]<br />
const Matrix&amp; m1 = *this<br />
Matrix operator +(const Matrix &amp;m2, const Matrix &amp;m2)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494904</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 04 May 2016 14:52:58 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Pointerübergabe und Heap Speicher on Wed, 04 May 2016 15:11:54 GMT]]></title><description><![CDATA[<p>AlexR schrieb:</p>
<blockquote>
<p>Ein Problem habe ich aber noch, da es anscheinend sehr verpönt ist eine Kopie von *this zu erzeugen.</p>
</blockquote>
<p>Ich mach mal einen Autovergleich (etwas weit hergeholt, aber vielleicht gar nicht so schlecht):</p>
<p>Angenommen, du möchtest ein Auto probefahren (= Matrix ausgeben). Dann suchst du dir einen Mechaniker, der das Auto komplett nachbaut (=kopiert), dann machst du eine Probefahrt in dem nachgebauten Auto (=ausgeben der Matrix) und schließlich verschrottest du das nachgebaute Auto wieder (=Destruktor der Kopie). Klingt das für dich nicht auch sehr aufwendig?</p>
<p>Wäre es nicht einfacher, direkt das Auto probezufahren (=Ausgeben der Matrix ohne Kopie)?</p>
<p>Also merke: keine unnützen Kopien!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494908</guid><dc:creator><![CDATA[wob]]></dc:creator><pubDate>Wed, 04 May 2016 15:11:54 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Pointerübergabe und Heap Speicher on Fri, 06 May 2016 07:59:15 GMT]]></title><description><![CDATA[<p>Danke für eure Tips,<br />
ich habe mich so auf den this zeiger versteift, dass ich vergessen habe innerhalb der Instanz einfach auf das Array direkt zuzugreifen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Das kopieren ist natürlich unsinnig, ich sehe es ein.</p>
<p>Danke für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2495041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2495041</guid><dc:creator><![CDATA[AlexR]]></dc:creator><pubDate>Fri, 06 May 2016 07:59:15 GMT</pubDate></item></channel></rss>