<?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[Konstrukoren aus anderen Konstruktoren heraus aufrufen. - Zeiger != NULL?]]></title><description><![CDATA[<p>Hi<br />
Ich habe eine Reihe Konstruktoren und würde aus diesen gerne einen anderen Konstruktor aufrufen.<br />
Das ganze funktioniert soweit ja auch, nun setze ich in diesem Konstruktor einen Zeiger auf NULL, damit er nicht versucht ihn im Destruktor zu löschen.<br />
Naja, machter trotzdem, weil der Zeiger nicht NULL ist.<br />
Warum ist der Zeiger nicht NULL? Er wird nicht von außerhalb angerührt.<br />
Ich hab mein Problem mal zur Veranschaulichung vereinfacht:</p>
<pre><code class="language-cpp">class bar
  {
  public:
    bar(int a)
      {
      bar();
      }
    bar() : var(0)
      {
      }
    ~bar()
      {
      if(var != 0)
        delete var;
      }
  private:
    int* var;
  };

int main()
  {
  bar blubb(3);
  }
</code></pre>
<p>Ich bekomme also eine Zugriffsverletzung, weil er trotzdem versucht var zu löschen.<br />
Warum?<br />
Und warum geschieht das nur wenn ich es aus einem Konstruktor heraus aufrufe, der aus einem Konstruktor heraus aufgerufen wurde?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/206254/konstrukoren-aus-anderen-konstruktoren-heraus-aufrufen-zeiger-null</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 07:03:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/206254.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 22 Feb 2008 16:48:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstrukoren aus anderen Konstruktoren heraus aufrufen. - Zeiger != NULL? on Fri, 22 Feb 2008 16:48:17 GMT]]></title><description><![CDATA[<p>Hi<br />
Ich habe eine Reihe Konstruktoren und würde aus diesen gerne einen anderen Konstruktor aufrufen.<br />
Das ganze funktioniert soweit ja auch, nun setze ich in diesem Konstruktor einen Zeiger auf NULL, damit er nicht versucht ihn im Destruktor zu löschen.<br />
Naja, machter trotzdem, weil der Zeiger nicht NULL ist.<br />
Warum ist der Zeiger nicht NULL? Er wird nicht von außerhalb angerührt.<br />
Ich hab mein Problem mal zur Veranschaulichung vereinfacht:</p>
<pre><code class="language-cpp">class bar
  {
  public:
    bar(int a)
      {
      bar();
      }
    bar() : var(0)
      {
      }
    ~bar()
      {
      if(var != 0)
        delete var;
      }
  private:
    int* var;
  };

int main()
  {
  bar blubb(3);
  }
</code></pre>
<p>Ich bekomme also eine Zugriffsverletzung, weil er trotzdem versucht var zu löschen.<br />
Warum?<br />
Und warum geschieht das nur wenn ich es aus einem Konstruktor heraus aufrufe, der aus einem Konstruktor heraus aufgerufen wurde?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1461088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461088</guid><dc:creator><![CDATA[JustAnotherNoob]]></dc:creator><pubDate>Fri, 22 Feb 2008 16:48:17 GMT</pubDate></item><item><title><![CDATA[Reply to Konstrukoren aus anderen Konstruktoren heraus aufrufen. - Zeiger != NULL? on Fri, 22 Feb 2008 16:51:55 GMT]]></title><description><![CDATA[<p>afaik kann man aus einem Konstruktor keinen weiteren Konstruktor aufrufen. Außerdem hat delete von sich aus eine Prüfung gegen NULL, was du da machst, ist also überflüssig <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/1461090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461090</guid><dc:creator><![CDATA[Ryuzaki]]></dc:creator><pubDate>Fri, 22 Feb 2008 16:51:55 GMT</pubDate></item><item><title><![CDATA[Reply to Konstrukoren aus anderen Konstruktoren heraus aufrufen. - Zeiger != NULL? on Fri, 22 Feb 2008 16:52:47 GMT]]></title><description><![CDATA[<p>Hallo</p>
<pre><code class="language-cpp">class bar
  {
  public:
    bar(int a) : var(0) // Hier muß noch initialisiert werden
      {
      bar(); // Hier wird nicht der Konstruktor für this aufgerufen
      // Sondern ein neues, temporäres Objekt erstellt.
      }
    bar() : var(0)
      {
      }
    ~bar()
      {
//      if(var != 0) Unnötig weil delete(0) in Ordnung ist
        delete var;
      }
  private:
    int* var;
  };

int main()
  {
  bar blubb(3);
  }
</code></pre>
<p>Eventuell solltest du statt den zwei Konstruktoren lieber einen mit einem Default Value für den Parameter verwenden.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1461092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461092</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Fri, 22 Feb 2008 16:52:47 GMT</pubDate></item><item><title><![CDATA[Reply to Konstrukoren aus anderen Konstruktoren heraus aufrufen. - Zeiger != NULL? on Fri, 22 Feb 2008 17:06:48 GMT]]></title><description><![CDATA[<p>Das war ja nur ein Beispiel, in der Anwendung in der das Problem gerade aufgetreten ist handelt es sich um 2 Konstruktoren die beide Parameter annehmen, aber verschiedenen Types.</p>
<p>Übrigens werden dadurch wirklich beide Konstruktoren aufgerufen und der Debugger sagt auch, dass var kurzzeitig wirklich 0 ist, aber eben nur kurzzeitig, nach dem Aufruf beider KOnstruktoren hat er wieder so einen merkwürdigen Wert der Zugriffsverletzungen hervorruft.</p>
<p>Was empfehlt ihr dann? Eine gemeinsame Funktion zum NULLsetzen aller Zeiger(und tun was sonst noch so gemeinsames ansteht)? Kam mir ein wenig merkwürdig vor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1461099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461099</guid><dc:creator><![CDATA[JustAnotherNoob]]></dc:creator><pubDate>Fri, 22 Feb 2008 17:06:48 GMT</pubDate></item><item><title><![CDATA[Reply to Konstrukoren aus anderen Konstruktoren heraus aufrufen. - Zeiger != NULL? on Fri, 22 Feb 2008 17:22:48 GMT]]></title><description><![CDATA[<p>ne doch, so ist richtig. Die fkt machst du private und rufst sie in den konstruktoren auf, in denen du das nullsetzen würdest.</p>
<p>Im debugger musst du dann mal im zweiten KOnstruktoraufruf this mit dem this in der übergeordneten konstruktor vergleichen, wirst sehen, ist ein anderes objekt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1461110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461110</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Fri, 22 Feb 2008 17:22:48 GMT</pubDate></item><item><title><![CDATA[Reply to Konstrukoren aus anderen Konstruktoren heraus aufrufen. - Zeiger != NULL? on Fri, 22 Feb 2008 18:15:13 GMT]]></title><description><![CDATA[<p>JustAnotherNoob schrieb:</p>
<blockquote>
<p>Übrigens werden dadurch wirklich beide Konstruktoren aufgerufen und der Debugger sagt auch, dass var kurzzeitig wirklich 0 ist, aber eben nur kurzzeitig, nach dem Aufruf beider KOnstruktoren hat er wieder so einen merkwürdigen Wert der Zugriffsverletzungen hervorruft.</p>
</blockquote>
<p>Kurzzeitig, weil nur kurz &quot;var&quot; des temporären Objektes 0 ist. Wie akari schon schrieb, mit &quot;bar();&quot; erstellst du ein neues temporäres Objekt, von dem natürlich auch der Konstruktor aufgerufen wird, und darin (in dem neuen Objekt) ist &quot;var&quot; dann halt 0.<br />
Du kannst, wenn du mit dem Debugger durchschreitest, ja auch mal den this-Zeiger vergleichen, oder meinetwegen in den Konstruktoren auch ausgeben lassen, dann müsste es klarer werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1461152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461152</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 22 Feb 2008 18:15:13 GMT</pubDate></item></channel></rss>