<?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[Scopes und Destruktor]]></title><description><![CDATA[<p>Hallo,<br />
folgender Code (der auch compiliert):</p>
<pre><code class="language-cpp">#include &lt;cstdio&gt;

class ABC
{
protected:
	bool foo;

public:
	ABC()
	{
		printf(&quot;ABC()\n&quot;);
		foo=0;
	}

	ABC(int a)
	{
		printf(&quot;ABC(%d)\n&quot;, a);
		foo=1;
	}

	~ABC()
	{
		if (!foo)
			printf(&quot;~ABC()\n&quot;);
		else
			printf(&quot;~ABC(int a)\n&quot;);
	}
};

int main(int argc, char** argv)
{
	ABC a;

	{
		printf(&quot;In block\n&quot;);
		ABC a=ABC(0);
		printf(&quot;End block\n&quot;);
	}

	printf(&quot;After block\n&quot;);
}
</code></pre>
<p>Was gibt dieses Programm aus:</p>
<pre><code>ABC()
In block
ABC(0)
End block
~ABC(int a)
After block
~ABC()
</code></pre>
<p>OK, was will ich damit sagen: dass der erste Konstruktor ausgelöst wird, ist klar. Allerdings nicht, was (und vor allem warum es) dannach passiert:</p>
<p>ich hätte erwartet, dass wenn ich ABC(0) aufrufe, der entsprechende Konstruktor aufgerufen wird (was der Fall ist: ABC(0)). Allerdings wäre meine Erwartung gewesen, dass bei der Zuweisung a=... im Block der Destruktor des &quot;alten&quot; ABC ausgelöst wird (weil dieser ja mit dem neuen Inhalt ABC(0) überschrieben wird). Es also folgendermaßen aussähe:</p>
<pre><code>ABC()
In block
ABC(0)
~ABC()
...
</code></pre>
<p>Warum ist dies nicht der Fall? Und liege ich richtig damit, dass an der Stelle &quot;after block&quot; a einen undefinierten Zustand hat?</p>
<p>Grüße<br />
wolfgke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/190530/scopes-und-destruktor</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 15:26:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/190530.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 23 Aug 2007 19:00:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Scopes und Destruktor on Thu, 23 Aug 2007 19:01:28 GMT]]></title><description><![CDATA[<p>Hallo,<br />
folgender Code (der auch compiliert):</p>
<pre><code class="language-cpp">#include &lt;cstdio&gt;

class ABC
{
protected:
	bool foo;

public:
	ABC()
	{
		printf(&quot;ABC()\n&quot;);
		foo=0;
	}

	ABC(int a)
	{
		printf(&quot;ABC(%d)\n&quot;, a);
		foo=1;
	}

	~ABC()
	{
		if (!foo)
			printf(&quot;~ABC()\n&quot;);
		else
			printf(&quot;~ABC(int a)\n&quot;);
	}
};

int main(int argc, char** argv)
{
	ABC a;

	{
		printf(&quot;In block\n&quot;);
		ABC a=ABC(0);
		printf(&quot;End block\n&quot;);
	}

	printf(&quot;After block\n&quot;);
}
</code></pre>
<p>Was gibt dieses Programm aus:</p>
<pre><code>ABC()
In block
ABC(0)
End block
~ABC(int a)
After block
~ABC()
</code></pre>
<p>OK, was will ich damit sagen: dass der erste Konstruktor ausgelöst wird, ist klar. Allerdings nicht, was (und vor allem warum es) dannach passiert:</p>
<p>ich hätte erwartet, dass wenn ich ABC(0) aufrufe, der entsprechende Konstruktor aufgerufen wird (was der Fall ist: ABC(0)). Allerdings wäre meine Erwartung gewesen, dass bei der Zuweisung a=... im Block der Destruktor des &quot;alten&quot; ABC ausgelöst wird (weil dieser ja mit dem neuen Inhalt ABC(0) überschrieben wird). Es also folgendermaßen aussähe:</p>
<pre><code>ABC()
In block
ABC(0)
~ABC()
...
</code></pre>
<p>Warum ist dies nicht der Fall? Und liege ich richtig damit, dass an der Stelle &quot;after block&quot; a einen undefinierten Zustand hat?</p>
<p>Grüße<br />
wolfgke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1350678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350678</guid><dc:creator><![CDATA[wolfgke]]></dc:creator><pubDate>Thu, 23 Aug 2007 19:01:28 GMT</pubDate></item><item><title><![CDATA[Reply to Scopes und Destruktor on Thu, 23 Aug 2007 19:07:17 GMT]]></title><description><![CDATA[<p>Wenn du Scope auf Deutsch als Sichtbarkeitsraum übersetzt, ist es vielleicht klarer.</p>
<p>Was hier passiert ist eigentlich sehr simpel: Es wird ein zweites Objekt mit Namen a angelegt. Dieses ist nur in dem aktuellen Sichtbarkeitsraum sichtbar und wird vor dem a aus dem umschließenden Raum bevorzugt. Wäre das nicht so, dann würdest du aufgrund der One-Definition-Rule (dass jedes Objekt /genau/ einmal definiert und damit initialisiert wird) einen Compilerfehler erhalten.</p>
<p>a hat nach verlassen des lokalen Sichtbarkeitsraumes natürlich einen definierten Zustand, nämlich den von zuvor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1350682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350682</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Thu, 23 Aug 2007 19:07:17 GMT</pubDate></item><item><title><![CDATA[Reply to Scopes und Destruktor on Thu, 23 Aug 2007 19:21:55 GMT]]></title><description><![CDATA[<p>Man, ich Schussel. Ich dachte ein Problem in meinem Programm auf dieses Modellbeispiel reduzieren zu können. Dabei habe ich in dem Modellcode diesen Fehler eingebaut, der mich zu falschen Schlussfolgerungen verleitete...</p>
<p>Sorry. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":-("
      alt="😞"
    /></p>
<p>Ich werde gleich einen anderen Code basteln, der das Problem, was in meinem Code besteht hoffentlich diesmal wirklich repräsentiert.</p>
<p>Dennoch danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1350694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350694</guid><dc:creator><![CDATA[wolfgke]]></dc:creator><pubDate>Thu, 23 Aug 2007 19:21:55 GMT</pubDate></item><item><title><![CDATA[Reply to Scopes und Destruktor on Thu, 23 Aug 2007 19:30:02 GMT]]></title><description><![CDATA[<p>Ich habe den Modellcode modifiziert:</p>
<pre><code class="language-cpp">#include &lt;cstdio&gt;

class ABC
{
protected:
	bool foo;

public:
	ABC()
	{
		printf(&quot;ABC()\n&quot;);
		foo=0;
	}

	ABC(int a)
	{
		printf(&quot;ABC(%d)\n&quot;, a);
		foo=1;

		if (a==1)
			throw 5;
	}

	~ABC()
	{
		if (!foo)
			printf(&quot;~ABC()\n&quot;);
		else
			printf(&quot;~ABC(int a)\n&quot;);
	}
};

int main(int argc, char** argv)
{
	ABC a;

	try
	{
		printf(&quot;In block\n&quot;);
		a=ABC(0);
		printf(&quot;End block\n&quot;);
	}
	catch (int x) {}

	printf(&quot;After block\n&quot;);
}
</code></pre>
<p>Jetzt entspricht er dem, wie er sein sollte:</p>
<p>Ausgabe:</p>
<pre><code>ABC()
In block
ABC(0)
~ABC(int a)
End block
After block
~ABC(int a)
</code></pre>
<p>Warum wird der Destruktor ~ABC(int a) und nicht ~ABC() aufgerufen? Jetzt repräsentiert es hoffentlich wirklich das Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1350698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350698</guid><dc:creator><![CDATA[wolfgke]]></dc:creator><pubDate>Thu, 23 Aug 2007 19:30:02 GMT</pubDate></item><item><title><![CDATA[Reply to Scopes und Destruktor on Thu, 23 Aug 2007 19:38:31 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">a = ABC(0);
</code></pre>
<p>Hier wird op= aufgerufen. Da du ihn nicht explizit definiert hast macht der Kompiler das für dich. Der op= vom Kompiler erstellt eine Flache Kopie, also werden einfach die Membervariablen kopiert.<br />
ABC(0) erstellt ein temporäres ABC-Objekt, sein Member foo ist true. Demnach wird foo in a auch auf true gesetzt.</p>
<p>Gruß<br />
Don06</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1350702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350702</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Thu, 23 Aug 2007 19:38:31 GMT</pubDate></item><item><title><![CDATA[Reply to Scopes und Destruktor on Thu, 23 Aug 2007 19:51:44 GMT]]></title><description><![CDATA[<p>Danke, Don06.</p>
<p>Jetzt weiß ich die Ursache des Fehlers in meinem Programm (auch wenn ich die Konsequenzen, die dieses Verhalten hat, noch durchdenken muss).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1350706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350706</guid><dc:creator><![CDATA[wolfgke]]></dc:creator><pubDate>Thu, 23 Aug 2007 19:51:44 GMT</pubDate></item></channel></rss>