<?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[Dtor-Ausfuehrungszeitpunkt: vor oder nach &#x27;return&#x27; Anweisung?]]></title><description><![CDATA[<p>Hi!</p>
<p>Wird der Dtor einer lokalen Variable VOR oder NACH der return-Anweisung ausgefuehrt?</p>
<p>Speziell gehts um diese 2 Codezeilen:</p>
<pre><code class="language-cpp">lock_guard&lt;mutex&gt; lock(mtx);
	return mymap[chrnum];
</code></pre>
<p>der Lock soll den Aufruf des operator[] schuetzen, was er natuerlich nicht macht, wenn der lock_guard-Dtor zu frueh aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/265674/dtor-ausfuehrungszeitpunkt-vor-oder-nach-return-anweisung</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 20:31:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/265674.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 27 Apr 2010 08:46:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Dtor-Ausfuehrungszeitpunkt: vor oder nach &#x27;return&#x27; Anweisung? on Tue, 27 Apr 2010 08:46:27 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Wird der Dtor einer lokalen Variable VOR oder NACH der return-Anweisung ausgefuehrt?</p>
<p>Speziell gehts um diese 2 Codezeilen:</p>
<pre><code class="language-cpp">lock_guard&lt;mutex&gt; lock(mtx);
	return mymap[chrnum];
</code></pre>
<p>der Lock soll den Aufruf des operator[] schuetzen, was er natuerlich nicht macht, wenn der lock_guard-Dtor zu frueh aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888838</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Tue, 27 Apr 2010 08:46:27 GMT</pubDate></item><item><title><![CDATA[Reply to Dtor-Ausfuehrungszeitpunkt: vor oder nach &#x27;return&#x27; Anweisung? on Tue, 27 Apr 2010 08:52:47 GMT]]></title><description><![CDATA[<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>Wird der Dtor einer lokalen Variable VOR oder NACH der return-Anweisung ausgefuehrt?</p>
</blockquote>
<p>Logischerweise NACH. Wäre schlimm wenn nicht, da man dann keine lokalen Variablen zurückgeben könnte:</p>
<pre><code class="language-cpp">std::string getString()
{
  std::string name = &quot;hello&quot;;
  return name;
}
</code></pre>
<p>Wenn er vorher ausgeführt werden würde, dann wäre dies undefiniertes Verhalten <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>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888840</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 27 Apr 2010 08:52:47 GMT</pubDate></item><item><title><![CDATA[Reply to Dtor-Ausfuehrungszeitpunkt: vor oder nach &#x27;return&#x27; Anweisung? on Tue, 27 Apr 2010 08:58:21 GMT]]></title><description><![CDATA[<p>Hand-&gt;Stirn *patsch*!</p>
<p>ja, das ist klar <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="🙂"
    /> Thx!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888841</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Tue, 27 Apr 2010 08:58:21 GMT</pubDate></item><item><title><![CDATA[Reply to Dtor-Ausfuehrungszeitpunkt: vor oder nach &#x27;return&#x27; Anweisung? on Tue, 27 Apr 2010 10:49:29 GMT]]></title><description><![CDATA[<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>Wird der Dtor einer lokalen Variable VOR oder NACH der return-Anweisung ausgefuehrt?</p>
</blockquote>
<p>Wann wird der Scope verlassen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888877</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Tue, 27 Apr 2010 10:49:29 GMT</pubDate></item><item><title><![CDATA[Reply to Dtor-Ausfuehrungszeitpunkt: vor oder nach &#x27;return&#x27; Anweisung? on Tue, 27 Apr 2010 13:06:10 GMT]]></title><description><![CDATA[<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>Wird der Dtor einer lokalen Variable VOR oder NACH der return-Anweisung ausgefuehrt?</p>
<p>Speziell gehts um diese 2 Codezeilen:</p>
<pre><code class="language-cpp">lock_guard&lt;mutex&gt; lock(mtx);
   return mymap[chrnum];
</code></pre>
<p>der Lock soll den Aufruf des operator[] schuetzen, was er natuerlich nicht macht, wenn der lock_guard-Dtor zu frueh aufgerufen wird.</p>
</blockquote>
<p>Da brauchst Du Dir keine Sorgen machen. Aber man kann nicht direkt sagen, dass die lokalen Objekte VOR oder NACH der return-Anweisung zerstört werden. Eher so mittendrin. Und manchmal auch gar nicht. Bei einem return passiert im Prinzip folgendes:<br />
1 Der Rückgabewert (falls vorhanden) wird berechnet/konstruiert<br />
2 Lokale, automatische Objekte werden zerstört<br />
3 Die Ausführung geht beim Aufrufer weiter</p>
<p>Der Compiler darf sich aber unnötige Kopien bei (1) sparen. Warum auch Kopie konstruieren und Original gleich wieder in (2) zerstören? Die Optimierung, die das umgeht, nennt sich RVO (return value optimization) oder NRVO (named ...).</p>
<p>Im Beispiel von Dravere...</p>
<pre><code class="language-cpp">std::string getString()
{
  std::string name = &quot;hello&quot;;
  return name;
}

void g()
{
  std::string foo = getString();
}
</code></pre>
<p>kann ein Compiler sogar die drei Objekte <code>name</code> , den <code>return</code> -Wert von <code>getString()</code> und <code>foo</code> zu einem einzigen Objekt zusammenfassen. Dies würde dann in getString konstruiert und bleibt unter dem Namen &quot;foo&quot; weiter am Leben. Das nennt sich &quot;copy elision&quot; und wird von vielen modernen Compilern unterstützt, um die Zahl unnötiger Kopien zu reduzieren. In welchen Situationen das gemacht werden darf, kann man in Abschnitt §12.8 des C++ Standards nachlesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888970</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 27 Apr 2010 13:06:10 GMT</pubDate></item><item><title><![CDATA[Reply to Dtor-Ausfuehrungszeitpunkt: vor oder nach &#x27;return&#x27; Anweisung? on Tue, 27 Apr 2010 13:26:57 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24868">@krümelkacker</a>,<br />
Das ist zwar alles schön und gut, aber diese Optimierungen dürfen nichts an der Reihenfolge der aufgerufenen Funktionen ändern. Somit wird zum Beispiel der Destruktor von <code>lock_guard&lt;mutex&gt;</code> ganz sicher nach dem <code>return</code> ausgeführt, daran darf keine Optimierung etwas rütteln.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888978</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 27 Apr 2010 13:26:57 GMT</pubDate></item><item><title><![CDATA[Reply to Dtor-Ausfuehrungszeitpunkt: vor oder nach &#x27;return&#x27; Anweisung? on Tue, 27 Apr 2010 15:07:40 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24868">@krümelkacker</a>,<br />
Das ist zwar alles schön und gut, aber diese Optimierungen dürfen nichts an der Reihenfolge der aufgerufenen Funktionen ändern.</p>
</blockquote>
<p>Das ist IMHO nicht so gut ausgedrückt. Diese Optimierungen führen dazu, dass die Zahl der aufgerufenen Kopierkonstruktoren und Destruktoren reduziert wird (Kopierkonstruktoren vermieden, Destruktoren verzögert und reduziert). Man kann schwer von Reihenfolge sprechen, wenn die Optimierung zwei oder mehr Objekte zu einem einzigen zusammenfasst:</p>
<pre><code class="language-cpp">string foo() {
  string r = &quot;hello&quot;;
  return r;
}

void bar() {
  string x = foo();
  string z = x;
}
</code></pre>
<pre><code>Mit kompletter copy elision:      Ohne copy elision:
----------------------------------------------------
string(char const*) (x und r)     string(char const*)   (Objekt r)
                                  string(string const&amp;) (Objekt t)
                                  ~string()             (Objekt r)

                   ---- Rücksprung aus foo ----

                                  string(string const&amp;) (x&lt;-t)
                                  ~string()             (Objekt t)

               ---- Zeile 7 komplett ausgewertet ----

string(string const&amp;) (z&lt;-x)      string(string const&amp;) (z&lt;-x)
~string()             (z)         ~string()             (z)
~string()             (x)         ~string()             (x)
</code></pre>
<p>wobei t das temporäre Objekt ist, was foo() liefert. Ich sage auch nicht, dass das in dem Fall des Fragestellers zum Problem führen kann. Es ist nur ein Beispiel dafür, dass nicht alle automatischen, lokalen Objekte vor dem Rückspring zerstört werden. Das ist genau dann nicht der Fall, wenn RVO stattfindet hat.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Somit wird zum Beispiel der Destruktor von <code>lock_guard&lt;mutex&gt;</code> ganz sicher nach dem <code>return</code> ausgeführt, daran darf keine Optimierung etwas rütteln.</p>
</blockquote>
<p>Der Destruktor wird ganz sicher nicht zu früh aufgerufen. Aber ob das &quot;nach dem return&quot; passiert, kommt drauf an, was du unter &quot;return&quot; verstehst. Wenn Du unter &quot;return&quot; nur das Berechnen/Konstruieren des Rückgabewertes verstehst: Ja. Wenn du unter &quot;return&quot; auch den Rückspring meinst: Nein. Das Aufräumen garantiert passiert NACH dem Berechnen/Konstruieren des Rückgabewertes und üblicherweise VOR dem Rücksprung, wenn nicht gerade &quot;copy elision&quot; statt gefunden hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889020</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 27 Apr 2010 15:07:40 GMT</pubDate></item><item><title><![CDATA[Reply to Dtor-Ausfuehrungszeitpunkt: vor oder nach &#x27;return&#x27; Anweisung? on Tue, 27 Apr 2010 15:18:00 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Wenn Du unter &quot;return&quot; nur das Berechnen/Konstruieren des Rückgabewertes verstehst: Ja. Wenn du unter &quot;return&quot; auch den Rückspring meinst: Nein.</p>
</blockquote>
<p>Ich meinte das Erstere.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Das Aufräumen garantiert passiert NACH dem Berechnen/Konstruieren des Rückgabewertes und üblicherweise VOR dem Rücksprung, wenn nicht gerade &quot;copy elision&quot; statt gefunden hat.</p>
</blockquote>
<p>Nein, der Aufruf findet IMMER vor dem Rücksprung statt, auch wenn copy elision stattfindet. Mach mal in einem Destruktor eine Ausgabe hin und schau dir den ASM Code an, die Ausgabe wird immer davor gemacht. Copy elision kann natürlich trotzdem auftreten. Die Reihenfolge ist genaustens definiert, es wird in der umgekehrten Reihenfolge abgeräumt, dass heisst Destruktoren aufgerufen, wie die Objekte erstellt wurden. An dieser Reihenfolge von Funktionalitäten gibt es nichts zu rütteln. Wie und ob Speicher kopiert wird, ist eine ganz andere Sache.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889025</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 27 Apr 2010 15:18:00 GMT</pubDate></item><item><title><![CDATA[Reply to Dtor-Ausfuehrungszeitpunkt: vor oder nach &#x27;return&#x27; Anweisung? on Tue, 27 Apr 2010 16:05:49 GMT]]></title><description><![CDATA[<p>Ich glaube, wir reden nur aneinander vorbei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889041</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 27 Apr 2010 16:05:49 GMT</pubDate></item></channel></rss>