<?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 auf temporäres Objekt in Funktion - Während des Funktionsaufruf-Ausdrucks auch nicht mehr gültig?]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich frage mich, warum das nicht will:</p>
<pre><code class="language-cpp">set&lt;int&gt; values;

struct TestStruct
{
	vector&lt;set&lt;int&gt;::iterator&gt; entries;
	string remaining;
};

// Wenn ich TestStruct nicht als Referenz zurückgebe, funktioniert es...
TestStruct&amp; GetEntries()
{
	TestStruct testStruct;

	for(set&lt;int&gt;::iterator it = values.begin(); it != values.end(); ++it)
		testStruct.entries.push_back(it);

	testStruct.remaining = &quot;test&quot;;

	return testStruct;
}

int main()
{
	values.insert(4);
	values.insert(7);
	values.insert(51);

	if(GetEntries().entries.empty())
		cout &lt;&lt; &quot;LEER =(&quot; &lt;&lt; endl;
}
</code></pre>
<p>Die temporäre &quot;testStruct&quot; sollte doch während dem Funktionsaufruf-Ausdruck gültig bleiben? Gibt mir aber &quot;LEER =(&quot; aus (Im Releasebuild crasht es), außer wenn ich eine Kopie der Struktur zurückgebe.</p>
<p><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>
]]></description><link>https://www.c-plusplus.net/forum/topic/243702/referenz-auf-temporäres-objekt-in-funktion-während-des-funktionsaufruf-ausdrucks-auch-nicht-mehr-gültig</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 01:00:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243702.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 20 Jun 2009 00:57:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Referenz auf temporäres Objekt in Funktion - Während des Funktionsaufruf-Ausdrucks auch nicht mehr gültig? on Sat, 20 Jun 2009 00:57:29 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich frage mich, warum das nicht will:</p>
<pre><code class="language-cpp">set&lt;int&gt; values;

struct TestStruct
{
	vector&lt;set&lt;int&gt;::iterator&gt; entries;
	string remaining;
};

// Wenn ich TestStruct nicht als Referenz zurückgebe, funktioniert es...
TestStruct&amp; GetEntries()
{
	TestStruct testStruct;

	for(set&lt;int&gt;::iterator it = values.begin(); it != values.end(); ++it)
		testStruct.entries.push_back(it);

	testStruct.remaining = &quot;test&quot;;

	return testStruct;
}

int main()
{
	values.insert(4);
	values.insert(7);
	values.insert(51);

	if(GetEntries().entries.empty())
		cout &lt;&lt; &quot;LEER =(&quot; &lt;&lt; endl;
}
</code></pre>
<p>Die temporäre &quot;testStruct&quot; sollte doch während dem Funktionsaufruf-Ausdruck gültig bleiben? Gibt mir aber &quot;LEER =(&quot; aus (Im Releasebuild crasht es), außer wenn ich eine Kopie der Struktur zurückgebe.</p>
<p><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>
]]></description><link>https://www.c-plusplus.net/forum/post/1729878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729878</guid><dc:creator><![CDATA[Heinzi4]]></dc:creator><pubDate>Sat, 20 Jun 2009 00:57:29 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz auf temporäres Objekt in Funktion - Während des Funktionsaufruf-Ausdrucks auch nicht mehr gültig? on Sat, 20 Jun 2009 02:13:18 GMT]]></title><description><![CDATA[<p>Ganz einfach: testStruct geht den Bach runter, sobald die Funktion GetEntries zu Ende ist, also insbesondere, bevor der Ausdruck, in dem du GetEntries verwendest, auf den Rückgabewert zugreifen kann. Damit greift der Ausdruck über die Referenz dann auf das tote Objekt zu -&gt; BOOM.</p>
<p>Eigentlich sollte dich der Compiler aber auch warnen, wenn du lokale Objekte per Referenz zurückgibst. (Benutzt du die passenden Compiler-Flags?)</p>
<p>Felix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729886</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Sat, 20 Jun 2009 02:13:18 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz auf temporäres Objekt in Funktion - Während des Funktionsaufruf-Ausdrucks auch nicht mehr gültig? on Sat, 20 Jun 2009 02:17:40 GMT]]></title><description><![CDATA[<p>ich weiss nicht wie ihr es schafft immer solche codes zusammenzufrickeln und euch dann noch wundert wenn sie nicht funzen, obwohl es 100 compiler warnings gibt und kein buch der welt solchen code anrät. ich seh es jeden tag in diesem forum genau diese frage. pointer auf irgendwelche lokalen variablen und dann die frage wieso geht das nicht? jeden tag.</p>
<p>vielleicht sollte man einen neuen Knopf im forum einführen, der einen fertigen antwort text für diese frage ins antwort feld einfügt oder so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729888</guid><dc:creator><![CDATA[häh]]></dc:creator><pubDate>Sat, 20 Jun 2009 02:17:40 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz auf temporäres Objekt in Funktion - Während des Funktionsaufruf-Ausdrucks auch nicht mehr gültig? on Sat, 20 Jun 2009 02:56:51 GMT]]></title><description><![CDATA[<blockquote>
<p>Die temporäre &quot;testStruct&quot;</p>
</blockquote>
<p>...ist nicht temporär, sondern &quot;auto&quot;, und als solche weg, sobald die Funktion endet.<br />
Wenn du eine Kopie zurückgeben würdest, dann wäre diese Kopie temporär, und alles wäre gut.</p>
<p>Ansonsten das was &quot;häh&quot; geschrieben hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729893</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 20 Jun 2009 02:56:51 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz auf temporäres Objekt in Funktion - Während des Funktionsaufruf-Ausdrucks auch nicht mehr gültig? on Sat, 20 Jun 2009 08:16:31 GMT]]></title><description><![CDATA[<p>Hmm, stimmt, ich bekomme ein warning.<br />
ABER: Ist es nicht so, dass wenn man ein temporäres Objekt an eine Referenz bindet, die Lebensdauer des Objekts erweitert wird, und zwar dann der Lebensdauer der Referenz entspricht?<br />
So meine ich es mal gelesen zu haben.<br />
<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>
]]></description><link>https://www.c-plusplus.net/forum/post/1729920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729920</guid><dc:creator><![CDATA[Heinzi4]]></dc:creator><pubDate>Sat, 20 Jun 2009 08:16:31 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz auf temporäres Objekt in Funktion - Während des Funktionsaufruf-Ausdrucks auch nicht mehr gültig? on Sat, 20 Jun 2009 08:54:17 GMT]]></title><description><![CDATA[<p>Auf dem Stack angelegte Sachen noch nach dem Rücksprung zu haben, wäre sehr aufwendig, weil die Rücksprungadresse auch auf dem Stack liegt und folglich vor dem Rücksprung, alles andere vom Stack muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729933</guid><dc:creator><![CDATA[C++StribtAus]]></dc:creator><pubDate>Sat, 20 Jun 2009 08:54:17 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz auf temporäres Objekt in Funktion - Während des Funktionsaufruf-Ausdrucks auch nicht mehr gültig? on Sat, 20 Jun 2009 09:03:17 GMT]]></title><description><![CDATA[<p>Wann gilt dann diese Regel, falls sie überhaupt gilt (Lebensdauer eines temp. (btw. definition temp.?) Objekts = Lebensdauer der Referenz).</p>
<p>Und wenn ich halt eine Kopie zurückgeben, wäre dann das legal:</p>
<pre><code class="language-cpp">TestStruct&amp; testStruct = GetEntries();

if(testStruct.entries.empty())
    cout &lt;&lt; &quot;LEER =(&quot; &lt;&lt; endl;
</code></pre>
<p>Ist dann jedenfalls nicht leer und crasht nicht im Release (Ich weiß, kann Glückssache sein).</p>
<p><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>
]]></description><link>https://www.c-plusplus.net/forum/post/1729938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729938</guid><dc:creator><![CDATA[Heinzi4]]></dc:creator><pubDate>Sat, 20 Jun 2009 09:03:17 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz auf temporäres Objekt in Funktion - Während des Funktionsaufruf-Ausdrucks auch nicht mehr gültig? on Sat, 20 Jun 2009 09:13:40 GMT]]></title><description><![CDATA[<p>Die Regel gilt, wenn man temporäre Objekte hat. Du hast da aber kein temporäres Objekt. Die Verlängerungsregel gilt übrigens nur für Referenzen, die 1. auf dem Stack liegen und 2.) auf ein konsstantes Objekte verweisen. z.B. so:</p>
<pre><code class="language-cpp">std::string const&amp; ref = std::string(&quot;Hallo&quot;) + &quot;Welt!&quot;;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1729941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729941</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Sat, 20 Jun 2009 09:13:40 GMT</pubDate></item></channel></rss>