<?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[nicht initialisierter Pointer auf Klasse]]></title><description><![CDATA[<p>hallo,</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

class Base
{
  public:
    void f1() { cout &lt;&lt; &quot;Base::f1()&quot; &lt;&lt; endl; }
};

int main()
{
    Base *mybase;
    mybase-&gt;f1();  // gibt &quot;Base::f1()&quot; aus.
    return 0;
}
</code></pre>
<p>ich frage mich warum das funktioniert. Warum erkennt der Compiler<br />
nicht das mybase noch gar nicht initialsiert ist? ( in der Form<br />
Base *mybase = new Base; )</p>
<p>Grüsse Mirko</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/327099/nicht-initialisierter-pointer-auf-klasse</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 20:24:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327099.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 23 Jul 2014 14:45:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to nicht initialisierter Pointer auf Klasse on Wed, 23 Jul 2014 14:47:36 GMT]]></title><description><![CDATA[<p>hallo,</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

class Base
{
  public:
    void f1() { cout &lt;&lt; &quot;Base::f1()&quot; &lt;&lt; endl; }
};

int main()
{
    Base *mybase;
    mybase-&gt;f1();  // gibt &quot;Base::f1()&quot; aus.
    return 0;
}
</code></pre>
<p>ich frage mich warum das funktioniert. Warum erkennt der Compiler<br />
nicht das mybase noch gar nicht initialsiert ist? ( in der Form<br />
Base *mybase = new Base; )</p>
<p>Grüsse Mirko</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410108</guid><dc:creator><![CDATA[offensiv]]></dc:creator><pubDate>Wed, 23 Jul 2014 14:47:36 GMT</pubDate></item><item><title><![CDATA[Reply to nicht initialisierter Pointer auf Klasse on Wed, 23 Jul 2014 14:50:33 GMT]]></title><description><![CDATA[<p>Dein Programm erzeugt undefiniertes Verhalten, es könnte theoretisch auch deine Festplatte formatieren. Dass es genau das ausgibt war eben Glück. Alle Zeiger bei der Definition nullen oder schon auf ein gültiges Objekt zeigen lassen, dann kannst du ganz einfach mit <code>(ptr == 0)</code> prüfen ob er gültig ist. (Dangling pointers jedoch vermeiden!)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410110</guid><dc:creator><![CDATA[Wurst Brot Supermarkt]]></dc:creator><pubDate>Wed, 23 Jul 2014 14:50:33 GMT</pubDate></item><item><title><![CDATA[Reply to nicht initialisierter Pointer auf Klasse on Wed, 23 Jul 2014 14:55:56 GMT]]></title><description><![CDATA[<p>Wurst Brot Supermarkt schrieb:</p>
<blockquote>
<p>Dein Programm erzeugt undefiniertes Verhalten, es könnte theoretisch auch deine Festplatte formatieren. Dass es genau das ausgibt war eben Glück. Alle Zeiger bei der Definition nullen oder schon auf ein gültiges Objekt zeigen lassen, dann kannst du ganz einfach mit <code>(ptr == 0)</code> prüfen ob er gültig ist. (Dangling pointers jedoch vermeiden!)</p>
</blockquote>
<p>wenn ich das mache:</p>
<p>Base *mybase = 0;</p>
<p>gibt er den Text trotzdem noch aus. Muss ich also jedes mal den Zeiger prüfen bevor ich einen Methodenaufruf mache? Oder gibt es da noch eine Compileroption<br />
um den Fehler beim compilieren zu erkennen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410113</guid><dc:creator><![CDATA[offensiv]]></dc:creator><pubDate>Wed, 23 Jul 2014 14:55:56 GMT</pubDate></item><item><title><![CDATA[Reply to nicht initialisierter Pointer auf Klasse on Wed, 23 Jul 2014 14:58:43 GMT]]></title><description><![CDATA[<p>offensiv schrieb:</p>
<blockquote>
<p>Warum erkennt der Compiler nicht das mybase noch gar nicht initialsiert ist?</p>
</blockquote>
<p>Weil er dafür nicht gemacht ist. Compiler sollen schnell schnellen und korrekten Code produzieren und gehen dabei davon aus, dass du ihnen korrekten Code vorlegst. Wenn der Compiler beim kompilieren über was stolpert was nicht geht, dann wird er es dir sagen, aber das ist Bonus. Für Fehlersuche hat er keine Zeit. Wenn du automatisch Fehler finden möchtest sieh dir static code analyzer wie cppcheck an.</p>
<p>offensiv schrieb:</p>
<blockquote>
<p>Muss ich also jedes mal den Zeiger prüfen bevor ich einen Methodenaufruf mache?</p>
</blockquote>
<p>Sorge dafür, dass immer alle Zeiger gültig sind und spare dir das Prüfen. Wenn du es unbedingt brauchst kannst du nullptr benutzen, aber das zieht viel nervigen redundanten fehleranfälligen Code hinterher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410114</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Wed, 23 Jul 2014 14:58:43 GMT</pubDate></item><item><title><![CDATA[Reply to nicht initialisierter Pointer auf Klasse on Wed, 23 Jul 2014 15:22:17 GMT]]></title><description><![CDATA[<blockquote>
<p>Dein Programm erzeugt undefiniertes Verhalten,</p>
</blockquote>
<p>Weil Zeiger die singulär sein können per Definition ungültig sind und folglich nicht dereferenziert werden dürfen, was aber durch den <code>-&gt;</code> -Operator implizit passiert, oder?</p>
<blockquote>
<p>es könnte theoretisch auch deine Festplatte formatieren</p>
</blockquote>
<p>Dass der Standard nichts dazu sagt, heißt nicht automatisch, dass der generierte Maschinencode auf Zufall beruht. In manchen Fällen passieren vielleicht verrückte Dinge, hier aber nicht (Implementierungen definieren AFAIR das Verhalten in diesem Fall).</p>
<blockquote>
<p>Dass es genau das ausgibt war eben Glück.</p>
</blockquote>
<p>Nicht wegen dem Maschinencode?<br />
Das ganze resultiert höchstwahrscheinlich (bzw. bei fast allen Implementierungen) einfach in einem Aufruf mit <code>0</code> als Argument für <code>this</code> (oder es wird mehr wegoptimiert), wenn ich mich nicht irre?</p>
<p>@TE: Geh mal mit dem Debugger durch, da könnte dir sehr schnell klar werden was da passiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410115</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 23 Jul 2014 15:22:17 GMT</pubDate></item><item><title><![CDATA[Reply to nicht initialisierter Pointer auf Klasse on Wed, 23 Jul 2014 17:35:43 GMT]]></title><description><![CDATA[<p>Jeder erfahrene C++ Programmierer weiß doch, das man die implemtierung jeder Memberfunktion noch wie folgt schützt.</p>
<pre><code>if(!this) return;
</code></pre>
<p>Wer Ironie findet, kann sie behalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410128</guid><dc:creator><![CDATA[nurf]]></dc:creator><pubDate>Wed, 23 Jul 2014 17:35:43 GMT</pubDate></item><item><title><![CDATA[Reply to nicht initialisierter Pointer auf Klasse on Wed, 23 Jul 2014 17:46:13 GMT]]></title><description><![CDATA[<p>De facto ist das ja eine &quot;static&quot;-Methode, da nicht auf Member (der Instanz) zugegriffen wird - und daher ist der this-Parameter (welcher auf Maschinencode-Ebene an die Funktion übergeben wird) unbenutzt und daher knallt es nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410129</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Wed, 23 Jul 2014 17:46:13 GMT</pubDate></item><item><title><![CDATA[Reply to nicht initialisierter Pointer auf Klasse on Wed, 23 Jul 2014 18:04:06 GMT]]></title><description><![CDATA[<p>Th69 schrieb:</p>
<blockquote>
<p>De facto ist das ja eine &quot;static&quot;-Methode, da nicht auf Member (der Instanz) zugegriffen wird - und daher ist der this-Parameter (welcher auf Maschinencode-Ebene an die Funktion übergeben wird) unbenutzt und daher knallt es nicht.</p>
</blockquote>
<p>ja kann ich bestätigen wenn ich in der f1() auf eine membervariable der Klasse zugreifen möchte gibt es einen Absturz. Mich wundert nur das C++ sowas zulässt, bzw man es nicht verhindern kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410132</guid><dc:creator><![CDATA[offensiv]]></dc:creator><pubDate>Wed, 23 Jul 2014 18:04:06 GMT</pubDate></item><item><title><![CDATA[Reply to nicht initialisierter Pointer auf Klasse on Wed, 23 Jul 2014 18:10:23 GMT]]></title><description><![CDATA[<p>offensiv schrieb:</p>
<blockquote>
<p>[...] Mich wundert nur das C++ sowas zulässt, bzw man es nicht verhindern kann.</p>
</blockquote>
<p>Nimm lieber BASIC ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410135</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Wed, 23 Jul 2014 18:10:23 GMT</pubDate></item><item><title><![CDATA[Reply to nicht initialisierter Pointer auf Klasse on Wed, 23 Jul 2014 18:29:16 GMT]]></title><description><![CDATA[<p>Swordfish schrieb:</p>
<blockquote>
<p>offensiv schrieb:</p>
<blockquote>
<p>[...] Mich wundert nur das C++ sowas zulässt, bzw man es nicht verhindern kann.</p>
</blockquote>
<p>Nimm lieber BASIC ...</p>
</blockquote>
<p>Danke für den wertvollen Hinweis zum Thema.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410139</guid><dc:creator><![CDATA[offensiv]]></dc:creator><pubDate>Wed, 23 Jul 2014 18:29:16 GMT</pubDate></item><item><title><![CDATA[Reply to nicht initialisierter Pointer auf Klasse on Wed, 23 Jul 2014 18:36:01 GMT]]></title><description><![CDATA[<p>Swordfish schrieb:</p>
<blockquote>
<p>Nimm lieber BASIC ...</p>
</blockquote>
<p>Ich hätte eher Java gesagt. Da wird dir vorgeschrieben wie du wann auf was zugreifen darfst, immer schön &quot;safe&quot;. Ist natürlich mit entsprechenden Kosten verbunden, aber so schlimm sind die nicht. Ernsthaft, C++ schützt dich nicht vor Fehlern sondern führt jeden Mist aus den du schreibst (solange es nicht widersprüchlich ist oder nicht geht). Entweder du akzeptierst das oder du nimmst eine andere Sprache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410142</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Wed, 23 Jul 2014 18:36:01 GMT</pubDate></item><item><title><![CDATA[Reply to nicht initialisierter Pointer auf Klasse on Wed, 23 Jul 2014 18:54:39 GMT]]></title><description><![CDATA[<p>nwp3 schrieb:</p>
<blockquote>
<p>Swordfish schrieb:</p>
<blockquote>
<p>Nimm lieber BASIC ...</p>
</blockquote>
<p>Ich hätte eher Java gesagt.[...]</p>
</blockquote>
<p>Bloß nicht! Da gibt es phöse <code>NullPointerException</code> s ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410146</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Wed, 23 Jul 2014 18:54:39 GMT</pubDate></item><item><title><![CDATA[Reply to nicht initialisierter Pointer auf Klasse on Wed, 23 Jul 2014 19:17:01 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18594">@Th69</a>: Das ist keine <code>static</code> -Methode (oder benutzt man das Wörtlein static auch in einem anderen Zusammenhang als als storage-specifier?). Es ist einfach eine Methode bei der nicht auf Member-Variablen zugegriffen wird. Da kann (und wird) der <code>this</code> -Parameter wegoptimiert werden, was dazu führt, dass das Objekt-Argument - wenn keine Seiteneffekte vorhanden sind - ebenfalls komplett wegoptimiert wird. Dadurch verschwindet auch der Teil der zu undefiniertem Verhalten führt. Laut Standard AFAICS nach wie vor ein Programm mit undefiniertem Verhalten - den interessiert ja keine Optimierung, von der erwartet er ja ein as-if Verhalten.</p>
<p>Bei C/C++ gibt es nun mal einen großen Speed &lt;&gt; Safety Tradeoff.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8250">@Swordfish</a>: Unterlass bitte dein Getrolle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410149</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 23 Jul 2014 19:17:01 GMT</pubDate></item><item><title><![CDATA[Reply to nicht initialisierter Pointer auf Klasse on Wed, 23 Jul 2014 20:36:38 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Das ist keine <code>static</code> -Methode [...]</p>
</blockquote>
<p>Nochmal, extra für dich:</p>
<p>Th69 schrieb:</p>
<blockquote>
<p><strong>De facto</strong> ist das ja eine &quot;static&quot;-Methode, [...]</p>
</blockquote>
<p>Arcoth schrieb:</p>
<blockquote>
<p>[...] Da kann (und wird) der this-Parameter wegoptimiert werden, [...]. Dadurch verschwindet auch der Teil der zu undefiniertem Verhalten führt. Laut Standard AFAICS nach wie vor ein Programm mit undefiniertem Verhalten - den interessiert ja keine Optimierung, von der erwartet er ja ein as-if Verhalten.</p>
</blockquote>
<p>Was redest du von irgendwelchen Optimierungen und <em>as-if</em>?!</p>
<p>ISO/IEC 14882-2011 (n3337) schrieb:</p>
<blockquote>
<p>24.2.1.5</p>
<p>[...][Example: <em><em>After the declaration of an uninitialized pointer x (as with int</em> x;), x must always be assumed to have a singular value of a pointer.</em>* —end example] Results of most expressions are undefined for singular values; [...] <strong>Dereferenceable values are always non-singular.</strong></p>
</blockquote>
<p><code>mybase</code> des OP ist also nicht dereferenzierbar. Was irgendeine bestimmte Implementierung daraus macht interessiert hier nicht und gehört allenfalls ins Compiler-/IDE-Forum, Herr Moderator.</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Unterlass bitte dein Getrolle.</p>
</blockquote>
<p>Ich trolle nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410156</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410156</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Wed, 23 Jul 2014 20:36:38 GMT</pubDate></item><item><title><![CDATA[Reply to nicht initialisierter Pointer auf Klasse on Wed, 23 Jul 2014 20:57:17 GMT]]></title><description><![CDATA[<blockquote>
<p>Was irgendeine bestimmte Implementierung daraus macht interessiert hier nicht</p>
</blockquote>
<p>Nein? Merkwürdig. Ich dachte der Thread dreht sich um die Tatsache dass eine Implementierung ein ausführbares Programm generiert hat dass mit seiner Ausgabe den TE verwirrt hat. Es ging nie primär darum undefiniertes Verhalten nachzuweisen, sondern die Ausgabe zu erklären. Letzteres ist nur durch Berücksichtigung gängiger Implementierungen möglich.</p>
<p>Dass ein potenziell singulärer Zeiger dereferenziert wird habe ich im Übrigen bereits selbst angemerkt. Leider hast du einen wichtigen Teil des Zitates vergessen.</p>
<p>§24.2.1/10 schrieb:</p>
<blockquote>
<p>An <em>invalid iterator</em> is an iterator that may be singular.<br />
[Fußnote:]<br />
This definition applies to pointers, since pointers are iterators. The effect of dereferencing an iterator that has been invalidated is undefined.</p>
</blockquote>
<p>Wir wissen nämlich nicht ob der Zeiger auch singulär ist. Da er es aber sein kann, wird der Fall durch obiges Zitat abgedeckt.</p>
<blockquote>
<p>Was redest du von irgendwelchen Optimierungen und <em>as-if</em>?!</p>
</blockquote>
<p>Wenn der Compiler einen Teil wegoptimiert, der undefiniertes Verhalten erzeugt hätte wenn er ausgeführt worden wäre, dann garantiert der Standard dafür (<em>AFAICS</em>) genauso wenig wie davor. Eben wegen as-if - das vom Compiler generierte Programm muss, wenn er bestimmte Dinge anders macht als der Standard es vorschreibt, das selbe warnehmbare Verhalten erzeugen. Wenn dazu solches gehört das vom Standard undefiniert ist, so bleibt dieses undefiniert - der Standard schreibt nach wie vor das Verhalten nicht vor, oder? <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>Swordfish schrieb:</p>
<blockquote>
<p>Nochmal, extra für dich:</p>
</blockquote>
<p>Das Objekt-Argument muss vorhanden sein und wird ausgewertet, was zu undefiniertem Verhalten führt. Eine static-Methode hat keinen Objekt-Parameter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410163</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 23 Jul 2014 20:57:17 GMT</pubDate></item></channel></rss>