<?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[Zuweisung Rückgabewert vor Destruktoraufruf]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ist durch den Standard garantiert, dass zuerst der Rückgabewert zugewiesen wird bzw. der Copy-Constructor aufgerufen wird, bevor der Destruktor für die Objekte im äußeren Scope aufgerufen wird?</p>
<pre><code class="language-cpp">#include &lt;mutex&gt;
#include &lt;iostream&gt;

struct bar {
	bar(){ std::cout &lt;&lt; &quot;create&quot;&lt;&lt; std::endl; }
	bar(const bar&amp; b){ std::cout &lt;&lt; &quot;copy&quot;&lt;&lt; std::endl; }
	bar&amp; operator=(const bar&amp; b){ std::cout &lt;&lt; &quot;copy&quot;&lt;&lt; std::endl; return *this; }
};

struct debug_mutex{

	void lock(){
		std::cout &lt;&lt; &quot;lock&quot; &lt;&lt; std::endl;
	}
	void unlock(){
		std::cout &lt;&lt; &quot;unlock&quot; &lt;&lt; std::endl;
	}
	bool try_lock(){
		std::cout &lt;&lt; &quot;try_lock&quot; &lt;&lt; std::endl;
		return true;
	}
};

struct foo{

	bar foobar(){
		std::lock_guard&lt;debug_mutex&gt; lock_it(_mutex);
		return _b;
	}

	bar _b;
	debug_mutex _mutex;
};

int main(){
	foo f;
	bar b(f.foobar());
}
</code></pre>
<p>Ist sogar garantiert, dass erst die Zuweisung gemacht wird und dann der Destructor für alle verbleibenden zu zerstörenden Objekte aufgerufen wird?</p>
<pre><code class="language-cpp">bar foobar(int i){
		if(i == 0){
			std::lock_guard&lt;debug_mutex&gt; lock_it(_mutex);
			return _b;
		}
		return _b;
	}
</code></pre>
<p>Also mein gcc 4.5 macht es jedenfalls so. Aber ist es auch garantiert?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/308310/zuweisung-rückgabewert-vor-destruktoraufruf</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 21:53:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/308310.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 20 Sep 2012 17:59:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zuweisung Rückgabewert vor Destruktoraufruf on Thu, 20 Sep 2012 17:59:51 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ist durch den Standard garantiert, dass zuerst der Rückgabewert zugewiesen wird bzw. der Copy-Constructor aufgerufen wird, bevor der Destruktor für die Objekte im äußeren Scope aufgerufen wird?</p>
<pre><code class="language-cpp">#include &lt;mutex&gt;
#include &lt;iostream&gt;

struct bar {
	bar(){ std::cout &lt;&lt; &quot;create&quot;&lt;&lt; std::endl; }
	bar(const bar&amp; b){ std::cout &lt;&lt; &quot;copy&quot;&lt;&lt; std::endl; }
	bar&amp; operator=(const bar&amp; b){ std::cout &lt;&lt; &quot;copy&quot;&lt;&lt; std::endl; return *this; }
};

struct debug_mutex{

	void lock(){
		std::cout &lt;&lt; &quot;lock&quot; &lt;&lt; std::endl;
	}
	void unlock(){
		std::cout &lt;&lt; &quot;unlock&quot; &lt;&lt; std::endl;
	}
	bool try_lock(){
		std::cout &lt;&lt; &quot;try_lock&quot; &lt;&lt; std::endl;
		return true;
	}
};

struct foo{

	bar foobar(){
		std::lock_guard&lt;debug_mutex&gt; lock_it(_mutex);
		return _b;
	}

	bar _b;
	debug_mutex _mutex;
};

int main(){
	foo f;
	bar b(f.foobar());
}
</code></pre>
<p>Ist sogar garantiert, dass erst die Zuweisung gemacht wird und dann der Destructor für alle verbleibenden zu zerstörenden Objekte aufgerufen wird?</p>
<pre><code class="language-cpp">bar foobar(int i){
		if(i == 0){
			std::lock_guard&lt;debug_mutex&gt; lock_it(_mutex);
			return _b;
		}
		return _b;
	}
</code></pre>
<p>Also mein gcc 4.5 macht es jedenfalls so. Aber ist es auch garantiert?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253080</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Thu, 20 Sep 2012 17:59:51 GMT</pubDate></item><item><title><![CDATA[Reply to Zuweisung Rückgabewert vor Destruktoraufruf on Thu, 20 Sep 2012 18:24:56 GMT]]></title><description><![CDATA[<p>Dir ist schon klar, dass der Aufruf der Funktion</p>
<pre><code class="language-cpp">std::string g()
{
    std::string a;
    return a;
}
</code></pre>
<p>dann zu einen Laufzeitfehler führen würde, weil <code>a</code> zerstört wird, bevor die Zuweisung gemacht wird? Also: Klar.</p>
<p>Edit: Ich glaube, ich missverstehe, was du mit &quot;äußerer Scope&quot; meinst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253089</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 20 Sep 2012 18:24:56 GMT</pubDate></item><item><title><![CDATA[Reply to Zuweisung Rückgabewert vor Destruktoraufruf on Thu, 20 Sep 2012 19:04:53 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Dir ist schon klar, dass der Aufruf der Funktion</p>
<pre><code class="language-cpp">std::string g()
{
    std::string a;
    return a;
}
</code></pre>
<p>dann zu einen Laufzeitfehler führen würde, weil <code>a</code> zerstört wird, bevor die Zuweisung gemacht wird?</p>
</blockquote>
<p>Diese Aussage wage ich mal zu bezweifeln... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>In dem Code, wird das zurückgelieferte Objekt erst zugewiesen und dann zerstört <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253092</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Thu, 20 Sep 2012 19:04:53 GMT</pubDate></item><item><title><![CDATA[Reply to Zuweisung Rückgabewert vor Destruktoraufruf on Thu, 20 Sep 2012 19:12:00 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Dir ist schon klar, dass der Aufruf der Funktion</p>
<pre><code class="language-cpp">std::string g()
{
    std::string a;
    return a;
}
</code></pre>
<p>dann zu einen Laufzeitfehler führen würde, weil <code>a</code> zerstört wird, bevor die Zuweisung gemacht wird?</p>
</blockquote>
<p>Diese Aussage wage ich mal zu bezweifeln... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>In dem Code, wird das zurückgelieferte Objekt erst zugewiesen und dann zerstört <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Nein! Du hast mich total missverstanden. <strong>Wenn der Rückgabewert danach zugewiesen werden würde, dann... würde das zu einem Laufzeitfehler führen.</strong><br />
Das heißt: Auf jeden Fall wird zuerst zugewiesen und dann werden erst die Destruktoren für die Funktionslokalen Objekte aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253096</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 20 Sep 2012 19:12:00 GMT</pubDate></item><item><title><![CDATA[Reply to Zuweisung Rückgabewert vor Destruktoraufruf on Thu, 20 Sep 2012 19:33:01 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24036">@XSpille</a><br />
Ja, ist garantiert.<br />
Die Return-Anweisung steht ja noch klar innerhalb des Scopes der Funktion (bzw. des ifs), und referenziert in diesem Scope irgendwelche Dinge (Member, was auch immer).<br />
Der Zugriff auf diese Dinge, das konstruieren des Returnwerts etc. muss also auch in diesem Scope erfolgen.</p>
<p>Das nötige Standardese dazu kann ich dir aber nicht liefern, müsstest du ggf. selbst nachschlagen (oder warten bis einer der Standardauswendigkenner hier reinschneit).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253104</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 20 Sep 2012 19:33:01 GMT</pubDate></item><item><title><![CDATA[Reply to Zuweisung Rückgabewert vor Destruktoraufruf on Thu, 20 Sep 2012 23:20:42 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24036">@XSpille</a><br />
Ja, ist garantiert.</p>
</blockquote>
<p>Danke hustbaer! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Diese Aussage reicht mir völlig</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/28547">@Sone</a>:<br />
Jetzt verstehe ich, was du meinst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>DAnke euch beiden</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253131</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Thu, 20 Sep 2012 23:20:42 GMT</pubDate></item><item><title><![CDATA[Reply to Zuweisung Rückgabewert vor Destruktoraufruf on Fri, 21 Sep 2012 01:51:28 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>Ist durch den Standard garantiert, dass zuerst der Rückgabewert zugewiesen wird bzw. der Copy-Constructor aufgerufen wird, bevor der Destruktor für die Objekte im äußeren Scope aufgerufen wird?</p>
</blockquote>
<p>Ich bin mir nicht sicher was genau du mit &quot;äußerem Scope&quot; meinst. Es ist afaik garantiert, dass dein _b in den Rückgabewert kopiert wird bevor der lock_guard aufgeht, falls du das meinst. Wenn du allerdings mit den Rückgabewert dann irgendwas machen würdest, sodass nochmal kopiert werden würde, würde diese Kopie potentiell (dem Compiler wäre es erlaubt, die Kopie wegzulassen, was so ziemlich jeder aktuelle Compiler tun sollte, aber garantiert ist das nicht) natürlich außerhalb des Scope, aus dem das return kam, stattfinden.</p>
<p>XSpille schrieb:</p>
<blockquote>
<p>Ist sogar garantiert, dass erst die Zuweisung gemacht wird und dann der Destructor für alle verbleibenden zu zerstörenden Objekte aufgerufen wird?</p>
</blockquote>
<p>Was genau für eine Zuweisung meinst du, ich seh da nirgendwo eine!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253142</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 21 Sep 2012 01:51:28 GMT</pubDate></item></channel></rss>