<?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[operator new zerstört Speicherstruktur]]></title><description><![CDATA[<p>Wenn ich mit new Speicher anfordere und mit delete wieder frei gebe, dann stürzt mein Programm ab, wenn ich es zusammen mit dem Debugger laufen lasse. Ersetze ich new und delete durch gleichwertige Konstruktionen aus malloc und free, dann funktioniert es immer. Heisst das, dass in der Implementation der Standard-Bibliothek ein Fehler ist, oder kann man dieses Verhalten auf ein Problem in meinem Sourcecode zurückführen? Das Programm sieht, auf den Fehler reduziert etwa so aus:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
struct Foo
{
    Foo()
    {
        this-&gt;Bar = new T[0xff];
    }
    ~Foo()
    {
        delete(this-&gt;Bar);
    }
    static Foo *GetFoo()
    {
        static Foo Obj;
        return &amp;Obj;
    }
private:
    T *Bar;
};
int main()
{
    Foo&lt;unsigned&gt; *MyFoo = Foo&lt;unsigned&gt;::GetFoo();
    return 0;
}
</code></pre>
<p>Der Fehler tritt in der Funktion ~Foo auf, die, wie es der Standard fordert nach dem Verlassen von main aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/131143/operator-new-zerstört-speicherstruktur</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 02:53:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/131143.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 31 Dec 2005 13:53:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to operator new zerstört Speicherstruktur on Sat, 31 Dec 2005 13:53:48 GMT]]></title><description><![CDATA[<p>Wenn ich mit new Speicher anfordere und mit delete wieder frei gebe, dann stürzt mein Programm ab, wenn ich es zusammen mit dem Debugger laufen lasse. Ersetze ich new und delete durch gleichwertige Konstruktionen aus malloc und free, dann funktioniert es immer. Heisst das, dass in der Implementation der Standard-Bibliothek ein Fehler ist, oder kann man dieses Verhalten auf ein Problem in meinem Sourcecode zurückführen? Das Programm sieht, auf den Fehler reduziert etwa so aus:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
struct Foo
{
    Foo()
    {
        this-&gt;Bar = new T[0xff];
    }
    ~Foo()
    {
        delete(this-&gt;Bar);
    }
    static Foo *GetFoo()
    {
        static Foo Obj;
        return &amp;Obj;
    }
private:
    T *Bar;
};
int main()
{
    Foo&lt;unsigned&gt; *MyFoo = Foo&lt;unsigned&gt;::GetFoo();
    return 0;
}
</code></pre>
<p>Der Fehler tritt in der Funktion ~Foo auf, die, wie es der Standard fordert nach dem Verlassen von main aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953419</guid><dc:creator><![CDATA[WTF?!]]></dc:creator><pubDate>Sat, 31 Dec 2005 13:53:48 GMT</pubDate></item><item><title><![CDATA[Reply to operator new zerstört Speicherstruktur on Sat, 31 Dec 2005 13:57:47 GMT]]></title><description><![CDATA[<p>Achtung: Ich benutze natürlich delete[] this-&gt;Bar und <strong>nicht</strong> delete(this-&gt;Bar)!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953428</guid><dc:creator><![CDATA[WTF?!]]></dc:creator><pubDate>Sat, 31 Dec 2005 13:57:47 GMT</pubDate></item><item><title><![CDATA[Reply to operator new zerstört Speicherstruktur on Sat, 31 Dec 2005 14:00:05 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">delete [] ...
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Edit: Habe deinen Beitrag zu spät gesehen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953429</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 31 Dec 2005 14:00:05 GMT</pubDate></item><item><title><![CDATA[Reply to operator new zerstört Speicherstruktur on Sat, 31 Dec 2005 14:03:47 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">static Foo Obj;
</code></pre>
<p>Das gefällt mir irgendwie nicht. Foo ist doch eine Template Klasse und du benutzt es da wie eine normale...</p>
<p>Vielleicht hilft ja das :</p>
<pre><code class="language-cpp">static Foo&lt;T&gt; Obj;
</code></pre>
<p>Was besseres fällt mir jetzt auch nicht ein :xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953434</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 31 Dec 2005 14:03:47 GMT</pubDate></item><item><title><![CDATA[Reply to operator new zerstört Speicherstruktur on Sat, 31 Dec 2005 14:08:30 GMT]]></title><description><![CDATA[<p>Joa, ist schon klar. Habe ich auch so im richtigen Code <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /> . Natürlich habe ich es dann falsch abgeschrieben... genau wie mit dem operator delete vorhin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953437</guid><dc:creator><![CDATA[WTF?!]]></dc:creator><pubDate>Sat, 31 Dec 2005 14:08:30 GMT</pubDate></item><item><title><![CDATA[Reply to operator new zerstört Speicherstruktur on Sat, 31 Dec 2005 14:31:46 GMT]]></title><description><![CDATA[<p>Konntest du mit deinem Beispiel oben den Fehler reproduzieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953469</guid><dc:creator><![CDATA[User---]]></dc:creator><pubDate>Sat, 31 Dec 2005 14:31:46 GMT</pubDate></item><item><title><![CDATA[Reply to operator new zerstört Speicherstruktur on Sat, 31 Dec 2005 14:55:10 GMT]]></title><description><![CDATA[<p>User--- schrieb:</p>
<blockquote>
<p>Konntest du mit deinem Beispiel oben den Fehler reproduzieren?</p>
</blockquote>
<p>Ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953492</guid><dc:creator><![CDATA[WTF?!]]></dc:creator><pubDate>Sat, 31 Dec 2005 14:55:10 GMT</pubDate></item><item><title><![CDATA[Reply to operator new zerstört Speicherstruktur on Sat, 31 Dec 2005 15:05:32 GMT]]></title><description><![CDATA[<p>Ich nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> , bei mir kompiliert und läuft das anstandslos (sagt auch gdb)!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953501</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sat, 31 Dec 2005 15:05:32 GMT</pubDate></item><item><title><![CDATA[Reply to operator new zerstört Speicherstruktur on Sat, 31 Dec 2005 15:09:11 GMT]]></title><description><![CDATA[<p>Das ist nicht gut! Ich muss darüber nachdenken, wie ich das Problem umgehen kann. Vielleicht sollte ich meine eigenen Operatoren schreiben, die malloc und free benutzen und diese via Makro einbinden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953505</guid><dc:creator><![CDATA[WTF?!]]></dc:creator><pubDate>Sat, 31 Dec 2005 15:09:11 GMT</pubDate></item><item><title><![CDATA[Reply to operator new zerstört Speicherstruktur on Sat, 31 Dec 2005 15:18:41 GMT]]></title><description><![CDATA[<p>Ist T bei dir ein polymorpher Typ oder hast du wirklich immer nur einen Typ in dem Array?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953512</guid><dc:creator><![CDATA[An]]></dc:creator><pubDate>Sat, 31 Dec 2005 15:18:41 GMT</pubDate></item><item><title><![CDATA[Reply to operator new zerstört Speicherstruktur on Sat, 31 Dec 2005 15:28:06 GMT]]></title><description><![CDATA[<p>An schrieb:</p>
<blockquote>
<p>Ist T bei dir ein polymorpher Typ oder hast du wirklich immer nur einen Typ in dem Array?</p>
</blockquote>
<p>Es sollte im Prinzip immer funktionieren, egal was T nun ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953524</guid><dc:creator><![CDATA[WTF?!]]></dc:creator><pubDate>Sat, 31 Dec 2005 15:28:06 GMT</pubDate></item><item><title><![CDATA[Reply to operator new zerstört Speicherstruktur on Sat, 31 Dec 2005 16:08:18 GMT]]></title><description><![CDATA[<p>WTF?! schrieb:</p>
<blockquote>
<p>An schrieb:</p>
<blockquote>
<p>Ist T bei dir ein polymorpher Typ oder hast du wirklich immer nur einen Typ in dem Array?</p>
</blockquote>
<p>Es sollte im Prinzip immer funktionieren, egal was T nun ist.</p>
</blockquote>
<p>Du kannst in nem statischen Array keine polymorphen Typen speichern, da delete[] von dem statischen Typ (also der gemeinsamen Basis) ausgeht und wenn die Typen sich in ihrer Größe unterscheiden hast du nen Problem.<br />
Warum kannst du nicht einach nen boost::array oder std::vector verwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953547</guid><dc:creator><![CDATA[An]]></dc:creator><pubDate>Sat, 31 Dec 2005 16:08:18 GMT</pubDate></item><item><title><![CDATA[Reply to operator new zerstört Speicherstruktur on Sat, 31 Dec 2005 16:14:29 GMT]]></title><description><![CDATA[<p>An seinem Code ist nichts falsch, und es ist völlig egal, welcher Typ T ist. Er scheint nur eine ziemlich kaputte C++-Implementation zu haben</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953550</guid><dc:creator><![CDATA[Ringding]]></dc:creator><pubDate>Sat, 31 Dec 2005 16:14:29 GMT</pubDate></item><item><title><![CDATA[Reply to operator new zerstört Speicherstruktur on Sat, 31 Dec 2005 16:51:25 GMT]]></title><description><![CDATA[<p>An schrieb:</p>
<blockquote>
<p>WTF?! schrieb:</p>
<blockquote>
<p>An schrieb:</p>
<blockquote>
<p>Ist T bei dir ein polymorpher Typ oder hast du wirklich immer nur einen Typ in dem Array?</p>
</blockquote>
<p>Es sollte im Prinzip immer funktionieren, egal was T nun ist.</p>
</blockquote>
<p>Du kannst in nem statischen Array keine polymorphen Typen speichern, da delete[] von dem statischen Typ (also der gemeinsamen Basis) ausgeht und wenn die Typen sich in ihrer Größe unterscheiden hast du nen Problem.<br />
Warum kannst du nicht einach nen boost::array oder std::vector verwenden?</p>
</blockquote>
<p>Inwiefern sollte ein Vektor oder ein Wrapper um das Array etwas am Verhalten ändern? Vor allem, da std::vector prinzipiell auch nur ein dynamisches Array ist, es muss ein zusammenhängender Speicherblock sein! Außerdem hat er in seinem Beispiel T=unsigned gesetzt, nicht gerade ein für seine Polymorphie bekannter Typ!<br />
Also mein Compiler (mingw g++ 3.4.4) kriegt das hin. Welchen benutzt du?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953572</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sat, 31 Dec 2005 16:51:25 GMT</pubDate></item><item><title><![CDATA[Reply to operator new zerstört Speicherstruktur on Sun, 01 Jan 2006 18:53:59 GMT]]></title><description><![CDATA[<p>Freak_Coder schrieb:</p>
<blockquote>
<pre><code class="language-cpp">static Foo Obj;
</code></pre>
<p>Das gefällt mir irgendwie nicht. Foo ist doch eine Template Klasse und du benutzt es da wie eine normale...</p>
</blockquote>
<p>Was aber vollkommen legitim ist, denn Foo ist innerhalb der Klasse implizit Foo&lt;T&gt;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/954253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/954253</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sun, 01 Jan 2006 18:53:59 GMT</pubDate></item><item><title><![CDATA[Reply to operator new zerstört Speicherstruktur on Sun, 01 Jan 2006 21:29:50 GMT]]></title><description><![CDATA[<p>groovemaster schrieb:</p>
<blockquote>
<p>denn Foo ist innerhalb der Klasse implizit Foo&lt;T&gt;.</p>
</blockquote>
<p>Achso, thx.<br />
Dachte immer das nur die Elementfunktionen implizit Templates sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/954324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/954324</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 01 Jan 2006 21:29:50 GMT</pubDate></item></channel></rss>