<?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[Segmentation fault&#x2F;SIGSEGV&#x2F; Speicherzugriffsfehler]]></title><description><![CDATA[<p>Hi Leutz,</p>
<p>ich hab ein zweites Problem mit meinem Programm von hier:<a href="http://www.c-plusplus.net/forum/288066-20?sid=f36e40c5191825fe2e2e8bad237f5dac" rel="nofollow">http://www.c-plusplus.net/forum/288066-20?sid=f36e40c5191825fe2e2e8bad237f5dac</a></p>
<p>Ich hab mittlerweile ein wenig überarbeitet und unten die aktuelle Version reingestellt. Wie schon im verlinkten Post gesagt, brauchen wir uns über die Sinnhaftigkeit der Aufgabenstellung nicht zu unterhalten. Da gibts nicht viel Sinnvolles.(inkl der Umsetzung)</p>
<p>Meine Frage: Wenn ich das Programm kompiliere bekomme ich bei MatrixC.print bzw, wenn ich die Zeile (23 in der main.cpp) auskommentiere beim Aufruf von MatrixD.print den Fehler: Segmentation fault.<br />
In den Funktionen transpose und den globalen überladenen arithmetischen operator+ bzw operator* (alle matrix.cpp), erstelle ich via new neue Objekte und übergebe diese. Meiner Meinung nach müssten die Objekte und damit ihr Speicherbereich deshalb weiterhin gültig sein, und bei der Zuweisung MatrixD= bzw. MatrixC= müssten, meiner Meinung nach, auch die Adressen an die entsprechenden Pointer (mat) weitergegeben werden. Offensichtlich ist das OS da anderer Meinung... <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>Deshalb hätte ich gern eure Meinung gehört, thx!</p>
<p><strong>matrix.hpp</strong></p>
<pre><code class="language-cpp">#ifndef _MATRIX_H_
#define _MATRIX_H_
#include &lt;iostream&gt;
#include &lt;cassert&gt;
using namespace std;
class Zeile
{
private:
    int *z;
    int size;
public:
// zu implementieren: Konstruktor und Destruktor
    Zeile( int s);
    ~Zeile();
// Indexoperator [] ist (in zwei Versionen) bereits implementiert für die Klasse Zeile
    int&amp; operator[](int i)
    {
        assert(i &gt;= 0 &amp;&amp; i &lt; size);
        return z[i];
    }
    const int&amp; operator[](int i) const
    {
        assert(i &gt;= 0 &amp;&amp; i &lt; size);
        return z[i];
    }
};
class Matrix
{
private:
    Zeile **mat; // Zeiger auf &quot;Zeilen&quot;-Vektor
    int nrows, ncols; // Zeilen- und Spaltenzahl
    void init(int z, int s);
public:
//zu implementieren: Zwei Konstruktoren, ein Kopierkonstruktor und ein Destruktor
    Matrix( int _nrows , int _ncols);
    Matrix( int z, int s, int wert);
    Matrix( const Matrix&amp; m);
    ~Matrix();
    int getRows()const
    {
        return nrows;
    }
    int getCols()const
    {
        return ncols;
    }
// zu implementieren: Indexoperator [] (in zwei Versionen) für die Klasse Matrix
    Zeile&amp; operator[](int i)
    {
        assert(i &gt;= 0 &amp;&amp; i &lt; nrows);
        return **(mat+i);
    }
    const Zeile&amp; operator[](int i) const
    {
        assert(i &gt;= 0 &amp;&amp; i &lt; nrows);
        return **(mat+i);
    }
// zu implementieren: Transponierte der Matrix
    Matrix transpose();
// zu implementieren: Ausgabe, Addition und Multiplikation
    void print();
    friend Matrix operator+(const Matrix&amp; ma, const Matrix&amp; mb);
    friend Matrix operator*(const Matrix&amp; ma, const Matrix&amp; mb);
};
#endif
</code></pre>
<p><strong>matrix.cpp</strong></p>
<pre><code class="language-cpp">#include &quot;matrix.hpp&quot;

Zeile::Zeile(int s)
{
    z=new int[s];//entgegen der Aufgabenstellung kann man hier kein double-Feld reservieren wenn z vom Typ int ist
    size=s;
}
Zeile::~Zeile()
{
    delete[] z;
}
void Matrix::init(int z, int s)
{
    nrows=z;
    ncols=s;
    mat=new Zeile* [z];
    for(int i=0; i&lt;z; i++)
        mat[i]=new Zeile(s);
}
Matrix::Matrix(int _nrows, int _ncols)
{
    this-&gt;init(_nrows,_ncols);
}
Matrix::Matrix(int z, int s, int wert)
{
    this-&gt;init(z,s);
    for (int i=0; i&lt;z; i++)
        for(int j=0; j&lt;s; j++) (*this)[i][j]=wert;
}
Matrix::Matrix(const Matrix&amp; m)
{
    this-&gt;init(m.nrows,m.ncols);
    for(int i=0; i&lt;m.nrows; i++)
        for(int j=0; j&lt;m.ncols; j++) (*this)[i][j]=m[i][j];
}
Matrix::~Matrix()
{
    for(int i=0; i&lt;nrows; i++) delete mat[i];
    delete[] mat;
}
Matrix operator+(const Matrix&amp; ma, const Matrix&amp; mb)
{
    assert(ma.nrows==mb.nrows &amp;&amp; ma.ncols==mb.ncols);
    Matrix *result;
    result= new Matrix(ma.nrows,ma.ncols,0);
    for(int i=0; i&lt;ma.nrows; i++)
        for(int j=0; j&lt;ma.ncols; j++)
            (*result)[i][j]=ma[i][j]+mb[i][j];
    return (*result);
}
Matrix operator*(const Matrix&amp; ma, const Matrix&amp; mb)
{
    assert(ma.nrows==mb.ncols &amp;&amp; ma.ncols==mb.nrows);
    Matrix *result;
    result= new Matrix(ma.nrows,ma.nrows,0);
    for(int x=0; x&lt;ma.nrows; x++)
        for(int i=0; i&lt;ma.nrows; i++)
        {
            int zwischenergebnis=0;
            for(int j=0; j&lt;ma.ncols; j++)
                zwischenergebnis+=ma[x][j]*mb[j][i];
            (*result)[x][i]=zwischenergebnis;
        }
    return (*result);
}
Matrix Matrix::transpose()
{
    Matrix *trans_matrix;
    trans_matrix=new Matrix(this-&gt;ncols,this-&gt;nrows);
    for(int i=0; i&lt;this-&gt;ncols; i++)
        for(int j=0; j&lt;this-&gt;nrows; j++)
            (*trans_matrix)[i][j]=(*this)[j][i];
    return (*trans_matrix);
}
void Matrix::print()
{
    for(int i=0; i&lt;this-&gt;nrows; i++)
    {
        for(int j=0; j&lt;this-&gt;ncols; j++)
            cout &lt;&lt; (*this)[i][j] &lt;&lt; &quot;\t&quot;;
        cout &lt;&lt; endl;
    }
}
</code></pre>
<p><strong>main.cpp</strong></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;matrix.cpp&quot;

using namespace std;

int main()
{
    cout &lt;&lt; &quot;Hello world!&quot; &lt;&lt; endl;
    Matrix MatrixA(3,4);
    for(int i=0; i&lt;MatrixA.getRows(); i++)
        for(int j=0; j&lt;MatrixA.getCols(); j++)
            MatrixA[i][j]=(j+1)+(i*10);
    cout &lt;&lt; &quot;MatrixA ist momentan: &quot;&lt;&lt;endl;
    MatrixA.print();
    cout &lt;&lt; &quot;============================&quot;&lt;&lt;endl;
    Matrix MatrixB(MatrixA);
    cout &lt;&lt; &quot;MatrixB ist momentan: &quot;&lt;&lt;endl;
    MatrixB.print();
    cout &lt;&lt; &quot;============================&quot;&lt;&lt;endl;
    Matrix MatrixC(MatrixA.getRows(),MatrixA.getCols());
    MatrixC=MatrixA+MatrixB;
    cout &lt;&lt; &quot;MatrixC ist momentan: &quot;&lt;&lt;endl;
    MatrixC.print();
    cout &lt;&lt; &quot;============================&quot;&lt;&lt;endl;
    Matrix MatrixD(1,1,1);
    MatrixD=MatrixB.transpose();
    cout &lt;&lt; &quot;MatrixD ist momentan: &quot;&lt;&lt;endl;
    MatrixD.print();
    cout &lt;&lt; &quot;============================&quot;&lt;&lt;endl;
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/288175/segmentation-fault-sigsegv-speicherzugriffsfehler</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 02:28:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/288175.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 11 Jun 2011 19:21:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Segmentation fault&#x2F;SIGSEGV&#x2F; Speicherzugriffsfehler on Sat, 11 Jun 2011 20:58:16 GMT]]></title><description><![CDATA[<p>Hi Leutz,</p>
<p>ich hab ein zweites Problem mit meinem Programm von hier:<a href="http://www.c-plusplus.net/forum/288066-20?sid=f36e40c5191825fe2e2e8bad237f5dac" rel="nofollow">http://www.c-plusplus.net/forum/288066-20?sid=f36e40c5191825fe2e2e8bad237f5dac</a></p>
<p>Ich hab mittlerweile ein wenig überarbeitet und unten die aktuelle Version reingestellt. Wie schon im verlinkten Post gesagt, brauchen wir uns über die Sinnhaftigkeit der Aufgabenstellung nicht zu unterhalten. Da gibts nicht viel Sinnvolles.(inkl der Umsetzung)</p>
<p>Meine Frage: Wenn ich das Programm kompiliere bekomme ich bei MatrixC.print bzw, wenn ich die Zeile (23 in der main.cpp) auskommentiere beim Aufruf von MatrixD.print den Fehler: Segmentation fault.<br />
In den Funktionen transpose und den globalen überladenen arithmetischen operator+ bzw operator* (alle matrix.cpp), erstelle ich via new neue Objekte und übergebe diese. Meiner Meinung nach müssten die Objekte und damit ihr Speicherbereich deshalb weiterhin gültig sein, und bei der Zuweisung MatrixD= bzw. MatrixC= müssten, meiner Meinung nach, auch die Adressen an die entsprechenden Pointer (mat) weitergegeben werden. Offensichtlich ist das OS da anderer Meinung... <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>Deshalb hätte ich gern eure Meinung gehört, thx!</p>
<p><strong>matrix.hpp</strong></p>
<pre><code class="language-cpp">#ifndef _MATRIX_H_
#define _MATRIX_H_
#include &lt;iostream&gt;
#include &lt;cassert&gt;
using namespace std;
class Zeile
{
private:
    int *z;
    int size;
public:
// zu implementieren: Konstruktor und Destruktor
    Zeile( int s);
    ~Zeile();
// Indexoperator [] ist (in zwei Versionen) bereits implementiert für die Klasse Zeile
    int&amp; operator[](int i)
    {
        assert(i &gt;= 0 &amp;&amp; i &lt; size);
        return z[i];
    }
    const int&amp; operator[](int i) const
    {
        assert(i &gt;= 0 &amp;&amp; i &lt; size);
        return z[i];
    }
};
class Matrix
{
private:
    Zeile **mat; // Zeiger auf &quot;Zeilen&quot;-Vektor
    int nrows, ncols; // Zeilen- und Spaltenzahl
    void init(int z, int s);
public:
//zu implementieren: Zwei Konstruktoren, ein Kopierkonstruktor und ein Destruktor
    Matrix( int _nrows , int _ncols);
    Matrix( int z, int s, int wert);
    Matrix( const Matrix&amp; m);
    ~Matrix();
    int getRows()const
    {
        return nrows;
    }
    int getCols()const
    {
        return ncols;
    }
// zu implementieren: Indexoperator [] (in zwei Versionen) für die Klasse Matrix
    Zeile&amp; operator[](int i)
    {
        assert(i &gt;= 0 &amp;&amp; i &lt; nrows);
        return **(mat+i);
    }
    const Zeile&amp; operator[](int i) const
    {
        assert(i &gt;= 0 &amp;&amp; i &lt; nrows);
        return **(mat+i);
    }
// zu implementieren: Transponierte der Matrix
    Matrix transpose();
// zu implementieren: Ausgabe, Addition und Multiplikation
    void print();
    friend Matrix operator+(const Matrix&amp; ma, const Matrix&amp; mb);
    friend Matrix operator*(const Matrix&amp; ma, const Matrix&amp; mb);
};
#endif
</code></pre>
<p><strong>matrix.cpp</strong></p>
<pre><code class="language-cpp">#include &quot;matrix.hpp&quot;

Zeile::Zeile(int s)
{
    z=new int[s];//entgegen der Aufgabenstellung kann man hier kein double-Feld reservieren wenn z vom Typ int ist
    size=s;
}
Zeile::~Zeile()
{
    delete[] z;
}
void Matrix::init(int z, int s)
{
    nrows=z;
    ncols=s;
    mat=new Zeile* [z];
    for(int i=0; i&lt;z; i++)
        mat[i]=new Zeile(s);
}
Matrix::Matrix(int _nrows, int _ncols)
{
    this-&gt;init(_nrows,_ncols);
}
Matrix::Matrix(int z, int s, int wert)
{
    this-&gt;init(z,s);
    for (int i=0; i&lt;z; i++)
        for(int j=0; j&lt;s; j++) (*this)[i][j]=wert;
}
Matrix::Matrix(const Matrix&amp; m)
{
    this-&gt;init(m.nrows,m.ncols);
    for(int i=0; i&lt;m.nrows; i++)
        for(int j=0; j&lt;m.ncols; j++) (*this)[i][j]=m[i][j];
}
Matrix::~Matrix()
{
    for(int i=0; i&lt;nrows; i++) delete mat[i];
    delete[] mat;
}
Matrix operator+(const Matrix&amp; ma, const Matrix&amp; mb)
{
    assert(ma.nrows==mb.nrows &amp;&amp; ma.ncols==mb.ncols);
    Matrix *result;
    result= new Matrix(ma.nrows,ma.ncols,0);
    for(int i=0; i&lt;ma.nrows; i++)
        for(int j=0; j&lt;ma.ncols; j++)
            (*result)[i][j]=ma[i][j]+mb[i][j];
    return (*result);
}
Matrix operator*(const Matrix&amp; ma, const Matrix&amp; mb)
{
    assert(ma.nrows==mb.ncols &amp;&amp; ma.ncols==mb.nrows);
    Matrix *result;
    result= new Matrix(ma.nrows,ma.nrows,0);
    for(int x=0; x&lt;ma.nrows; x++)
        for(int i=0; i&lt;ma.nrows; i++)
        {
            int zwischenergebnis=0;
            for(int j=0; j&lt;ma.ncols; j++)
                zwischenergebnis+=ma[x][j]*mb[j][i];
            (*result)[x][i]=zwischenergebnis;
        }
    return (*result);
}
Matrix Matrix::transpose()
{
    Matrix *trans_matrix;
    trans_matrix=new Matrix(this-&gt;ncols,this-&gt;nrows);
    for(int i=0; i&lt;this-&gt;ncols; i++)
        for(int j=0; j&lt;this-&gt;nrows; j++)
            (*trans_matrix)[i][j]=(*this)[j][i];
    return (*trans_matrix);
}
void Matrix::print()
{
    for(int i=0; i&lt;this-&gt;nrows; i++)
    {
        for(int j=0; j&lt;this-&gt;ncols; j++)
            cout &lt;&lt; (*this)[i][j] &lt;&lt; &quot;\t&quot;;
        cout &lt;&lt; endl;
    }
}
</code></pre>
<p><strong>main.cpp</strong></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;matrix.cpp&quot;

using namespace std;

int main()
{
    cout &lt;&lt; &quot;Hello world!&quot; &lt;&lt; endl;
    Matrix MatrixA(3,4);
    for(int i=0; i&lt;MatrixA.getRows(); i++)
        for(int j=0; j&lt;MatrixA.getCols(); j++)
            MatrixA[i][j]=(j+1)+(i*10);
    cout &lt;&lt; &quot;MatrixA ist momentan: &quot;&lt;&lt;endl;
    MatrixA.print();
    cout &lt;&lt; &quot;============================&quot;&lt;&lt;endl;
    Matrix MatrixB(MatrixA);
    cout &lt;&lt; &quot;MatrixB ist momentan: &quot;&lt;&lt;endl;
    MatrixB.print();
    cout &lt;&lt; &quot;============================&quot;&lt;&lt;endl;
    Matrix MatrixC(MatrixA.getRows(),MatrixA.getCols());
    MatrixC=MatrixA+MatrixB;
    cout &lt;&lt; &quot;MatrixC ist momentan: &quot;&lt;&lt;endl;
    MatrixC.print();
    cout &lt;&lt; &quot;============================&quot;&lt;&lt;endl;
    Matrix MatrixD(1,1,1);
    MatrixD=MatrixB.transpose();
    cout &lt;&lt; &quot;MatrixD ist momentan: &quot;&lt;&lt;endl;
    MatrixD.print();
    cout &lt;&lt; &quot;============================&quot;&lt;&lt;endl;
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2076847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076847</guid><dc:creator><![CDATA[Kiigass]]></dc:creator><pubDate>Sat, 11 Jun 2011 20:58:16 GMT</pubDate></item><item><title><![CDATA[Reply to Segmentation fault&#x2F;SIGSEGV&#x2F; Speicherzugriffsfehler on Sat, 11 Jun 2011 20:16:04 GMT]]></title><description><![CDATA[<p>Du hast in deinen Operatoren ein Speicherleck (ich tippe auf Java-Vorschädigung) und keinen Zuweisungsoperator.</p>
<p>PS: Dir ist hoffentlich klar, daß für die Matrixmultiplikation andere Randbedingungen gelten <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/2076863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076863</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 11 Jun 2011 20:16:04 GMT</pubDate></item><item><title><![CDATA[Reply to Segmentation fault&#x2F;SIGSEGV&#x2F; Speicherzugriffsfehler on Sat, 11 Jun 2011 20:57:46 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Du hast in deinen Operatoren ein Speicherleck (ich tippe auf Java-Vorschädigung) und keinen Zuweisungsoperator.</p>
<p>PS: Dir ist hoffentlich klar, daß für die Matrixmultiplikation andere Randbedingungen gelten <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>
</blockquote>
<p>Hmm kannst du das spezifizieren? Meine Aussage mit der Zuweisung war auf die main.cpp bezogen. Also dass es da iwo nen Speicherleck gibt ist ja klar, die Frage, die sich mir stellt ist: wo?</p>
<p>Was meinst du in Bezug auf die Randbedingungen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076874</guid><dc:creator><![CDATA[Kiigass]]></dc:creator><pubDate>Sat, 11 Jun 2011 20:57:46 GMT</pubDate></item><item><title><![CDATA[Reply to Segmentation fault&#x2F;SIGSEGV&#x2F; Speicherzugriffsfehler on Sat, 11 Jun 2011 21:11:57 GMT]]></title><description><![CDATA[<p>Kiigass schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Du hast in deinen Operatoren ein Speicherleck (ich tippe auf Java-Vorschädigung) und keinen Zuweisungsoperator.</p>
<p>PS: Dir ist hoffentlich klar, daß für die Matrixmultiplikation andere Randbedingungen gelten <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>
</blockquote>
<p>Hmm kannst du das spezifizieren? Meine Aussage mit der Zuweisung war auf die main.cpp bezogen. Also dass es da iwo nen Speicherleck gibt ist ja klar, die Frage, die sich mir stellt ist: wo?</p>
</blockquote>
<p>Das Speicherleck tritt auf, weil du die Objekte nicht wieder freigibst, die in den Rechenfunktionen angefordert werden.<br />
Dein Problem ist: beim Aufruf <code>return (*result);</code> wird von deinem dynamisch angelegten Objekt eine Kopie (nennen wir sie &quot;temp&quot;) nerzeugt, die dann zurückgegeben wird. Diese Kopie wird dann an MatrixC zugewiesen (weil du keinen Operator dafür hast, stellt der Compiler einen bereit). Danach wird &quot;temp&quot; zerstört und gibt die Matrixdaten frei, die MatrixC noch benötigt.</p>
<blockquote>
<p>Was meinst du in Bezug auf die Randbedingungen?</p>
</blockquote>
<p>Es geht um die Assert-Bedingungen in dem Operator - Die Multiplikation ist zulässig, wenn <code>l.Spalten==r.Zeilen</code> ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076878</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 11 Jun 2011 21:11:57 GMT</pubDate></item><item><title><![CDATA[Reply to Segmentation fault&#x2F;SIGSEGV&#x2F; Speicherzugriffsfehler on Sat, 11 Jun 2011 22:07:10 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Kiigass schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Du hast in deinen Operatoren ein Speicherleck (ich tippe auf Java-Vorschädigung) und keinen Zuweisungsoperator.</p>
<p>PS: Dir ist hoffentlich klar, daß für die Matrixmultiplikation andere Randbedingungen gelten <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>
</blockquote>
<p>Hmm kannst du das spezifizieren? Meine Aussage mit der Zuweisung war auf die main.cpp bezogen. Also dass es da iwo nen Speicherleck gibt ist ja klar, die Frage, die sich mir stellt ist: wo?</p>
</blockquote>
<p>Das Speicherleck tritt auf, weil du die Objekte nicht wieder freigibst, die in den Rechenfunktionen angefordert werden.<br />
Dein Problem ist: beim Aufruf <code>return (*result);</code> wird von deinem dynamisch angelegten Objekt eine Kopie (nennen wir sie &quot;temp&quot;) nerzeugt, die dann zurückgegeben wird. Diese Kopie wird dann an MatrixC zugewiesen (weil du keinen Operator dafür hast, stellt der Compiler einen bereit). Danach wird &quot;temp&quot; zerstört und gibt die Matrixdaten frei, die MatrixC noch benötigt.</p>
<blockquote>
<p>Was meinst du in Bezug auf die Randbedingungen?</p>
</blockquote>
<p>Es geht um die Assert-Bedingungen in dem Operator - Die Multiplikation ist zulässig, wenn <code>l.Spalten==r.Zeilen</code> ist.</p>
</blockquote>
<p>thx, das mit dem Speicherproblem kann ich also vermutlich nur lösen wenn ich ne Referenz auf mein dynamisch erzeugtes Objekt übergebe?</p>
<p>Wegen der Randbedingung: Das hab ich doch drin!?(oder meinst, dass meine Bedingung noch eine zusätzliche Klausel hat?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076886</guid><dc:creator><![CDATA[Kiigass]]></dc:creator><pubDate>Sat, 11 Jun 2011 22:07:10 GMT</pubDate></item><item><title><![CDATA[Reply to Segmentation fault&#x2F;SIGSEGV&#x2F; Speicherzugriffsfehler on Sat, 11 Jun 2011 22:18:58 GMT]]></title><description><![CDATA[<p>Nein, das Speicherproblem kannst du nur lösen, indem du deiner Matrix-Klasse einen vernünftigen Zuweisungs-Operator verschaffst. (such mal nach &quot;Rule of Three&quot; bzw. &quot;Regel der großen Drei&quot; für weitere Erklärungen)<br />
Die Rückgabewerte der Operatoren per new anzufordern ist Unsinn und führt nur zu Speicher-Lecks, die du nicht mehr schließen kannst.</p>
<p>Und was die Multiplikation angeht - da ist deine Bedingung zu streng (ich hatte übersehen, daß du die Dimensionen kreuzweise vergleichst). Die Multiplikation einer 3x5 und 5x7 Matrix ist erlaubt und ergibt eine 3x7 Matrix.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076889</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 11 Jun 2011 22:18:58 GMT</pubDate></item></channel></rss>