<?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[Zuweisungsoperatorüberladung -&amp;gt; uninizialisierte Zeiger]]></title><description><![CDATA[<p>Hallo an Alle,</p>
<p>ich bin noch recht neu in der ganzen C++ Welt, habe sonst viel mit C# und ein wenig mit C gemacht, also bitte ich darum meine (höchst wahrscheinlich) Noobige Frage zu entschuldigen <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>
<p>Und zwar habe ich eine Klasse A die eine private Member vom Typ char * hat. Dieser wird im Konstruktor mit NULL bzw. 0 initialisiert. Außerdem ist der Kopierkonstruktor und die operator= Methode implementiert.<br />
Dann habe ich eine Klasse B mit einem privaten Member vom Typ A. Dem Konstruktor muss A übergeben werden, folglich wird die operator= Methode von A aufgerufen.<br />
Das Problem ist, dass in dieser Methode auf der Source Seite die Zeiger nicht initialisiert sind und auf irgendwas zeigen. Wird in A Speicher für char * reserviert, tritt das Problem nicht auf.</p>
<p>Hier mal der Source-Code dazu. Die Anwendung crasht beim delete. Aber eigentlich dürfte delete nie aufgerufen werden, weil die Zeiger ja NULL sein müssten.<br />
Kompiliert hab ich es unter Linux mit g++;</p>
<pre><code>#include &lt;string.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

class A {
private:
    char *key;
    size_t key_size;
public:
    A() {
        key = NULL;
        key_size = 0;
    }
    A(const A&amp; src) {
        if(src.key != NULL)
        {
            this-&gt;key = new char[src.key_size];
            memcpy(this-&gt;key, src.key, src.key_size);
            this-&gt;key_size = src.key_size;
        }
    }
    ~A() {
        // this-&gt;key sollte NULL sein ist es aber nicht, warum auch immer
        if(this-&gt;key != NULL)
            delete this-&gt;key;
    }
    A &amp;operator = (const A &amp;src) {
        if(this != &amp;src)
        {
            // src.key sollte NULL sein ist es aber nicht, warum auch immer
            if(src.key != NULL)
            {
                this-&gt;key = new char[src.key_size];
                memcpy(this-&gt;key, src.key, src.key_size);
                this-&gt;key_size = src.key_size;
            }
        }
    }
};

class B {
private:
    A a;
public:
    B(A a) {
        this-&gt;a = a;
    }
};

int main(int argc, char** argv) {

    A a;
    B *b = new B(a);
    delete b;
    return 0;
}
</code></pre>
<p>Schon mal vielen Dank für eure Mühen und die Aufklärung des Sachverhalts.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/336646/zuweisungsoperatorüberladung-gt-uninizialisierte-zeiger</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 07:02:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/336646.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 06 Feb 2016 17:22:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zuweisungsoperatorüberladung -&amp;gt; uninizialisierte Zeiger on Sat, 06 Feb 2016 17:22:04 GMT]]></title><description><![CDATA[<p>Hallo an Alle,</p>
<p>ich bin noch recht neu in der ganzen C++ Welt, habe sonst viel mit C# und ein wenig mit C gemacht, also bitte ich darum meine (höchst wahrscheinlich) Noobige Frage zu entschuldigen <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>
<p>Und zwar habe ich eine Klasse A die eine private Member vom Typ char * hat. Dieser wird im Konstruktor mit NULL bzw. 0 initialisiert. Außerdem ist der Kopierkonstruktor und die operator= Methode implementiert.<br />
Dann habe ich eine Klasse B mit einem privaten Member vom Typ A. Dem Konstruktor muss A übergeben werden, folglich wird die operator= Methode von A aufgerufen.<br />
Das Problem ist, dass in dieser Methode auf der Source Seite die Zeiger nicht initialisiert sind und auf irgendwas zeigen. Wird in A Speicher für char * reserviert, tritt das Problem nicht auf.</p>
<p>Hier mal der Source-Code dazu. Die Anwendung crasht beim delete. Aber eigentlich dürfte delete nie aufgerufen werden, weil die Zeiger ja NULL sein müssten.<br />
Kompiliert hab ich es unter Linux mit g++;</p>
<pre><code>#include &lt;string.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

class A {
private:
    char *key;
    size_t key_size;
public:
    A() {
        key = NULL;
        key_size = 0;
    }
    A(const A&amp; src) {
        if(src.key != NULL)
        {
            this-&gt;key = new char[src.key_size];
            memcpy(this-&gt;key, src.key, src.key_size);
            this-&gt;key_size = src.key_size;
        }
    }
    ~A() {
        // this-&gt;key sollte NULL sein ist es aber nicht, warum auch immer
        if(this-&gt;key != NULL)
            delete this-&gt;key;
    }
    A &amp;operator = (const A &amp;src) {
        if(this != &amp;src)
        {
            // src.key sollte NULL sein ist es aber nicht, warum auch immer
            if(src.key != NULL)
            {
                this-&gt;key = new char[src.key_size];
                memcpy(this-&gt;key, src.key, src.key_size);
                this-&gt;key_size = src.key_size;
            }
        }
    }
};

class B {
private:
    A a;
public:
    B(A a) {
        this-&gt;a = a;
    }
};

int main(int argc, char** argv) {

    A a;
    B *b = new B(a);
    delete b;
    return 0;
}
</code></pre>
<p>Schon mal vielen Dank für eure Mühen und die Aufklärung des Sachverhalts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2486096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2486096</guid><dc:creator><![CDATA[nanohcv]]></dc:creator><pubDate>Sat, 06 Feb 2016 17:22:04 GMT</pubDate></item><item><title><![CDATA[Reply to Zuweisungsoperatorüberladung -&amp;gt; uninizialisierte Zeiger on Sat, 06 Feb 2016 17:34:28 GMT]]></title><description><![CDATA[<p>nanohcv schrieb:</p>
<blockquote>
<pre><code>A(const A&amp; src) {
        if(src.key != NULL)
        {
            this-&gt;key = new char[src.key_size];
            memcpy(this-&gt;key, src.key, src.key_size);
            this-&gt;key_size = src.key_size;
        }
    }
</code></pre>
</blockquote>
<p>Überleg mal was in deinem Copy-Constructor passiert wenn <code>src.key NULL</code> ist. Wie wird dann <code>key</code> und <code>key_size</code> von dem neuen Objekt initialisiert?</p>
<p>PS: Ein Check auf ungleich <code>NULL</code> beim <code>delete</code> ist unnötig, da <code>delete</code> bei einem <code>NULL</code> Pointer gar nichts macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2486097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2486097</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Sat, 06 Feb 2016 17:34:28 GMT</pubDate></item><item><title><![CDATA[Reply to Zuweisungsoperatorüberladung -&amp;gt; uninizialisierte Zeiger on Sat, 06 Feb 2016 17:39:04 GMT]]></title><description><![CDATA[<p>Ach ja, so einfach.<br />
Manchmal sieht man den Wald vor lauter Bäumen nicht.</p>
<p>Besten Dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2486099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2486099</guid><dc:creator><![CDATA[nanohcv]]></dc:creator><pubDate>Sat, 06 Feb 2016 17:39:04 GMT</pubDate></item><item><title><![CDATA[Reply to Zuweisungsoperatorüberladung -&amp;gt; uninizialisierte Zeiger on Sat, 06 Feb 2016 17:49:32 GMT]]></title><description><![CDATA[<p>Wenn wir schon dabei sind: std::string statt diesem char-zeigergefuchtel und nimm die ollen c-header raus. Alles in der c-standardbibliothek, die teil der von c++ ist, solltest du mit einem c davor includen: string.h -&gt; cstring etc. Generell gibt es aber keinen grund, diese einzubinden, außer vielleicht dinge wie cstdint.<br />
Soweit wie möglich auf allokationen mit new verzichten. Wenn, dann kommen smartpointer, zb unique_ptr, zum einsatz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2486100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2486100</guid><dc:creator><![CDATA[Techel]]></dc:creator><pubDate>Sat, 06 Feb 2016 17:49:32 GMT</pubDate></item></channel></rss>