<?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[Nullpointer?]]></title><description><![CDATA[<p>Hallo,</p>
<p>um etwas mehr die Pointer/Objekt Sache zu verstehen, habe ich mir folgendes Beispiel gebaut, von dem ich eigentlich dachte, dass es eine Ausnahme auslöst:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class obj 
{
public:
    void invoke() { cout &lt;&lt; &quot;invoked!&quot;; }
};

int main() {
  obj* o = 0; // Verweis auf &quot;nichts&quot;?
    o-&gt;invoke(); // hier Ausnahme!?
    delete o; // hier nicht, delete kann auf Nullpointer angewendet werden.
}
</code></pre>
<p>Bei mir passiert nichts ungewöhnliches, wird gestartet und die Ausgabe ist:</p>
<pre><code>invoked!
</code></pre>
<p>Was habe ich nicht verstanden? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/291724/nullpointer</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 19:36:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/291724.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 25 Aug 2011 11:19:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Nullpointer? on Thu, 25 Aug 2011 11:19:42 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>um etwas mehr die Pointer/Objekt Sache zu verstehen, habe ich mir folgendes Beispiel gebaut, von dem ich eigentlich dachte, dass es eine Ausnahme auslöst:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class obj 
{
public:
    void invoke() { cout &lt;&lt; &quot;invoked!&quot;; }
};

int main() {
  obj* o = 0; // Verweis auf &quot;nichts&quot;?
    o-&gt;invoke(); // hier Ausnahme!?
    delete o; // hier nicht, delete kann auf Nullpointer angewendet werden.
}
</code></pre>
<p>Bei mir passiert nichts ungewöhnliches, wird gestartet und die Ausgabe ist:</p>
<pre><code>invoked!
</code></pre>
<p>Was habe ich nicht verstanden? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110527</guid><dc:creator><![CDATA[O.o]]></dc:creator><pubDate>Thu, 25 Aug 2011 11:19:42 GMT</pubDate></item><item><title><![CDATA[Reply to Nullpointer? on Thu, 25 Aug 2011 11:25:04 GMT]]></title><description><![CDATA[<p>Solange du keine virtuellen Funktionen aufrufst und die Funktionen keine Member nutzen, passiert da idR nix.<br />
Ist aber imo undefiniertes Verhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110531</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Thu, 25 Aug 2011 11:25:04 GMT</pubDate></item><item><title><![CDATA[Reply to Nullpointer? on Thu, 25 Aug 2011 11:28:27 GMT]]></title><description><![CDATA[<p>Jockelx schrieb:</p>
<blockquote>
<p>Solange du keine virtuellen Funktionen aufrufst und die Funktionen keine Member nutzen, passiert da idR nix.<br />
Ist aber imo undefiniertes Verhalten.</p>
</blockquote>
<p><a href="http://www.drakon.ch/?id=&amp;offset=5&amp;mobile=0&amp;show_entry=76" rel="nofollow">Jop, ist es.</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110534</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 25 Aug 2011 11:28:27 GMT</pubDate></item><item><title><![CDATA[Reply to Nullpointer? on Thu, 25 Aug 2011 11:42:07 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">obj* o = 0; // Verweis auf &quot;nichts&quot;?
</code></pre>
<p>ist richtig</p>
<pre><code class="language-cpp">o-&gt;invoke(); // hier Ausnahme!?
</code></pre>
<p>Nein, nur undefiniertes Verhalten. Du darfst den Pointer nicht dereferenzieren, weil er 0 ist. Soviel zur Theorie. In der Praxis weiß der Compiler, dass er für obj::invoke nicht wissen muss, wohin der Pointer zeigt (weil keine Membervariablen, Basisklassen oder virtuelle Funktionen betroffen sind) und wird den Pointer deshalb auch nicht dereferenzieren. Deshalb stolpert er auch nicht über die Tatsache, dass der nirgendwohin zeigt.</p>
<pre><code class="language-cpp">delete o; // hier nicht, delete kann auf Nullpointer angewendet werden.
</code></pre>
<p>Richtig. Ist im Standard so definiert, dass delete auf Nullpointer okay und wirkungslos ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110544</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 25 Aug 2011 11:42:07 GMT</pubDate></item><item><title><![CDATA[Reply to Nullpointer? on Thu, 25 Aug 2011 12:08:06 GMT]]></title><description><![CDATA[<p>Vielen Dank.<br />
Das die Memberfunktionen im Prinzip über invoke(o) aufgerufen wird, hat mir die Augen geöffnet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110553</guid><dc:creator><![CDATA[_)]]></dc:creator><pubDate>Thu, 25 Aug 2011 12:08:06 GMT</pubDate></item><item><title><![CDATA[Reply to Nullpointer? on Thu, 25 Aug 2011 12:47:38 GMT]]></title><description><![CDATA[<p>_) schrieb:</p>
<blockquote>
<p>Vielen Dank.<br />
Das die Memberfunktionen im Prinzip über invoke(o) aufgerufen wird, hat mir die Augen geöffnet.</p>
</blockquote>
<p>Muss aber nicht so sein - so ist es einfach bei den meisten Implementationen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110569</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 25 Aug 2011 12:47:38 GMT</pubDate></item><item><title><![CDATA[Reply to Nullpointer? on Fri, 26 Aug 2011 07:07:59 GMT]]></title><description><![CDATA[<p>Okay, vielen Dank für eure Antworten. : )</p>
<p>Nun eine Frage zum &quot;Stil&quot;; eine Klasse verwaltet eine Liste von Pointern, in wie weit könnte ich dann Probleme kriegen, wenn ich per &quot;new&quot; Objekte referenziert hinzufüge?</p>
<pre><code class="language-cpp">//... includes ...

class obj 
{
  // Klasse mit Member und Funktionen
};

class pmap
{
private:
  vector&lt;obj*&gt; _list;
public
  void add(obj* p) 
  {
    _list.push_back(p);
  }
  obj* get(int i)
  {
    // ... argument check
    return _list[i];
  }

  // ....
  ~pamp() { // ... delete auf alle Elemente aus _list }
};

int main()
{
  // ...
  pmap.add(new obj);
  // ...
  pmap.get(1)-&gt;...;
}
</code></pre>
<p>Schlechter Stil oder vollkommen in Ordnung?<br />
Im Prinzip fühle ich mich wohl damit, aber vielleicht zu Unrecht, vielleicht sehe ich etwas nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110839</guid><dc:creator><![CDATA[O.o]]></dc:creator><pubDate>Fri, 26 Aug 2011 07:07:59 GMT</pubDate></item><item><title><![CDATA[Reply to Nullpointer? on Fri, 26 Aug 2011 07:22:48 GMT]]></title><description><![CDATA[<p>Du solltest sie (i.d.R.) sogar mit new Anlegen, da die Lebensdauer sonst auf den Scope {} beschränkt ist.</p>
<p>Löschen (delete) aber nicht vergessen!!!<br />
(Oder gleich boost::ptr_vector verwenden)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110843</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Fri, 26 Aug 2011 07:22:48 GMT</pubDate></item><item><title><![CDATA[Reply to Nullpointer? on Fri, 26 Aug 2011 07:34:45 GMT]]></title><description><![CDATA[<p>Das einzige problem was ich sehe ist, wenn list::push_back eine Exception wirft, was nur sein kann, wenn der Speicher ausgeht. Dann wäre der Pointer auf das grade neu angelegte Objekt flöten und du hättest ein Speicherleck.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110849</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 26 Aug 2011 07:34:45 GMT</pubDate></item><item><title><![CDATA[Reply to Nullpointer? on Fri, 26 Aug 2011 07:40:49 GMT]]></title><description><![CDATA[<p>O.o schrieb:</p>
<blockquote>
<p>Schlechter Stil oder vollkommen in Ordnung?<br />
Im Prinzip fühle ich mich wohl damit, aber vielleicht zu Unrecht, vielleicht sehe ich etwas nicht?</p>
</blockquote>
<p>3 Dinge:<br />
- Ausnahmesicherheit (siehe pumuckls Beitrag)<br />
- Hast Du auch die Dreierregel beachtet?<br />
- Warum heist das Ding &quot;pmap&quot; wenn es &quot;pvec&quot; hätte heißen können?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110852</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 26 Aug 2011 07:40:49 GMT</pubDate></item><item><title><![CDATA[Reply to Nullpointer? on Fri, 26 Aug 2011 07:41:53 GMT]]></title><description><![CDATA[<p>Erstmal danke für die Antworten. <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>Also wenn ich folgendes mache:</p>
<pre><code class="language-cpp">// wie oben.
int main
{
  // eigene scope ..
  {
  obj* p = new obj;
  pmap.add(p);
  } // obj tot?
}
</code></pre>
<p>Und anders, was passiert, wenn ich das Objekt von außen lösche; könnte es sein, dass dann mein Zeiger irgendwann auf was ganz anderes zeigt?</p>
<pre><code class="language-cpp">int main
{
  obj* p = new obj;
  pmap.add(p);
  delete p;
  /*
    ... nun erstelle ich andere Objekte vom Typ obj2, welcher nichts mit obj zu tun hat. Zeigt dann der gerade hinzugefügte Pointer irgendwann in so ein obj2 hinein?
 */
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2110853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110853</guid><dc:creator><![CDATA[o.O]]></dc:creator><pubDate>Fri, 26 Aug 2011 07:41:53 GMT</pubDate></item><item><title><![CDATA[Reply to Nullpointer? on Fri, 26 Aug 2011 07:47:05 GMT]]></title><description><![CDATA[<p>Nachtrag als Antwort auf krümelkacker:</p>
<p>- Exceptions, wird implementiert.<br />
- Dreierregel kannte ich bisher nicht. Notiert. Danke dafür. <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="🙂"
    /><br />
- Die Grundidee war auf einer map basiert. <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/2110855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110855</guid><dc:creator><![CDATA[o.O]]></dc:creator><pubDate>Fri, 26 Aug 2011 07:47:05 GMT</pubDate></item><item><title><![CDATA[Reply to Nullpointer? on Fri, 26 Aug 2011 07:52:47 GMT]]></title><description><![CDATA[<blockquote>
<p>Und anders, was passiert, wenn ich das Objekt von außen lösche; könnte es sein, dass dann mein Zeiger irgendwann auf was ganz anderes zeigt?</p>
</blockquote>
<p>Ja. Du darfst den Zeiger nicht mehr dereferenzieren!</p>
<blockquote>
<p>nun erstelle ich andere Objekte vom Typ obj2, welcher nichts mit obj zu tun hat. Zeigt dann der gerade hinzugefügte Pointer irgendwann in so ein obj2 hinein?</p>
</blockquote>
<p>Nein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110859</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 26 Aug 2011 07:52:47 GMT</pubDate></item><item><title><![CDATA[Reply to Nullpointer? on Fri, 26 Aug 2011 08:29:07 GMT]]></title><description><![CDATA[<p>o.O schrieb:</p>
<blockquote>
<p>- Exceptions, wird implementiert.</p>
</blockquote>
<p>Exceptionsicherheit ist was anderes, als selber Exceptions zu schmeißen. Es geht da drum, wie gutartig sich dein Programmm im Ausnahmefall verhält. Siehe zum Beispiel erste Antwort hier:</p>
<p><a href="http://stackoverflow.com/questions/1853243/c-do-you-really-write-exception-safe-code" rel="nofollow">http://stackoverflow.com/questions/1853243/c-do-you-really-write-exception-safe-code</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110871</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 26 Aug 2011 08:29:07 GMT</pubDate></item><item><title><![CDATA[Reply to Nullpointer? on Fri, 26 Aug 2011 08:34:26 GMT]]></title><description><![CDATA[<p>Ihr scheint zu vergessen, dass sein Objekt 0 Bytes groß ist. Was würde denn new in diesem Fall zurückgeben? Wohl auch nen Dummywert, den man eigentlich nicht dereferenzieren dürfte, also wirds wohl kein undefiniertes Verhalten sein ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110872</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 26 Aug 2011 08:34:26 GMT</pubDate></item><item><title><![CDATA[Reply to Nullpointer? on Fri, 26 Aug 2011 08:48:22 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Ihr scheint zu vergessen, dass sein Objekt 0 Bytes groß ist. Was würde denn new in diesem Fall zurückgeben? Wohl auch nen Dummywert, den man eigentlich nicht dereferenzieren dürfte, also wirds wohl kein undefiniertes Verhalten sein ...</p>
</blockquote>
<p>Objekte sind nie 0 Byte groß. Zur Not haben sie eine Dummygröße.</p>
<p>edit: Und man sollte vielleicht noch erwähnen, dass eine leere Klasse als Basisklasse wiederum eine Größe von 0 haben darf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110876</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 26 Aug 2011 08:48:22 GMT</pubDate></item><item><title><![CDATA[Reply to Nullpointer? on Fri, 26 Aug 2011 12:42:03 GMT]]></title><description><![CDATA[<p>Vieleicht gehört hier noch erwähnt, dass das die EBO (Empty Base Optimization) ist, die bei manchen Compilern bei Mehrfachvererbung und komplizierteren Hierarchien leider nicht mehr greift.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110982</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 26 Aug 2011 12:42:03 GMT</pubDate></item><item><title><![CDATA[Reply to Nullpointer? on Fri, 26 Aug 2011 18:50:07 GMT]]></title><description><![CDATA[<p>Das Zeug von O.o ist nicht mal compilationsfähig, wenn der Destruktor</p>
<pre><code class="language-cpp">~pamp() { // ... delete auf alle Elemente aus _list }
</code></pre>
<p>heißt, vermute ich...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2111198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2111198</guid><dc:creator><![CDATA[randomerror62423423]]></dc:creator><pubDate>Fri, 26 Aug 2011 18:50:07 GMT</pubDate></item></channel></rss>