<?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[Delete in Destruktor]]></title><description><![CDATA[<p>Hallo,</p>
<p>habe hier mal eine Anfängerfrage: Ich benötige eine Klasse mit einem char-Zeiger als Membervariable. Also zum Beispiel:</p>
<pre><code class="language-cpp">class Test
{
  private:
    char* bla;

  public:
   Test();
   ~Test();
};
</code></pre>
<p>Im Konstruktor Test() erzeuge ich eine neue Instanz des chars, also</p>
<pre><code class="language-cpp">Test::Test()
{
  bla = new char[10];
}
</code></pre>
<p>Bisher war ich auf dem Standpunkt, dass man diese Instanz spätestens im Destruktor wieder löschen muss:</p>
<pre><code class="language-cpp">Test::~Test()
{
  delete bla;
}
</code></pre>
<p>Leider bekomme ich da einen Speicherzugriffsfehler. Was mache ich falsch? Wäre für jeden Tipp sehr dankbar...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/134344/delete-in-destruktor</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 21:14:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/134344.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Jan 2006 13:39:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Delete in Destruktor on Wed, 25 Jan 2006 13:39:10 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>habe hier mal eine Anfängerfrage: Ich benötige eine Klasse mit einem char-Zeiger als Membervariable. Also zum Beispiel:</p>
<pre><code class="language-cpp">class Test
{
  private:
    char* bla;

  public:
   Test();
   ~Test();
};
</code></pre>
<p>Im Konstruktor Test() erzeuge ich eine neue Instanz des chars, also</p>
<pre><code class="language-cpp">Test::Test()
{
  bla = new char[10];
}
</code></pre>
<p>Bisher war ich auf dem Standpunkt, dass man diese Instanz spätestens im Destruktor wieder löschen muss:</p>
<pre><code class="language-cpp">Test::~Test()
{
  delete bla;
}
</code></pre>
<p>Leider bekomme ich da einen Speicherzugriffsfehler. Was mache ich falsch? Wäre für jeden Tipp sehr dankbar...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/975942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/975942</guid><dc:creator><![CDATA[Inaniel]]></dc:creator><pubDate>Wed, 25 Jan 2006 13:39:10 GMT</pubDate></item><item><title><![CDATA[Reply to Delete in Destruktor on Wed, 25 Jan 2006 13:41:23 GMT]]></title><description><![CDATA[<p>Erstens: Das heißt &quot;delete**[]** bla;&quot;.</p>
<p>Zweitens: Bei Klassen mit eigener Speicherverwaltung solltest du immer Copy-Ctor und Zuweisung definieren, weil die Default-Version dir sonst den Speicher zerlegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/975949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/975949</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Wed, 25 Jan 2006 13:41:23 GMT</pubDate></item><item><title><![CDATA[Reply to Delete in Destruktor on Sun, 29 Jan 2006 15:55:01 GMT]]></title><description><![CDATA[<p>CStoll (off) schrieb:</p>
<blockquote>
<p>Erstens: Das heißt &quot;delete**[]** bla;&quot;.</p>
</blockquote>
<p>Hm, der Hinweis mit dem delete[] hat leider nicht geholfen.</p>
<p>CStoll (off) schrieb:</p>
<blockquote>
<p>Zweitens: Bei Klassen mit eigener Speicherverwaltung solltest du immer Copy-Ctor und Zuweisung definieren, weil die Default-Version dir sonst den Speicher zerlegt.</p>
</blockquote>
<p>Ich bin leider noch ziemlich unerfahren im Umgang mit c++. Wie sollte ein solcher Copy-Construktor denn in etwa aussehen?</p>
<p>Ich hab jetzt einfach mal mein Programm auf das nötigste gekürtz:</p>
<pre><code class="language-cpp">class ChordKey
{
public:
	unsigned char* key;
 	char* str() const;
	ChordKey();
	~ChordKey();
};

ChordKey::ChordKey()
{
	key = new unsigned char[20];
	memset(key, 0, 20);
}

ChordKey::~ChordKey()
{
	delete[] key;
}

char* ChordKey::str() const
{
	char* hex = new char[41];
	hex[0] = 0;
	char temp[4];
	for( uint i = 0; i &lt; 20; i++ )
	{
		sprintf(temp, &quot;%02x&quot;, key[i]);
		strcat(hex, temp);
	}
	hex[41] = '\0';
	return hex;
}

void print(ChordKey k)
{
	std::cout &lt;&lt; k.str() &lt;&lt; std::endl;
}

int main()
{
        for ( int i = 0; i &lt; 10; i++ )
        {
                ChordKey a;
                print(a);
        }
}
</code></pre>
<p>Wenn man das so ausführt, wird folgender Fehler aufgeworfen:</p>
<pre><code>*** glibc detected *** double free or corruption (fasttop): 0x0804a008 ***
</code></pre>
<p>Wenn man die Zeile delete[] key im Destruktor auskommentiert, läuft es zwar, aber ich habe dann ein memory leak...</p>
<p>Wäre super, wenn mir hier jemand weiterhelfen könnte.<br />
Grüße<br />
Inaniel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/979893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/979893</guid><dc:creator><![CDATA[Inaniel]]></dc:creator><pubDate>Sun, 29 Jan 2006 15:55:01 GMT</pubDate></item><item><title><![CDATA[Reply to Delete in Destruktor on Sun, 29 Jan 2006 16:22:56 GMT]]></title><description><![CDATA[<p>Bei dem Funktionsaufruf von print wird die Klasse kopiert und diese Kopie löscht dann schon den Array. Das Original macht das dann nochmal und deswegen der Fehler.</p>
<p>Du machst dir entweder einen Kopierkonstruktor, der muss beim kopieren neuen Speicher reservieren, oder du benutzt einen Zeiger wie boost::shared_array der löscht das ganze erst wenn kein Zeiger mehr auf das Array zeigt.</p>
<p>Die einfachste Möglichkeit wäre std::string zu benutzen.</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/979927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/979927</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Sun, 29 Jan 2006 16:22:56 GMT</pubDate></item><item><title><![CDATA[Reply to Delete in Destruktor on Sun, 29 Jan 2006 16:24:57 GMT]]></title><description><![CDATA[<p>Wenn du print aufrufst, wird das ChordKey Objekt kopiert, k hat dann also den selben Pointer key wie das übergebende Objekt. Ist die Funktion nun beendet wird der Destruktor aufgerufen, der delete [] key ausführt. Später wird das allerdings für denselben Zeiger noch einmal gemacht, was die Laufzeitumgebung dir dann ankreidet. Das Programm sollte also so aussehen:</p>
<pre><code class="language-cpp">class ChordKey
{
public:
    const char* str() const;
    ChordKey();
    ChordKey (const ChordKey&amp;); // Copy-Ctor
    ~ChordKey();
private:
    unsigned char* key; // Daten sind privat!
};

ChordKey::ChordKey()
{
    key = new unsigned char[20];
    memset(key, 0, 20);
}

ChordKey::ChordKey (const ChordKey&amp; other)
{
    key = new unsigned char[20];
    for (int i = 0; i &lt; 20; ++i)
        key[i] = other.key[i];
}

ChordKey::~ChordKey()
{
    delete[] key;
}

const char* ChordKey::str() const
{
    char* hex = new char[41]; // Hier ist ein RIESIGES Speicherloch!!!
    hex[0] = 0;
    char temp[4];
    for( uint i = 0; i &lt; 20; i++ )
    {
        sprintf(temp, &quot;%02x&quot;, key[i]); // Das ist kein C++, schau dir stringstreams an
        strcat(hex, temp);
    }
    hex[41] = '\0';
    return hex;
}

void print(const ChordKey&amp; k) // hätte auch gewirkt
{
    std::cout &lt;&lt; k.str() &lt;&lt; std::endl;
}

int main()
{
    for ( int i = 0; i &lt; 10; i++ )
    {
        ChordKey a;
        print(a);
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/979931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/979931</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sun, 29 Jan 2006 16:24:57 GMT</pubDate></item><item><title><![CDATA[Reply to Delete in Destruktor on Sun, 29 Jan 2006 17:54:55 GMT]]></title><description><![CDATA[<p>Vielen Dank für eure ausführlichen Antworten, .filmor und joomoo. Das hat mir sehr weitergeholfen und auch die Augen geöffnet für Probleme mit Pointern im Allgemeinen. Das memory leak in der str()-Methode hab ich nun so geflickt:</p>
<pre><code class="language-cpp">std::stringstream cur;
for ( int i = 0; i &lt; 20; i++ )
{
	int z = key[i];
	cur &lt;&lt; std::hex &lt;&lt; z;
}
return const_cast&lt;char*&gt;(cur.str().c_str());
</code></pre>
<p>Auch hierfür nochmals vielen lieben Dank für den Hinweis.<br />
Grüße<br />
Inaniel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/980123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980123</guid><dc:creator><![CDATA[Inaniel]]></dc:creator><pubDate>Sun, 29 Jan 2006 17:54:55 GMT</pubDate></item><item><title><![CDATA[Reply to Delete in Destruktor on Sun, 29 Jan 2006 18:06:15 GMT]]></title><description><![CDATA[<p>Keine gute Lösung, die Rückgabe ist nur temporärer Natur (cur.str() gibt einen temporären String zurück). Was spricht gegen den C++ String? Damit sähe das ganze etwa so aus:</p>
<pre><code class="language-cpp">std::string ChordKey::str ()
{
    std::ostringstream cur;
    for (int i = 0; i &lt; 20; ++i)
        cur &lt;&lt; std::hex &lt;&lt; static_cast&lt;int&gt; (key[i]);
    return cur.str ();
}
</code></pre>
<p>Wofür wird str () verwendet? Falls es für Ausgabeoperationen ist sollte auch eine Überladung des &lt;&lt;-Operators für ostream in Betracht gezogen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/980155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980155</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sun, 29 Jan 2006 18:06:15 GMT</pubDate></item><item><title><![CDATA[Reply to Delete in Destruktor on Sun, 29 Jan 2006 19:47:03 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>.filmor schrieb:</p>
<blockquote>
<p>Wofür wird str () verwendet?</p>
</blockquote>
<p>Die Methode soll die interne 20 byte Repräsentation des keys in eine 40-stellige Hexadezimalzahl Umrechnen, die dann in der Simulation an diversen Stellen angezeigt wird.</p>
<p>.filmor schrieb:</p>
<blockquote>
<p>Keine gute Lösung, die Rückgabe ist nur temporärer Natur (cur.str() gibt einen temporären String zurück). Was spricht gegen den C++ String?</p>
</blockquote>
<p>Warum ist denn die Rückgabe nur temporär? Eigentlich spräche nichts gegen C++-Strings, aber wenn ich so wie unten implementiere, fehlen mir bei manchen keys am Ende mehrere Hex-Ziffern.</p>
<pre><code class="language-cpp">std::string ChordKey::str ()
{
    std::ostringstream cur;
    for (int i = 0; i &lt; 20; ++i)
        cur &lt;&lt; std::hex &lt;&lt; static_cast&lt;int&gt; (key[i]);
    return cur.str ();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/980358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980358</guid><dc:creator><![CDATA[Inaniel]]></dc:creator><pubDate>Sun, 29 Jan 2006 19:47:03 GMT</pubDate></item><item><title><![CDATA[Reply to Delete in Destruktor on Mon, 30 Jan 2006 07:39:21 GMT]]></title><description><![CDATA[<p>Inaniel schrieb:</p>
<blockquote>
<p>Ich bin leider noch ziemlich unerfahren im Umgang mit c++. Wie sollte ein solcher Copy-Construktor denn in etwa aussehen?</p>
</blockquote>
<p>Er sollte ein eigenes Array mit new anlegen und den Inhalt deines Arrays dort reinkopieren. (Alternativ kannst du auch Referenzzählung implementieren und immer mitschreiben, wieviele Objekte gerade deinen Puffer verwenden.</p>
<blockquote>
<p>Warum ist denn die Rückgabe nur temporär?</p>
</blockquote>
<p>cur wird am Ende der Funktion wieder gelöscht und gibt dann auch den verwendeten Puffer wieder frei.</p>
<blockquote>
<p>...fehlen mir bei manchen keys am Ende mehrere Hex-Ziffern.</p>
</blockquote>
<p>Geh mal in den Debugger, um sie zu suchen <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/980691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980691</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 30 Jan 2006 07:39:21 GMT</pubDate></item></channel></rss>