<?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[Destruktor macht Probleme mit delete[]]]></title><description><![CDATA[<p>Ich habe ein Problem mit dem Destruktor meiner Class.</p>
<pre><code class="language-cpp">class Tbrute{
      public:
        char* digits;
        char* code;
//---------------------------------------------------------------
        Tbrute(int i) //hier wird digits initialisiert
         :len(i)
        {
                digits = new char[26];
                code = new char[len];
        }
//---------------------------------------------------------------
        ~Tbrute() // &lt;-- Der macht das Problem
        {
                delete[] digits;
//              digits = NULL;
                delete[] code;
//              code = NULL;
        }
};
</code></pre>
<p>Ich bekomme immer folgenden Laufzeit Fehler:</p>
<pre><code>*** glibc detected *** double free or corruption (!prev): 0x08048f20 ***
Aborted
</code></pre>
<p>Woran liegt das?</p>
<p>MFG<br />
Ace</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/165516/destruktor-macht-probleme-mit-delete</link><generator>RSS for Node</generator><lastBuildDate>Mon, 14 Sep 2026 20:26:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/165516.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 20 Nov 2006 17:30:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Destruktor macht Probleme mit delete[] on Mon, 20 Nov 2006 17:30:42 GMT]]></title><description><![CDATA[<p>Ich habe ein Problem mit dem Destruktor meiner Class.</p>
<pre><code class="language-cpp">class Tbrute{
      public:
        char* digits;
        char* code;
//---------------------------------------------------------------
        Tbrute(int i) //hier wird digits initialisiert
         :len(i)
        {
                digits = new char[26];
                code = new char[len];
        }
//---------------------------------------------------------------
        ~Tbrute() // &lt;-- Der macht das Problem
        {
                delete[] digits;
//              digits = NULL;
                delete[] code;
//              code = NULL;
        }
};
</code></pre>
<p>Ich bekomme immer folgenden Laufzeit Fehler:</p>
<pre><code>*** glibc detected *** double free or corruption (!prev): 0x08048f20 ***
Aborted
</code></pre>
<p>Woran liegt das?</p>
<p>MFG<br />
Ace</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1177964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1177964</guid><dc:creator><![CDATA[AceKiller73]]></dc:creator><pubDate>Mon, 20 Nov 2006 17:30:42 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor macht Probleme mit delete[] on Mon, 20 Nov 2006 18:57:03 GMT]]></title><description><![CDATA[<p>Du hast Objekte deiner Klasse kopiert und dabei haben alle Kopien Zeiger auf den selben Speicherbereich. Und wenn du die löscht erzeugt das zweite Objekt ein double free.</p>
<p>Schreibe einen Kopierkonstruktor und einen assignment operator.</p>
<p>Tbrute::Tbrute(Tbrute const &amp; other);<br />
Tbrute &amp; operator=(Tbrute const &amp; other);</p>
<p>Besser ist es, wenn du std::vector für digits und code benutzt. Dann brauchst du die beiden Methoden nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1178016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1178016</guid><dc:creator><![CDATA[Ponto]]></dc:creator><pubDate>Mon, 20 Nov 2006 18:57:03 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor macht Probleme mit delete[] on Mon, 20 Nov 2006 19:27:24 GMT]]></title><description><![CDATA[<p>Std::vector ist ein Templamte<br />
hab ich gelesen.</p>
<p>Aber was ist der Unterschied zu den normalen Variablen also keine mit new?<br />
Und kann ich denen dann mit einer Funktion.<br />
z.b. init_brute() direkt einige Werte zuweisen?</p>
<p>MFG<br />
ace</p>
<p>Edit:<br />
Eigentlich habe ich nur eine kopie erzeugt.<br />
Diese wird dann zerstört und wieder eine neue erzeugt.<br />
Allerdings ist dann code irgendwie noch gefüllt.<br />
Der Speicher den ich mit new reserviert habe wird nicht gelöscht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1178026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1178026</guid><dc:creator><![CDATA[AceKiller73]]></dc:creator><pubDate>Mon, 20 Nov 2006 19:27:24 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor macht Probleme mit delete[] on Mon, 20 Nov 2006 19:50:00 GMT]]></title><description><![CDATA[<p>AceKiller73 schrieb:</p>
<blockquote>
<p>Std::vector ist ein Templamte<br />
hab ich gelesen.</p>
<p>Aber was ist der Unterschied zu den normalen Variablen also keine mit new?<br />
Und kann ich denen dann mit einer Funktion.<br />
z.b. init_brute() direkt einige Werte zuweisen?</p>
<p>MFG<br />
ace</p>
<p>Edit:<br />
Eigentlich habe ich nur eine kopie erzeugt.<br />
Diese wird dann zerstört und wieder eine neue erzeugt.<br />
Allerdings ist dann code irgendwie noch gefüllt.<br />
Der Speicher den ich mit new reserviert habe wird nicht gelöscht.</p>
</blockquote>
<p>Die normalen Variablen werden einfach kopiert, wie deine Zeiger auch. Nur wird bei Zeigern nicht das kopiert, auf das sie zeigen.</p>
<p>Mit std::vector ist es ganz einfach.</p>
<p>Du machst std::vector&lt;char&gt; digits und std::vector&lt;char&gt; code:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

class Tbrute{
      public:
        std::vector&lt;char&gt; digits;
        std::vector&lt;char&gt; code;
//---------------------------------------------------------------
        Tbrute(int i) //hier wird digits initialisiert
         :len(i),
          digits(26),
          code(len)
        {
        }
//---------------------------------------------------------------
        ~Tbrute() // &lt;-- Der macht das Problem
        {
        }
};
</code></pre>
<p>Die sonstige Benutzung ist identisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1178043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1178043</guid><dc:creator><![CDATA[Ponto]]></dc:creator><pubDate>Mon, 20 Nov 2006 19:50:00 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor macht Probleme mit delete[] on Mon, 20 Nov 2006 20:49:17 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile.php?mode=viewprofile&amp;u=1819" rel="nofollow">rüdiger</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=5" rel="nofollow">Linux/Unix</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=15" rel="nofollow">C++</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1178079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1178079</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Mon, 20 Nov 2006 20:49:17 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor macht Probleme mit delete[] on Tue, 21 Nov 2006 14:33:18 GMT]]></title><description><![CDATA[<p>Also da ich mit den Prblem nicht weiter komme nochmal mein Ziel.</p>
<p>Ich möchte eine Klasse erstellen mit den Member Vars:<br />
code<br />
digits</p>
<p>Diese sollen dann über eine init_brute funktion gefüllt werden können ( könnte ich auch gleich in den Konstruktor einbauen).</p>
<p>Jetzt hab ich die Variante mit nem Pointer und new genommen, weil ich bei nem normalen char array keine Änderungen vornehmen kann <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Da kommt dann dass ISO c++ die zuweisung von Felder oder so verbietet.</p>
<p>Bevor jetzt jemand mit string kommt und so möchte ich sagen, dass ich nur char brauch und es für mich güstiger ist den datentyp zu verwenden.</p>
<p>Als was würdet ihr die Vars deklarieren, damit ich sie in funktion der Klasse bearbeiten kann und wenn die klasse zerstört wird, werden die vars auch komplett zerstört.</p>
<p>MFG<br />
Ace</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1178578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1178578</guid><dc:creator><![CDATA[AceKiller73]]></dc:creator><pubDate>Tue, 21 Nov 2006 14:33:18 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor macht Probleme mit delete[] on Tue, 21 Nov 2006 14:44:43 GMT]]></title><description><![CDATA[<p>AceKiller73 schrieb:</p>
<blockquote>
<p>Also da ich mit den Prblem nicht weiter komme nochmal mein Ziel.</p>
<p>...</p>
<p>Jetzt hab ich die Variante mit nem Pointer und new genommen, weil ich bei nem normalen char array keine Änderungen vornehmen kann <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Hast du</p>
<pre><code class="language-cpp">Tbrute::Tbrute(Tbrute const &amp; other);
Tbrute &amp; operator=(Tbrute const &amp; other);
</code></pre>
<p>implementiert (oder private deklariert)?</p>
<p>AceKiller73 schrieb:</p>
<blockquote>
<p>Als was würdet ihr die Vars deklarieren, damit ich sie in funktion der Klasse bearbeiten kann und wenn die klasse zerstört wird, werden die vars auch komplett zerstört.</p>
</blockquote>
<p>Siehe Pontos Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1178596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1178596</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Tue, 21 Nov 2006 14:44:43 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor macht Probleme mit delete[] on Tue, 21 Nov 2006 19:31:12 GMT]]></title><description><![CDATA[<p>Wenn ich meine Klasse in einer Schleife aufrufe und konstruiere:</p>
<pre><code class="language-cpp">for(int i = 1; i&lt;=4;i++)
{
   Tbrute brute(i);
   brute.init_brute(..)
   ...
}
</code></pre>
<ol>
<li></li>
</ol>
<p>Das Objekt wird zum ersten mal erzeugt. Code ist &quot;&quot;;<br />
2. Schleifendurchlauf<br />
Das Objekt wird zum zweiten mal erzeugt. Code ist der des alten Tbrutes.</p>
<p>Woran liegt das?<br />
Wird das Objekt nicht am Ende eines Durchlaufs zerstört?<br />
Wieso wird bei neuen Objekt, wenn der Pointer eigentlich einen neuen new Bereich bekommen sollte der andere genommen?</p>
<p>Sry das ich soviel frage <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>Und dann nochmal der Kopier Konstruktor. Wieso braucht man den bzw. ich<br />
weil eigentlich will ich ja jedes mal eines NEUES Objekt erstellen und net verstehen.</p>
<p>Naja hoffe ich gehe euch nicht zu sehr auf die Nerven</p>
<p>MFG<br />
Ace</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1178763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1178763</guid><dc:creator><![CDATA[AceKiller73]]></dc:creator><pubDate>Tue, 21 Nov 2006 19:31:12 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor macht Probleme mit delete[] on Tue, 21 Nov 2006 20:02:12 GMT]]></title><description><![CDATA[<p>AceKiller73 schrieb:</p>
<blockquote>
<p>Das Objekt wird zum ersten mal erzeugt. Code ist &quot;&quot;;<br />
2. Schleifendurchlauf<br />
Das Objekt wird zum zweiten mal erzeugt. Code ist der des alten Tbrutes.</p>
<p>Woran liegt das?<br />
Wird das Objekt nicht am Ende eines Durchlaufs zerstört?<br />
Wieso wird bei neuen Objekt, wenn der Pointer eigentlich einen neuen new Bereich bekommen sollte der andere genommen?</p>
</blockquote>
<p>Nein, <code>Code</code> ist im ersten Durchlauf nicht &quot;&quot;, sondern irgendeine zufällige Bytefolge. Du forderst lediglich Speicher für <code>Code</code> an, nichts weiter.</p>
<p>Der zweite Punkt ist ein wenig konfus... du schreibst doch selbst schon dass das Objekt zerstört (dementsprechend der Speicher freigegeben) wird.</p>
<p>AceKiller73 schrieb:</p>
<blockquote>
<p>Und dann nochmal der Kopier Konstruktor. Wieso braucht man den bzw. ich<br />
weil eigentlich will ich ja jedes mal eines NEUES Objekt erstellen und net verstehen.</p>
</blockquote>
<p>Deswegen schrieb ich &quot;(oder private deklariert)&quot;. Allerdings deutet die Fehlermeldung im OP darauf hin dass du irgendwo Kopien erstellst, deswegen hat Ponto angemerkt dass du den copy-ctor &amp; <code>op=</code> korrekt implementieren musst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1178779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1178779</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Tue, 21 Nov 2006 20:02:12 GMT</pubDate></item></channel></rss>