<?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 delete und Destruktor]]></title><description><![CDATA[<p>Moin,</p>
<p>ich habe eine Klasse geschrieben, in der es dynamisch allokierte Objekte gibt,</p>
<p>das ganze so wie ichs hier gepostet dient bis jetzt dazu die Determinanante von</p>
<p>einer beliebigen nxn Matrix ausrechnen.</p>
<p>Die memberfunktion &quot;matrix matrix::solvenxn()&quot; tut dies rekursiv.</p>
<p>Das ganze lief bis ich im Destruktor den &quot;delete &quot; Befehl eingesetzt habe,</p>
<p>dann gings nimmer.</p>
<p>Ich hab gegoogelt aber die Infos haben mich nicht weitergebracht, darum frage</p>
<p>ich hier.</p>
<p>(Vielen Dank schonmal im Voraus)</p>
<p>Der Code:</p>
<p>Die header Datei mit der Klasse:</p>
<pre><code class="language-cpp">#ifndef head_h
#define head_h

using namespace std;

class matrix{
      float **element;
      const unsigned short int n,m;

public:

matrix():n(1),m(1){
         element=new float*[1];
         element[0]=new float [1];
         element[0][0]=0.f;           
}// matrix()

~matrix(){                        //hier gibts Probleme
      delete[] element;}
}//destruktor

matrix(int rows,int columns,char *a):n( rows),m( columns){

       element=new float*[rows];
       for (int ii=0;ii&lt;columns;ii++) element[ii]=new float [columns];

       switch( *a){ 

       case 'c':
       for (int ii=0;ii&lt;n;ii++){
       for (int jj=0;jj&lt;m;jj++){
       cin&gt;&gt;element[ii][jj];
       }//for jj
       }//for ii
       break;

       case 'r':
       for (int ii=0;ii&lt;n;ii++){
       for (int jj=0;jj&lt;m;jj++){
       element[ii][jj]=rand()%10;
       }//for jj
       }//for ii
       break;
       case 'i':
       for (int ii=0;ii&lt;n;ii++){
       for (int jj=0;jj&lt;m;jj++){
       element[ii][jj]=(ii!=jj) ? 0.f:1;
       }//for jj
       }//for ii

       break;

       }//switch a
}//matrix(const int &amp;rows, const int &amp;columns,char *a)

matrix(int rows,  int columns):n( rows),m( columns){
       element=new float*[rows];
       for (int ii=0;ii&lt;columns;ii++) element[ii]=new float [columns];
}//matrix(const int &amp;rows, const int &amp;columns)

void matrix::tellme(){
     cout&lt;&lt;endl;
     for(int ii=0;ii&lt;n;ii++){
     for(int jj=0;jj&lt;m;jj++){
     cout&lt;&lt;element[ii][jj]&lt;&lt;&quot;   &quot;;
     }//for jj
     cout&lt;&lt;endl;
     }//for jj
     cout&lt;&lt;endl;
}//tellme()

matrix matrix::choice(int row){
       matrix c(n-1,m-1);
       int kk=0;

       for(int ii=0;ii&lt;n;ii++){
       if(ii==row){continue;}
       for(int jj=1;jj&lt;n;jj++){
       c.element[kk][jj-1]=element[ii][jj];
       }//for jj
       kk++;
       }//for ii

       return c;
}// choice

matrix matrix::solve3x3()const{
      matrix result;
      if(element[0][0]!=0){result.element[0][0]=element[0][0]*(element[1][1]*element[2][2]-element[2][1]*element[1][2]);} 
      if(element[1][0]!=0){result.element[0][0] +=  -element[1][0]*(element[0][1]*element[2][2]-element[2][1]*element[0][2]);}
      if(element[2][0]!=0){result.element[0][0] +=element[2][0]*(element[0][1]*element[1][2]-element[1][1]*element[0][2]);}
      return result;
}//solve 3x3

matrix matrix::solvenxn(){
      matrix c;
      float v=1;

      if(n!=m){cout&lt;&lt;&quot;Das geht doch garnicht &quot;&lt;&lt;endl;return c;} 

      else if(n&lt;3){
      c.element[0][0]=(n!=1)? element[0][0]*element[1][1]-element[1][0]*element[0][1]:element[0][0];
      }// if(n&lt;3)
      else if (n&gt;3){        
      for (int ii=0;ii&lt;n;ii++){
      ((ii%2)==0)?v=1:v=-1;
      if(element[ii][0]!=0){ c.element[0][0]+=v*element[ii][0]*(choice(ii).solvenxn()).element[0][0];}
      else{ continue;}
      }//for ii
      }//if (n&gt;3)
      else{return solve3x3();}//else if (n&gt;3)

      return c;
}//solve nxn

};//class matrix

#endif
</code></pre>
<p>Die Main Datei:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
#include &quot;head.h&quot;
#include&lt;time.h&gt;
using namespace std;

    int main(){
    time_t t;
    time(&amp;t);
    srand((unsigned int)t);

    matrix c(5,5,&quot;r&quot;);              //erstellt eine random 5 x 5 matrix
    c.tellme();                     // gibt sie aus
    (c.solvenxn()).tellme();        //und könnte ohne den Fehler mit dem
                                    //delete auch die Determinante berechnen

    system(&quot;Pause&quot;);
    return 0;
    }//main
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/291090/probleme-mit-delete-und-destruktor</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 22:19:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/291090.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Aug 2011 12:50:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit delete und Destruktor on Wed, 10 Aug 2011 12:50:33 GMT]]></title><description><![CDATA[<p>Moin,</p>
<p>ich habe eine Klasse geschrieben, in der es dynamisch allokierte Objekte gibt,</p>
<p>das ganze so wie ichs hier gepostet dient bis jetzt dazu die Determinanante von</p>
<p>einer beliebigen nxn Matrix ausrechnen.</p>
<p>Die memberfunktion &quot;matrix matrix::solvenxn()&quot; tut dies rekursiv.</p>
<p>Das ganze lief bis ich im Destruktor den &quot;delete &quot; Befehl eingesetzt habe,</p>
<p>dann gings nimmer.</p>
<p>Ich hab gegoogelt aber die Infos haben mich nicht weitergebracht, darum frage</p>
<p>ich hier.</p>
<p>(Vielen Dank schonmal im Voraus)</p>
<p>Der Code:</p>
<p>Die header Datei mit der Klasse:</p>
<pre><code class="language-cpp">#ifndef head_h
#define head_h

using namespace std;

class matrix{
      float **element;
      const unsigned short int n,m;

public:

matrix():n(1),m(1){
         element=new float*[1];
         element[0]=new float [1];
         element[0][0]=0.f;           
}// matrix()

~matrix(){                        //hier gibts Probleme
      delete[] element;}
}//destruktor

matrix(int rows,int columns,char *a):n( rows),m( columns){

       element=new float*[rows];
       for (int ii=0;ii&lt;columns;ii++) element[ii]=new float [columns];

       switch( *a){ 

       case 'c':
       for (int ii=0;ii&lt;n;ii++){
       for (int jj=0;jj&lt;m;jj++){
       cin&gt;&gt;element[ii][jj];
       }//for jj
       }//for ii
       break;

       case 'r':
       for (int ii=0;ii&lt;n;ii++){
       for (int jj=0;jj&lt;m;jj++){
       element[ii][jj]=rand()%10;
       }//for jj
       }//for ii
       break;
       case 'i':
       for (int ii=0;ii&lt;n;ii++){
       for (int jj=0;jj&lt;m;jj++){
       element[ii][jj]=(ii!=jj) ? 0.f:1;
       }//for jj
       }//for ii

       break;

       }//switch a
}//matrix(const int &amp;rows, const int &amp;columns,char *a)

matrix(int rows,  int columns):n( rows),m( columns){
       element=new float*[rows];
       for (int ii=0;ii&lt;columns;ii++) element[ii]=new float [columns];
}//matrix(const int &amp;rows, const int &amp;columns)

void matrix::tellme(){
     cout&lt;&lt;endl;
     for(int ii=0;ii&lt;n;ii++){
     for(int jj=0;jj&lt;m;jj++){
     cout&lt;&lt;element[ii][jj]&lt;&lt;&quot;   &quot;;
     }//for jj
     cout&lt;&lt;endl;
     }//for jj
     cout&lt;&lt;endl;
}//tellme()

matrix matrix::choice(int row){
       matrix c(n-1,m-1);
       int kk=0;

       for(int ii=0;ii&lt;n;ii++){
       if(ii==row){continue;}
       for(int jj=1;jj&lt;n;jj++){
       c.element[kk][jj-1]=element[ii][jj];
       }//for jj
       kk++;
       }//for ii

       return c;
}// choice

matrix matrix::solve3x3()const{
      matrix result;
      if(element[0][0]!=0){result.element[0][0]=element[0][0]*(element[1][1]*element[2][2]-element[2][1]*element[1][2]);} 
      if(element[1][0]!=0){result.element[0][0] +=  -element[1][0]*(element[0][1]*element[2][2]-element[2][1]*element[0][2]);}
      if(element[2][0]!=0){result.element[0][0] +=element[2][0]*(element[0][1]*element[1][2]-element[1][1]*element[0][2]);}
      return result;
}//solve 3x3

matrix matrix::solvenxn(){
      matrix c;
      float v=1;

      if(n!=m){cout&lt;&lt;&quot;Das geht doch garnicht &quot;&lt;&lt;endl;return c;} 

      else if(n&lt;3){
      c.element[0][0]=(n!=1)? element[0][0]*element[1][1]-element[1][0]*element[0][1]:element[0][0];
      }// if(n&lt;3)
      else if (n&gt;3){        
      for (int ii=0;ii&lt;n;ii++){
      ((ii%2)==0)?v=1:v=-1;
      if(element[ii][0]!=0){ c.element[0][0]+=v*element[ii][0]*(choice(ii).solvenxn()).element[0][0];}
      else{ continue;}
      }//for ii
      }//if (n&gt;3)
      else{return solve3x3();}//else if (n&gt;3)

      return c;
}//solve nxn

};//class matrix

#endif
</code></pre>
<p>Die Main Datei:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
#include &quot;head.h&quot;
#include&lt;time.h&gt;
using namespace std;

    int main(){
    time_t t;
    time(&amp;t);
    srand((unsigned int)t);

    matrix c(5,5,&quot;r&quot;);              //erstellt eine random 5 x 5 matrix
    c.tellme();                     // gibt sie aus
    (c.solvenxn()).tellme();        //und könnte ohne den Fehler mit dem
                                    //delete auch die Determinante berechnen

    system(&quot;Pause&quot;);
    return 0;
    }//main
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2104414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104414</guid><dc:creator><![CDATA[Itrah]]></dc:creator><pubDate>Wed, 10 Aug 2011 12:50:33 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete und Destruktor on Wed, 10 Aug 2011 12:53:32 GMT]]></title><description><![CDATA[<p>Ohne deinen Code angeguckt zu haben:</p>
<blockquote>
<p>dann gings nimmer.</p>
</blockquote>
<p>Bitte beschreibe, was nicht mehr geht und wie es nicht mehr geht!<br />
Exceptions? Kompiler / Linker Error?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104416</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 10 Aug 2011 12:53:32 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete und Destruktor on Wed, 10 Aug 2011 12:54:48 GMT]]></title><description><![CDATA[<p>Nimm doch std::vector, dann funktionierts, wette ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104417</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 10 Aug 2011 12:54:48 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete und Destruktor on Wed, 10 Aug 2011 12:57:50 GMT]]></title><description><![CDATA[<p>Was geht nicht?</p>
<p>Dein Code hat lauter Klammern falsch, dürfte gar nicht compilieren. Du verletzt die Regel der großen Drei, was immer wieder für lustige Probleme sorgt, wenn man mit Pointern hantiert.</p>
<p>Dein Code hat auch noch andere Schwächen, da er jedoch ziemlich unleserlich ist, mag ich nicht im Detail da drauf eingehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104421</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 10 Aug 2011 12:57:50 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete und Destruktor on Wed, 10 Aug 2011 12:57:51 GMT]]></title><description><![CDATA[<p>Kompiliert wird es, es erscheint dann beim Programmablauf eine Fehlermeldung</p>
<p>das det.exe ein Problem festgestellt hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104422</guid><dc:creator><![CDATA[Itrah]]></dc:creator><pubDate>Wed, 10 Aug 2011 12:57:51 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete und Destruktor on Wed, 10 Aug 2011 12:59:11 GMT]]></title><description><![CDATA[<p>Itrah schrieb:</p>
<blockquote>
<p>Kompiliert wird es, es erscheint dann beim Programmablauf eine Fehlermeldung</p>
<p>das det.exe ein Problem festgestellt hat.</p>
</blockquote>
<p>Dann hilft typischerweise mit Debugger durchzusteppen, d.h. jede einzelne Anweisung nacheinander Ausführen und die Variabeln beobachten.</p>
<p>Was für eine IDE benutzt Du?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104424</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 10 Aug 2011 12:59:11 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete und Destruktor on Wed, 10 Aug 2011 13:09:22 GMT]]></title><description><![CDATA[<p>Ich nutze dev c++ version 4.9.9.2</p>
<p>Also durchstepen habe ich schon probiert, und hab festgetellt das es bei</p>
<p>der Rekursion wohl mit den Rückgabewerten nicht mehr klappt.</p>
<p>Allerdings kann ich mir das im zusammenhang mit dem delete nicht erklären.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104436</guid><dc:creator><![CDATA[Itrah]]></dc:creator><pubDate>Wed, 10 Aug 2011 13:09:22 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete und Destruktor on Wed, 10 Aug 2011 13:49:25 GMT]]></title><description><![CDATA[<p>Itrah schrieb:</p>
<blockquote>
<p>Ich nutze dev c++ version 4.9.9.2</p>
</blockquote>
<p>Ich empfehle <a href="http://www.c-plusplus.net/forum/237002" rel="nofollow">dringend</a> zu wechseln. Zudem bitte nicht in Sätzen mit Return umbrechen (das macht das Forum selbstständig am Rand, und ist zudem besser lesbar).</p>
<p>Grundsätzlich: Wer mit Zeigern in Klassen hantiert benötigt neben dem Konstruktor auch den Kopierkonstruktor und Zuweisungsoperator (Die Bereits erwähnte Regel der Drei).</p>
<p>Zudem ist der Code so unleserlich formatiert, das die meisten wohl kaum den Code lesen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104457</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 10 Aug 2011 13:49:25 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete und Destruktor on Wed, 10 Aug 2011 13:51:57 GMT]]></title><description><![CDATA[<p>Laut Wikpedia ist die neuste Version von Dev C++ von letztem Monat. Keine Ahnung, inwieweit das stimmt und ob es aktuell ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104459</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 10 Aug 2011 13:51:57 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete und Destruktor on Wed, 10 Aug 2011 13:58:41 GMT]]></title><description><![CDATA[<p>Wikipedia schrieb:</p>
<blockquote>
<p>Nachdem sich in der Entwicklung von Dev-C++ seit März 2005 nichts getan hatte, erschien am 30. Juni 2011 eine neue Version (4.9.9.3) von Dev-C++, der kurz darauf Version 4.9.9.4 folgte. Diese beiden Versionen enthalten mit Version 4.5.2 ein neue Version des GCC und bringen auch alle erforderlichen Ressourcen zum Programmieren von DirectX und Win32 mit. Viele Bugs und Stabilitätsprobleme wurden ebenso behoben.</p>
</blockquote>
<p>Da scheint sich was zum positiven zu wenden <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/2104463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104463</guid><dc:creator><![CDATA[Wikiman]]></dc:creator><pubDate>Wed, 10 Aug 2011 13:58:41 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete und Destruktor on Wed, 10 Aug 2011 14:00:42 GMT]]></title><description><![CDATA[<p>Also wenn ich mal die zahlreichen Syntaxfehler (überflüssige Qualifikationen bei Membern, fehlerhafte Includes, fehlerhafte Klammerung) korrigiere, so dass der Code überhaupt compiliert, kann man das auch debuggen. Wie schon gesagt, verletzt du die großen drei. Weiterhin liest du fröhlich über alle Arraygrenzen hinaus und ach, es ist einfach nur Chaos. Nicht einmal mit dem Debugger finde ich da richtig durch, da alle Variablen nur kryptische einbuchstabige Namen haben.</p>
<p>Mein Wischiwaschi-Tipp: Befolge die großen Drei. Oder einfacher, machs wie von Pi vorgeschlagen und nimm einen vector. Dann machst du alle Zugriffe mit at(), damit du die Zugriffsfehler alle findest und korrigieren kannst. Vielleicht funktioniert es dann schon.</p>
<p>Mein Hardcore-Tipp: Alles nochmal neu machen. Und dieses Mal sauber!</p>
<p>Main Praxis-Tipp: Du bist nicht der erste, der mit Matrizen rechnet <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="🙂"
    /> . Da gibt es tausende Bibliotheken für und alle sind sie besser als deine.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104465</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 10 Aug 2011 14:00:42 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete und Destruktor on Wed, 10 Aug 2011 14:21:26 GMT]]></title><description><![CDATA[<p>Zunächst mal danke ich allen die geantwortet haben.</p>
<p>Egal wie ungeschickt oder wirr mein Code ist, es muss ja irgendwas mit dem delete</p>
<p>Befehl zu tun haben denn ohne läufts und die Ergebnisse stimmen.</p>
<p>Meine Frage währe nun:</p>
<p>Wie würde man, wen man wie ich hier in einer Klasse mit new Member erstellt die</p>
<p>freigabe korrekt regeln?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104470</guid><dc:creator><![CDATA[Itrah]]></dc:creator><pubDate>Wed, 10 Aug 2011 14:21:26 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete und Destruktor on Wed, 10 Aug 2011 14:25:30 GMT]]></title><description><![CDATA[<p>Halte dich doch an die Tipps von SeppJ. std::vector könnte dir eine Menge Arbeit abnehmen, wenn du deine Matrizen unbedingt selbst schreiben möchtest. Aber ich würde deinen Code auf jeden Fall neu machen, du kannst ihn doch selbst auch kaum lesen, hab ich Recht? <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/2104473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104473</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 10 Aug 2011 14:25:30 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete und Destruktor on Wed, 10 Aug 2011 14:33:58 GMT]]></title><description><![CDATA[<p>Ja ich will die Matritzen selber machen, sonst weis ich ja hinterher nicht</p>
<p>wie ich das mit der freigabe in Zukunft regele.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104480</guid><dc:creator><![CDATA[Itrah]]></dc:creator><pubDate>Wed, 10 Aug 2011 14:33:58 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete und Destruktor on Wed, 10 Aug 2011 14:36:31 GMT]]></title><description><![CDATA[<p>Itrah schrieb:</p>
<blockquote>
<p>Wie würde man, wen man wie ich hier in einer Klasse mit new Member erstellt die</p>
<p>freigabe korrekt regeln?</p>
</blockquote>
<p>Schon so wie du es gerade anfängst, aber eben mit allem drum und dran. Ich, asc und andere haben dir schon gesagt, was fehlt und was falsch läuft. Wenn du das nicht verstehst, google es oder frag genauer nach. Jedenfalls solltest du dich solange nicht wundern, dass dein Programm solche Fehler verursacht, wie du entweder <strong>nur</strong> den Destruktor implementiert hast oder nicht fertige Rundum-Glücklich-Klassen wie vector benutzt.</p>
<p>P.S.: Und bitte lass im Forum den manuellen Zeilenumbruch sein. Wir haben zuhause alle eine andere Bildschirmauflösung wie du, dafür aber hochentwickelte Programme namens Browser, die uns den Text passend umbrechen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104481</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 10 Aug 2011 14:36:31 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete und Destruktor on Wed, 10 Aug 2011 14:50:05 GMT]]></title><description><![CDATA[<p>Itrah schrieb:</p>
<blockquote>
<p>Egal wie ungeschickt oder wirr mein Code ist, es muss ja irgendwas mit dem delete Befehl zu tun haben denn ohne läufts und die Ergebnisse stimmen.</p>
</blockquote>
<p>An delete liegt es nicht, zumindest nicht direkt. Du rufst mehrfach auf dem gleichen Speicherbereich delete auf (Dank fehlenden Kopierkonstruktor usw.).</p>
<p>Stell dir folgendes vor:</p>
<pre><code class="language-cpp">class A {};

int main()
{
  A a;
  A b(a); // Kopierkonstruktor.
  A c;
  c = a; // Zuweisungsoperator.
}
</code></pre>
<p>Bei jeder einfachen Klasse ist obiger Code unproblematisch, da hier einfach Werte kopiert werden. Am Schluß von main wird der Destruktor von a,b und c aufgerufen.</p>
<p>Nun ergänzen wir das ganze mal:</p>
<pre><code class="language-cpp">class A
{
  private:
    int * p;

  public:
    A() : p(new int(1)) {}
    ~A() { delete p; }
};

int main()
{
  A a;    // Legt a.p per new an.
  A b(a); // Kopiert den Zeiger von a.p nach b.p
  A c;    // Legt c.p per new an.
  c = a;  // Überschreibt c.p mit a.p
} // Destruktor von a,b,c versuchen jeweils a.p freizugeben (=&gt;Fehler), zudem
  // Speicherleck bei der zweiten per new allozierten Variable, da kein new
  // aufgerufen wird.
</code></pre>
<p>Hier fehlen ein eigener Kopierkonstruktor und Zuweisungsoperator...</p>
<pre><code class="language-cpp">class A
{
  private:
    int * p;

  public:
    A()
    : p(new int(1))
    {
    }

    A(
      A const &amp; rhs)
    : p(new int(*rhs.p)) // Nicht Zeiger kopieren, sondern &quot;Inhalt&quot; in einem
    {                    // neu allozierten Speicherbereich kopieren.
    }

    A &amp; operator=(
      A const &amp; rhs)
    {
      // Es existiert bereits ein Speicherbereich p.
      // Ich werde nun die nicht ganz saubere (aber für den Anfang
      // verständlichere) Variante beschränken:

      delete p; // Alten Speicherbereich löschen
      p = new int(*rhs.p); // Wie beim Kopierkonstruktor nicht den Zeiger,
                           // sondern den &quot;Inhalt&quot; in einen neu allozierten
                           // Speicherbereich kopieren.
      return *this;
    }

    ~A()
    {
      delete p;
    }
};

int main()
{
  A a;    // Legt a.p per new an.
  A b(a); // Kopiert den Inhalt, auf den der Zeiger a.p verweist in einen
          //  neuen Speicherbereich (b.p)
  A c;    // Legt c.p per new an.
  c = a;  // c.p wird gelöscht, Inhalt auf dem der Zeiger a.p verweist wird
          //  in den neuen Speicherbereich (c.p) abgelegt.
} // Die Destruktoren löschen alle ihre &quot;eigenen&quot; Speicherbereiche.
</code></pre>
<p>P.S: Viele Aufrufe von Konstruktoren/Kopierkonstruktoren und Zuweisungen &quot;sieht&quot; man erst wenn man etwas länger C++ programmiert hat, und selbst dann kann man gerne einige übersehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104493</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 10 Aug 2011 14:50:05 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete und Destruktor on Wed, 10 Aug 2011 21:25:39 GMT]]></title><description><![CDATA[<p>Klar das es nicht gehen kann, aber so hatte ichs nicht betrachtet.</p>
<p>Vielen Dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104656</guid><dc:creator><![CDATA[Itrah]]></dc:creator><pubDate>Wed, 10 Aug 2011 21:25:39 GMT</pubDate></item></channel></rss>