<?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[Objekt plötzlich deinitialisiert]]></title><description><![CDATA[<p>Hey!</p>
<p>Ich komme nicht weiter. Ein Objekt, welches existiert, bis das Programm beendet wird, ist im Konstruktor meiner Klasse noch initialisert, und dann plötzlich in einer Funktion der Klasse nicht mehr. Dabei gehört das Objekt selbst zu einer Klasse. In etwa so:</p>
<pre><code class="language-cpp">class Renderer
{
	LPDIRECT3DDEVICE9&amp; direct3DDevice;
	LPDIRECT3DDEVICE9 direct3DDeviceDummy;

	Map&amp; currentMap;
public:
	Renderer();
	~Renderer();

	void Init(LPDIRECT3DDEVICE9&amp;);

	void Tick()
	{
		if(currentMap.vertices == 24)
			MessageBox(0, &quot;6&quot;, &quot;&quot;, MB_OK);
	}

	void changeMap(Map&amp;);
};
</code></pre>
<pre><code class="language-cpp">void Renderer::changeMap(Map&amp; map)
{
	currentMap = map;
	if(currentMap.vertices == 24)
		MessageBox(0, &quot;5&quot;, &quot;&quot;, MB_OK);
}
</code></pre>
<p>Also, die MessageBox mit &quot;5&quot; wird angezeigt. Die mit &quot;6&quot; allerdings nicht. Das Objekt map existiert jedoch. Warum ist es in Tick() dann plötzlich deinitialisiert? Die Reihenfolge stimmt schon, zuerst wird changeMap, dann Tick aufgerufen. In Tick() ist auch der IndexBuffer nicht mehr gültig, vertices hat den Wert 56800 oder so...</p>
<p>Es passiert sonst nur das:</p>
<p>renderer.changeMap(resourceManager.getMap());</p>
<pre><code class="language-cpp">Map&amp; ResourceManager::getMap()
{
	return map;
}
</code></pre>
<p>Ich verstehe es einfach nicht. Wie kann das sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/173859/objekt-plötzlich-deinitialisiert</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 12:44:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/173859.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Feb 2007 14:21:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekt plötzlich deinitialisiert on Tue, 20 Feb 2007 14:21:06 GMT]]></title><description><![CDATA[<p>Hey!</p>
<p>Ich komme nicht weiter. Ein Objekt, welches existiert, bis das Programm beendet wird, ist im Konstruktor meiner Klasse noch initialisert, und dann plötzlich in einer Funktion der Klasse nicht mehr. Dabei gehört das Objekt selbst zu einer Klasse. In etwa so:</p>
<pre><code class="language-cpp">class Renderer
{
	LPDIRECT3DDEVICE9&amp; direct3DDevice;
	LPDIRECT3DDEVICE9 direct3DDeviceDummy;

	Map&amp; currentMap;
public:
	Renderer();
	~Renderer();

	void Init(LPDIRECT3DDEVICE9&amp;);

	void Tick()
	{
		if(currentMap.vertices == 24)
			MessageBox(0, &quot;6&quot;, &quot;&quot;, MB_OK);
	}

	void changeMap(Map&amp;);
};
</code></pre>
<pre><code class="language-cpp">void Renderer::changeMap(Map&amp; map)
{
	currentMap = map;
	if(currentMap.vertices == 24)
		MessageBox(0, &quot;5&quot;, &quot;&quot;, MB_OK);
}
</code></pre>
<p>Also, die MessageBox mit &quot;5&quot; wird angezeigt. Die mit &quot;6&quot; allerdings nicht. Das Objekt map existiert jedoch. Warum ist es in Tick() dann plötzlich deinitialisiert? Die Reihenfolge stimmt schon, zuerst wird changeMap, dann Tick aufgerufen. In Tick() ist auch der IndexBuffer nicht mehr gültig, vertices hat den Wert 56800 oder so...</p>
<p>Es passiert sonst nur das:</p>
<p>renderer.changeMap(resourceManager.getMap());</p>
<pre><code class="language-cpp">Map&amp; ResourceManager::getMap()
{
	return map;
}
</code></pre>
<p>Ich verstehe es einfach nicht. Wie kann das sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232005</guid><dc:creator><![CDATA[ceplusplus]]></dc:creator><pubDate>Tue, 20 Feb 2007 14:21:06 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt plötzlich deinitialisiert on Tue, 20 Feb 2007 15:14:25 GMT]]></title><description><![CDATA[<p>Zeig mal den Source, wo du Tick aufrufst...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232053</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Tue, 20 Feb 2007 15:14:25 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt plötzlich deinitialisiert on Tue, 20 Feb 2007 15:30:27 GMT]]></title><description><![CDATA[<p>ceplusplus schrieb:</p>
<blockquote>
<p>...Dabei gehört das Objekt selbst zu einer Klasse. ...</p>
</blockquote>
<p>Also, falls es sich dabei um <code>currentMap</code> handelt, so gehört das Objekt NICHT zur Klasse. Sie hält lediglich eine Referenz darauf. Es kann also relativ problemlos noch zu Lebzeiten des Rendereres (von außen) &quot;abgeräumt&quot; werden.</p>
<p>Wie weist Du currentMap eigentlich erstmalig zu ?<br />
Eigentlich muß das im Konstruktor (Initialisierungsliste) geschehen, sonst gibt's Compiler-Haue....</p>
<p>Ich sage mal so: Der Code von oben compiliert definitiv nicht - ich vermute, Dein Problem liegt in dem &quot;Weggelassenen Teil&quot; des Codes...</p>
<p>Vielleicht wolltest Du auch das schreiben:</p>
<pre><code class="language-cpp">class Renderer
{
...
	Map currentMap; // ohne '&amp;'
...
</code></pre>
<p>Damit müsste Dein Code prinzipiell funktionieren (wenn Du beim changeMap() eine fachlich sinnvolle Map übergibst)....</p>
<p>Ach ja: Und da Dein getMap() vermutlich eine (non-const)-Referenz auf die currentMap (einen Tippfehler von Dir mal vorausgesetzt) rausgibt, kann Dir jeder, der die Funktion aufrufen kann, Deine currentMap zerschießen....</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232058</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 20 Feb 2007 15:30:27 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt plötzlich deinitialisiert on Tue, 20 Feb 2007 16:08:19 GMT]]></title><description><![CDATA[<p>Jo sorry ich werde für Klarheit sorgen! An currentMap wird nicht herumgepfuscht. Die Referenz wird einmalig initialisiert...</p>
<pre><code class="language-cpp">Renderer::Renderer() : direct3DDevice(direct3DDeviceDummy), currentMap(Map(0, 0))
{
	;
}
</code></pre>
<p>Und nach</p>
<p>renderer.changeMap(resourceManager.getMap());</p>
<p>ist currentMap gleich das map-Objekt der Klasse ResourceManager, welches durchgehend existiert.</p>
<p>In Renderer::changeMap() stimmt ja noch alles, aber danach in Renderer::Tick() stimmt alles nicht mehr...</p>
<p>Mit map passiert sonst garantiert nichts mehr. renderer.Tick() wird erst aufgerufen, nachdem Renderer und ResourceManager aufgebaut wurden.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232098</guid><dc:creator><![CDATA[ceplusplus]]></dc:creator><pubDate>Tue, 20 Feb 2007 16:08:19 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt plötzlich deinitialisiert on Tue, 20 Feb 2007 16:14:59 GMT]]></title><description><![CDATA[<p>In deinem Konstruktor bindest du deinen Referenz (currentMap) an ein temporäres Objekt. Das geht so nicht.<br />
In deinem Fall würde ich eher einen Pointer auf die Map speichern und den anfangs mit 0 initialisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232101</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 20 Feb 2007 16:14:59 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt plötzlich deinitialisiert on Tue, 20 Feb 2007 16:25:57 GMT]]></title><description><![CDATA[<p>ceplusplus schrieb:</p>
<blockquote>
<p>...Die Referenz wird einmalig initialisiert...</p>
<p>...<br />
Und nach</p>
<p>renderer.changeMap(resourceManager.getMap());</p>
<p>ist currentMap gleich das map-Objekt der Klasse ResourceManager, welches durchgehend existiert....</p>
</blockquote>
<p>&quot;gleich&quot; (im Sinne von identischen Werten) vielleicht, aber trotzdem nicht &quot;gleich&quot; (im Sinne von &quot;auf dasselbe Objekt verweisend&quot;). <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="😉"
    /><br />
Referenzen kann man nur einmal &quot;binden&quot; ...</p>
<pre><code class="language-cpp">void Renderer::changeMap(Map&amp; map)
{
    currentMap = map;
...
};
</code></pre>
<p>Damit übernimmt currentMap nicht die Adresse des übergebenen Map-Objektes, sondern nur die &quot;Werte seiner Attribute&quot; (oder was immer der Map::operator=() so treibt).</p>
<p>Entweder musst Du currentMap bereits im Renderer-Ctor an das ResourceManager::Map-Objekt binden:</p>
<pre><code class="language-cpp">Renderer::Renderer(Map&amp; map) : currentMap(map) {}
...
};

// im der nutzenden Funktion dann:
RessourceManager rm;
Renderer rend(rm.getMap());
</code></pre>
<p>... oder eben (wie gesagt) mit Pointern arbeiten.</p>
<p>Oder als Antwort auf Deine ursprüngliche Frage: Du lässt selbst das Objekt abräumen (nach Ende des Renderer-CTors), auf das Du currentMap zeigen lässt und dessen Ableben Du beklagst. <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>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232107</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 20 Feb 2007 16:25:57 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt plötzlich deinitialisiert on Tue, 20 Feb 2007 20:30:40 GMT]]></title><description><![CDATA[<p>Hey!</p>
<p>Also war mein Fehler, dass man eine Referenz nicht mehrfach auf ein Objekt &quot;binden&quot; kann? Das gibts doch nicht, so kenn ich das gar nicht mehr...</p>
<pre><code class="language-cpp">int a = 10;
int b = 20;
int&amp; c = a;
c = b;
</code></pre>
<p>Funktioniert doch, versteh ich nicht...</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232277</guid><dc:creator><![CDATA[ceplusplus]]></dc:creator><pubDate>Tue, 20 Feb 2007 20:30:40 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt plötzlich deinitialisiert on Tue, 20 Feb 2007 20:34:03 GMT]]></title><description><![CDATA[<p>Klar geht das. Du aber machst:</p>
<pre><code class="language-cpp">int&amp; c = int();
</code></pre>
<p>Und das geht nicht, weil das temporäre int, welches an die Referenz gebunden wird, nach diesem Ausdruck wieder verschwindet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232279</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 20 Feb 2007 20:34:03 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt plötzlich deinitialisiert on Tue, 20 Feb 2007 20:44:16 GMT]]></title><description><![CDATA[<p>Ah, check <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="🙂"
    /> Danke. Aber komisch, wird dadurch die Referenz einfach ungültig? Denn wenn sie so auf ein Objekt zeigt, welches dann zerstört wird, kann man der Referenz doch auch ein neues Objekt zuweisen, oder?</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232285</guid><dc:creator><![CDATA[ceplusplus]]></dc:creator><pubDate>Tue, 20 Feb 2007 20:44:16 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt plötzlich deinitialisiert on Tue, 20 Feb 2007 20:46:00 GMT]]></title><description><![CDATA[<p>Nein, einer Referenz kannst Du nie etwas neues zuweisen. Deshalb funktioniert Dein changeMap auch nicht wie Du es vermutlich erwartest - dort wird der Inhalt des übergebenen Objekts in das Objekt kopiert, auf das die Referenz zeigt, es wird aber nicht die Referenz auf das neue Objekt verbogen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232288</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 20 Feb 2007 20:46:00 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt plötzlich deinitialisiert on Tue, 20 Feb 2007 21:01:42 GMT]]></title><description><![CDATA[<p>Ok danke!</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232297</guid><dc:creator><![CDATA[ceplusplus]]></dc:creator><pubDate>Tue, 20 Feb 2007 21:01:42 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt plötzlich deinitialisiert on Wed, 21 Feb 2007 08:18:22 GMT]]></title><description><![CDATA[<p>ceplusplus schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">int a = 10;
int b = 20;
int&amp; c = a;
c = b;
</code></pre>
<p>Funktioniert doch...</p>
</blockquote>
<p>Nein !!!</p>
<p>Laß Dir mal nach der Zuweisung a ausgeben (oder die Adresse von a, b und c), dann wirst Du es sehen: c verweist immer noch auf a ... das hat aber nun den Wert 20 !</p>
<pre><code class="language-cpp">int a = 10;
int b = 20;
int&amp; c = a;

cout &lt;&lt; a &lt;&lt; &quot; &quot; &lt;&lt; b &lt;&lt; &quot; &quot; &lt;&lt; c &lt;&lt; &quot;\n&quot;;
cout &lt;&lt; &amp;a &lt;&lt; &quot; &quot; &lt;&lt; &amp;b &lt;&lt; &quot; &quot; &lt;&lt; &amp;c &lt;&lt; &quot;\n&quot;;
c = b;
cout &lt;&lt; a &lt;&lt; &quot; &quot; &lt;&lt; b &lt;&lt; &quot; &quot; &lt;&lt; c &lt;&lt; &quot;\n&quot;;
cout &lt;&lt; &amp;a &lt;&lt; &quot; &quot; &lt;&lt; &amp;b &lt;&lt; &quot; &quot; &lt;&lt; &amp;c &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>Du musst zwischen der &quot;Wertzuweisung&quot; (ein Objekt wird mit den Werten eines anderen Objektes &quot;konfrontiert&quot; ;)) und der &quot;Adresszuweisung&quot; (eine Referenz/Zeiger zeigt auf ein Objekt) unterscheiden. Letzteres kannst Du bei C++-Referenzen nur einmal (und nur direkt bei der Initialisierung) machen....<br />
Jede weitere Zuweisung auf eine Referenz wird als <em>Wertzuweisung für das referenzierte Objekt</em> behandelt.</p>
<p>Gruß,</p>
<p>Simon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232404</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 21 Feb 2007 08:18:22 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt plötzlich deinitialisiert on Wed, 21 Feb 2007 08:21:02 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Klar geht das. Du aber machst:</p>
<pre><code class="language-cpp">int&amp; c = int();
</code></pre>
<p>Und das geht nicht, weil das temporäre int, welches an die Referenz gebunden wird, nach diesem Ausdruck wieder verschwindet.</p>
</blockquote>
<p>Neeee - geht trotzdem nicht (so wie ceplusplus das meint) <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="😉"
    /><br />
Aber nichtsdestotrotz hat er natürlich den &quot;Temp-Fehler&quot; zusätzlich gemacht.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1232405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1232405</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 21 Feb 2007 08:21:02 GMT</pubDate></item></channel></rss>