<?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[Referenz-Parameter auf nullptr prüfen?]]></title><description><![CDATA[<p>Moin <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>Sollte man sich immer darauf verlassen, dass Referenzen als Funktionsparameter gültig sind oder sollte man auch hier die Parameter prüfen?</p>
<pre><code>void foo(int &amp;bar)
{
	bar = 5;
}

int main()
{
	// so ist es ok
	int var1 = 0;
	foo(var1);
	std::cout &lt;&lt; var1 &lt;&lt; std::endl;

	// wtf? wie unanständig!
	int *var2 = nullptr;
	foo(*var2);	 // -&gt; crash
	std::cout &lt;&lt; var2 &lt;&lt; std::endl;

	return 0;
}
</code></pre>
<pre><code>Diese Funktion fängt den Fehler bei 'foo(*var2)' ab:
void foo(int &amp;bar)
{
	if (&amp;bar == nullptr)
		return;

	bar = 5;
}
</code></pre>
<p>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/337779/referenz-parameter-auf-nullptr-prüfen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 18:08:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/337779.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 28 Apr 2016 07:01:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Referenz-Parameter auf nullptr prüfen? on Thu, 28 Apr 2016 07:01:35 GMT]]></title><description><![CDATA[<p>Moin <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>Sollte man sich immer darauf verlassen, dass Referenzen als Funktionsparameter gültig sind oder sollte man auch hier die Parameter prüfen?</p>
<pre><code>void foo(int &amp;bar)
{
	bar = 5;
}

int main()
{
	// so ist es ok
	int var1 = 0;
	foo(var1);
	std::cout &lt;&lt; var1 &lt;&lt; std::endl;

	// wtf? wie unanständig!
	int *var2 = nullptr;
	foo(*var2);	 // -&gt; crash
	std::cout &lt;&lt; var2 &lt;&lt; std::endl;

	return 0;
}
</code></pre>
<pre><code>Diese Funktion fängt den Fehler bei 'foo(*var2)' ab:
void foo(int &amp;bar)
{
	if (&amp;bar == nullptr)
		return;

	bar = 5;
}
</code></pre>
<p>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494365</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Thu, 28 Apr 2016 07:01:35 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Parameter auf nullptr prüfen? on Thu, 28 Apr 2016 07:21:36 GMT]]></title><description><![CDATA[<p>Du kannst Referenzen nicht auf nullptr prüfen.</p>
<p>Schon die Dereferenzierung eines nullptr's ist <strong>nicht erlaubt</strong> - wenn du prüfen musst/willst, dann musst du das ausserhalb mit dem Zeiger machen.</p>
<p>// Edit</p>
<p>PS: Auch wenn dein Bsp. - Code kompiliert, linkt und ausführbar ist, ist es nicht erlaubt, einen nullptr zu dereferenziern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494367</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 28 Apr 2016 07:21:36 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Parameter auf nullptr prüfen? on Thu, 28 Apr 2016 07:51:41 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Schon die Dereferenzierung eines nullptr's ist <strong>nicht erlaubt</strong></p>
</blockquote>
<p>Ja das ist richtig, daher stürzt das Programm im oberen Beispiel auch ab. Aber ist die Übergabe eines dereferentierten Pointers wirklich ungültig? Das ich hier einen nullptr übergeben habe war natürlich bewusst. Im Normalfall sollte es eine korrekt initialisiert Variable (Pointer) sein. Nun gibt es allerdings auch *Funktionen(), die bei Erfolg eine initialisierte Struktur und beim Fehler einen nullptr zurückgeben. Und genau hier wird es interessant.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494372</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Thu, 28 Apr 2016 07:51:41 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Parameter auf nullptr prüfen? on Thu, 28 Apr 2016 08:09:17 GMT]]></title><description><![CDATA[<p>Der einzige Weg um das von dir beschriebene Problem herzustellen, ist einen nullptr zu dereferenzieren, anders kommt der nullptr gar nicht erst in die Referenz rein...und ja, das ist &quot;ungültig&quot; (undefiniertes Verhalten)...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494374</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 28 Apr 2016 08:09:17 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Parameter auf nullptr prüfen? on Thu, 28 Apr 2016 08:09:19 GMT]]></title><description><![CDATA[<p>SBond schrieb:</p>
<blockquote>
<p>theta schrieb:</p>
<blockquote>
<p>Schon die Dereferenzierung eines nullptr's ist <strong>nicht erlaubt</strong></p>
</blockquote>
<p>Aber ist die Übergabe eines dereferentierten Pointers wirklich ungültig?</p>
</blockquote>
<p>Der Aufruf <code>function(*variable_mit_nullptr)</code> ist UB.</p>
<p>Wenn man mal in n3376 guckt (ist zwar nicht der offizielle Standard, aber gut genug), dann findet sich auf Seite 192 auch explizit eine Note mit deinem Beispiel:</p>
<blockquote>
<p>A reference shall be initialized to refer to a valid object or function. [ Note: in particular, a null reference cannot exist in a well-defined program, because the only way to create such a reference would be to bind it to the “object” obtained by dereferencing a null pointer, which causes undefined behavior. As described in 9.6, a reference cannot be bound directly to a bit-field. — end note ]</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2494375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494375</guid><dc:creator><![CDATA[wob]]></dc:creator><pubDate>Thu, 28 Apr 2016 08:09:19 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Parameter auf nullptr prüfen? on Thu, 28 Apr 2016 08:26:38 GMT]]></title><description><![CDATA[<p>SBond schrieb:</p>
<blockquote>
<p>... Aber ist die Übergabe eines dereferentierten Pointers wirklich ungültig?</p>
</blockquote>
<p>Nein, das ist natürlich gültig, mindestens sofern die Referenz auf ein gültiges Objekt zeigt (=es keine dangling Referenz ist).</p>
<p>SBond schrieb:</p>
<blockquote>
<p>... Nun gibt es allerdings auch *Funktionen(), die bei Erfolg eine initialisierte Struktur und beim Fehler einen nullptr zurückgeben. Und genau hier wird es interessant.</p>
</blockquote>
<p>Und genau hier ist es auch nicht erlaubt, einen nullptr zu dereferenzieren - es ist UB.</p>
<p>// Edit</p>
<p>Wenn du die Funktionen verketten möchtest, kannst du als Argument anstelle einer Referenz einen Zeiger verwenden - den Zeiger kannst du dann in der Funktion überprüfen und es ist erlaubt nullptr zu übergeben. Ob das Sinn macht, hängt vom konkreten Problem ab, dass es zu lösen gilt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494376</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 28 Apr 2016 08:26:38 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Parameter auf nullptr prüfen? on Thu, 28 Apr 2016 08:28:20 GMT]]></title><description><![CDATA[<p>Im Normalfall sollte man einen Pointer auf Gültigkeit prüfen, bevor man damit irgendetwas macht.</p>
<p>Aber es war auch nur aus Interesse heraus gefragt. Zugegeben, genau so etwas ist mir vor knapp 2 Monaten mal passiert:</p>
<pre><code>meineFunktion(DATENTYP &amp;meinParameter) {...}
void main ()
{
	DATENTYP *myVar = eineLibFunktion(...); // return nullptr bei Fehler
	meineFunktion(*myVar); // oh no
}
</code></pre>
<p>...so ist es dann doch besser:</p>
<pre><code>void main ()
{
	DATENTYP *myVar = eineLibFunktion(...); // return nullptr bei Fehler
	if (!myVar)
		throw std::string (&quot;irgendwas lief schief&quot;);

	meineFunktion(*myVar);
}
</code></pre>
<p>Ich danke euch für die Antwoten <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2494379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494379</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Thu, 28 Apr 2016 08:28:20 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Parameter auf nullptr prüfen? on Thu, 28 Apr 2016 10:37:48 GMT]]></title><description><![CDATA[<p>SBond schrieb:</p>
<blockquote>
<p>...so ist es dann doch besser:</p>
<pre><code>void main ()
{
	DATENTYP *myVar = eineLibFunktion(...); // return nullptr bei Fehler
	if (!myVar)
		throw std::string (&quot;irgendwas lief schief&quot;);
	
	meineFunktion(*myVar);
}
</code></pre>
</blockquote>
<p>Ansonsten gibt es in C++ sogar vorgefertigte exception typen, die genau dafür gedacht sind:</p>
<pre><code>throw std::runtime_error( &quot;irgendwas lief schief&quot; );
</code></pre>
<p>In der Situation, in der dieser Zustand aber nicht eintreten darf (bzw. bei fehlerfreier Software nicht eintreten kann):</p>
<pre><code>throw std::logic_error( &quot;Kann nicht sein.&quot; );
</code></pre>
<p>oder</p>
<pre><code>assert( yourVar );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2494404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494404</guid><dc:creator><![CDATA[Torsten Robitzki]]></dc:creator><pubDate>Thu, 28 Apr 2016 10:37:48 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Parameter auf nullptr prüfen? on Thu, 28 Apr 2016 10:46:33 GMT]]></title><description><![CDATA[<p>wob schrieb:</p>
<blockquote>
<blockquote>
<p>A reference shall be initialized to refer to a valid object or function. [ Note: in particular, a null reference cannot exist in a well-defined program, because the only way to create such a reference would be to bind it to the “object” obtained by dereferencing a null pointer, which causes undefined behavior. As described in 9.6, a reference cannot be bound directly to a bit-field. — end note ]</p>
</blockquote>
</blockquote>
<p>Dieses Zitat ist defekt (und im Übrigen nicht normativ). Ich verfasse gerade ein Paper, dass null lvalues einführt; das Dereferenzieren von Nullzeigern ist nämlich per se kein Problem, nur spezielle Verwendungen des resultierenden lvalues. Bspw. das Binden einer Referenz, wie im Beispiel des OP.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494407</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 28 Apr 2016 10:46:33 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Parameter auf nullptr prüfen? on Thu, 28 Apr 2016 10:58:21 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>das Dereferenzieren von Nullzeigern ist nämlich per se kein Problem, nur spezielle Verwendungen des resultierenden lvalues.</p>
</blockquote>
<p>Ist es nicht eher so dass nur bestimmte Dinge explizit erlaubt sind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494409</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 28 Apr 2016 10:58:21 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Parameter auf nullptr prüfen? on Thu, 28 Apr 2016 11:01:56 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Arcoth schrieb:</p>
<blockquote>
<p>das Dereferenzieren von Nullzeigern ist nämlich per se kein Problem, nur spezielle Verwendungen des resultierenden lvalues.</p>
</blockquote>
<p>Ist es nicht eher so dass nur bestimmte Dinge explizit erlaubt sind?</p>
</blockquote>
<p>Wobei <code>*(int*)0;</code> nicht explizit erlaubt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494413</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 28 Apr 2016 11:01:56 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Parameter auf nullptr prüfen? on Thu, 28 Apr 2016 11:49:03 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Dieses Zitat ist defekt (und im Übrigen nicht normativ).</p>
</blockquote>
<p>Dass es nicht normativ ist, ist mir klar, den Standard gibts aber ja nicht frei herunterzuladen. In <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4582.pdf" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4582.pdf</a> steht es noch genauso drin, auf Seite 215.</p>
<p>Was aber meinst du damit, dass es defekt ist? Für mich schien &quot;a null reference cannot exist in a well-defined program&quot; relativ eindeutig zu sein. Aber ich gebe gern zu, dass ich die Passage durch Suchen gefunden hatte und nicht den gesamten Text kenne. Könntest du mich erleuchten, was dem entgegen steht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494424</guid><dc:creator><![CDATA[wob]]></dc:creator><pubDate>Thu, 28 Apr 2016 11:49:03 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Parameter auf nullptr prüfen? on Thu, 28 Apr 2016 11:56:24 GMT]]></title><description><![CDATA[<p>wob schrieb:</p>
<blockquote>
<p>Dass es nicht normativ ist, ist mir klar, den Standard gibts aber ja nicht frei herunterzuladen.</p>
</blockquote>
<p>Das ist ein Implementierungsdetail das nicht interessiert. Wir abstrahieren einfach mal weg und behandeln den Standard als eine Menge von Regeln, kein Dokument.</p>
<blockquote>
<p>Was aber meinst du damit, dass es defekt ist?</p>
</blockquote>
<p>Siehe oben. Das Dereferenzieren eines Nullzeigers ist nicht für sich undefiniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494426</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 28 Apr 2016 11:56:24 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Parameter auf nullptr prüfen? on Thu, 28 Apr 2016 12:10:10 GMT]]></title><description><![CDATA[<p>wob schrieb:</p>
<blockquote>
<p>... Dass es nicht normativ ist, ist mir klar, den Standard gibts aber ja nicht frei herunterzuladen. In <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4582.pdf" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4582.pdf</a> steht es noch genauso drin, auf Seite 215.</p>
</blockquote>
<p>Arcoth hat nicht deswegen &quot;nicht normativ&quot; geschrieben, weil du nicht aus orginalen, aktuell gültigen und veröffentlichten Standard-Dokument zitiert hast, sondern weil es Abschnitte im Standard gibt, die sozusagen nicht zur Norm gehören (nicht zu den Regeln) - sie sind als Kommentar oder Begründung zu verstehen, verpflichten aber nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494429</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 28 Apr 2016 12:10:10 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Parameter auf nullptr prüfen? on Thu, 28 Apr 2016 12:58:33 GMT]]></title><description><![CDATA[<p>Ehrlich gesagt bin ich wohl ein bisschen schwer von Verständnis:</p>
<p>1. Das mit dem &quot;normativ&quot; ist durch thetas Kommentar klar. Ok.</p>
<p>2. Den eigentlichen Punkt habe ich immer noch nicht verstanden. Wenn dieser Satz also nicht normativ ist und nicht gelten muss, wie bekomme ich dann standardkonform in einem gültigen Programm eine auf nullptr zeigende Referenz hin?</p>
<p>3. Und weiterhin: in welchen Fällen darf ich denn *nullptr machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494433</guid><dc:creator><![CDATA[wob]]></dc:creator><pubDate>Thu, 28 Apr 2016 12:58:33 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Parameter auf nullptr prüfen? on Thu, 28 Apr 2016 13:37:14 GMT]]></title><description><![CDATA[<p>Wenn ich Arcoth richtig verstanden habe, geht es darum, dass eine Dereferenzierung eines nullptr's ansich kein Problem darstellt und auch nicht verboten ist - es ist allerdings verboten das Ergebnis der Dereferenzierung zu verwenden (z. B. binden an eine Referenz).</p>
<p>Ich denke, dass man nullptr's in der Praxis einfach nicht dereferenziert, da man das Ergebnis sowieso nicht verwenden kann.</p>
<p>// Edit</p>
<p>Alles in allem dünkt mich die Deref. eines nullptr's ein, zumindest aus meiner Sicht, nicht relevanter Fall im Alltag eines C++ Programmierers.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2494441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2494441</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 28 Apr 2016 13:37:14 GMT</pubDate></item></channel></rss>