<?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[wird alles richtig gelöscht?]]></title><description><![CDATA[<p>Ich weiß, ich stelle viele Fragen, aber nun glaube ich endlich, nach langem üben mit Zeigern, std::list und Klassen (abstrakte klassen verstehe ich noch nicht ganz), ein schönes Design hin bekommen zu haben! Ich führe einfach eine &quot;liste&quot; über meine unterklassen die ich erstellt habe, und wenn ich updaten will, dann werden meine ganzen unterklassen up gedatet. Dabei benutze ich eine for Schleife, wo ich alle meine Unterklassen durch gehe und deren Update() Methode aufrufe. Meine Hauptklasse ist dabei eine abstrakte klasse, und dient nur als Manager:</p>
<p>Die Haupt Klasse:</p>
<pre><code class="language-cpp">class Owner
{
public:
	Owner() { }

	virtual ~Owner() 
	{ 
		for(list&lt;Owner*&gt;::iterator i = ListChild.begin();i != ListChild.end(); i++ )
		{
			(*i)-&gt;Release();
		}
	    ListChild.clear();
	}

	virtual void Update()
	{
		for(list&lt;Owner*&gt;::iterator i = ListChild.begin(); i != ListChild.end(); i++)
		{
		  (*i)-&gt;Update();
		}
    }

	virtual void Release() { }

	void AddChild(Owner* child)
	{
		ListChild.push_back(child);
    }

protected:
	list&lt;Owner*&gt; ListChild;
};
</code></pre>
<p>Meine Schöne unterklasse:</p>
<pre><code class="language-cpp">class NiceChild: public Owner
{
public:
	NiceChild() { }
	~NiceChild() { }

	void Update()
	{
		MessageBox(NULL, &quot;Ich bin schön!&quot;, &quot;Info&quot;, NULL);
	}
	void Release()
	{
		MessageBox(NULL, &quot;nicht mehr schön!&quot;, &quot;Info&quot;, NULL);
		delete this; 
	}
};
</code></pre>
<p>Und meine Böse klasse:</p>
<pre><code class="language-cpp">class BadChild: public Owner
{
public:
	BadChild() { }
	~BadChild() { }

	void Update()
	{
		MessageBox(NULL, &quot;Ich bin Böse!&quot;, &quot;Info&quot;, NULL);
	}
	void Release()
	{
		MessageBox(NULL, &quot;Nicht mehr Böse!&quot;, &quot;Info&quot;, NULL);
		delete this; 
	}
};
</code></pre>
<p>Wenn ich das ganze nun benutze:</p>
<pre><code class="language-cpp">Owner* OWN = new Owner;
	NiceChild* NC1 = new NiceChild;
	NiceChild* NC2 = new NiceChild;
	BadChild* BC1 = new BadChild;
	BadChild* BC2 = new BadChild;
	OWN-&gt;AddChild(NC1);
	OWN-&gt;AddChild(NC2);
	OWN-&gt;AddChild(BC1);
	OWN-&gt;AddChild(BC2);

	OWN-&gt;Update();

	delete OWN;
</code></pre>
<p>Funktioniert alles wunderbar, es tauchen keine fehler auf, und alle Messageboxes werden ausgeführt, insgesammt 8 mal. Nun frage ich mich aber, ob auch alles richtig gelöscht wird? Gibt es dort vieleicht noch andere ausbesserungsmöglichkeiten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/222392/wird-alles-richtig-gelöscht</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 02:54:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/222392.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 11 Sep 2008 23:46:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to wird alles richtig gelöscht? on Thu, 11 Sep 2008 23:46:34 GMT]]></title><description><![CDATA[<p>Ich weiß, ich stelle viele Fragen, aber nun glaube ich endlich, nach langem üben mit Zeigern, std::list und Klassen (abstrakte klassen verstehe ich noch nicht ganz), ein schönes Design hin bekommen zu haben! Ich führe einfach eine &quot;liste&quot; über meine unterklassen die ich erstellt habe, und wenn ich updaten will, dann werden meine ganzen unterklassen up gedatet. Dabei benutze ich eine for Schleife, wo ich alle meine Unterklassen durch gehe und deren Update() Methode aufrufe. Meine Hauptklasse ist dabei eine abstrakte klasse, und dient nur als Manager:</p>
<p>Die Haupt Klasse:</p>
<pre><code class="language-cpp">class Owner
{
public:
	Owner() { }

	virtual ~Owner() 
	{ 
		for(list&lt;Owner*&gt;::iterator i = ListChild.begin();i != ListChild.end(); i++ )
		{
			(*i)-&gt;Release();
		}
	    ListChild.clear();
	}

	virtual void Update()
	{
		for(list&lt;Owner*&gt;::iterator i = ListChild.begin(); i != ListChild.end(); i++)
		{
		  (*i)-&gt;Update();
		}
    }

	virtual void Release() { }

	void AddChild(Owner* child)
	{
		ListChild.push_back(child);
    }

protected:
	list&lt;Owner*&gt; ListChild;
};
</code></pre>
<p>Meine Schöne unterklasse:</p>
<pre><code class="language-cpp">class NiceChild: public Owner
{
public:
	NiceChild() { }
	~NiceChild() { }

	void Update()
	{
		MessageBox(NULL, &quot;Ich bin schön!&quot;, &quot;Info&quot;, NULL);
	}
	void Release()
	{
		MessageBox(NULL, &quot;nicht mehr schön!&quot;, &quot;Info&quot;, NULL);
		delete this; 
	}
};
</code></pre>
<p>Und meine Böse klasse:</p>
<pre><code class="language-cpp">class BadChild: public Owner
{
public:
	BadChild() { }
	~BadChild() { }

	void Update()
	{
		MessageBox(NULL, &quot;Ich bin Böse!&quot;, &quot;Info&quot;, NULL);
	}
	void Release()
	{
		MessageBox(NULL, &quot;Nicht mehr Böse!&quot;, &quot;Info&quot;, NULL);
		delete this; 
	}
};
</code></pre>
<p>Wenn ich das ganze nun benutze:</p>
<pre><code class="language-cpp">Owner* OWN = new Owner;
	NiceChild* NC1 = new NiceChild;
	NiceChild* NC2 = new NiceChild;
	BadChild* BC1 = new BadChild;
	BadChild* BC2 = new BadChild;
	OWN-&gt;AddChild(NC1);
	OWN-&gt;AddChild(NC2);
	OWN-&gt;AddChild(BC1);
	OWN-&gt;AddChild(BC2);

	OWN-&gt;Update();

	delete OWN;
</code></pre>
<p>Funktioniert alles wunderbar, es tauchen keine fehler auf, und alle Messageboxes werden ausgeführt, insgesammt 8 mal. Nun frage ich mich aber, ob auch alles richtig gelöscht wird? Gibt es dort vieleicht noch andere ausbesserungsmöglichkeiten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1580545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1580545</guid><dc:creator><![CDATA[Code-Walker]]></dc:creator><pubDate>Thu, 11 Sep 2008 23:46:34 GMT</pubDate></item><item><title><![CDATA[Reply to wird alles richtig gelöscht? on Fri, 12 Sep 2008 00:31:15 GMT]]></title><description><![CDATA[<p>Naja statt &quot;virtual void Release()&quot; verwendet man normalerweise einfach einen virtuellen dtor. Vor allem finde ich die Asymmetrie schlecht: Owner muss über den dtor gelöscht werden (da Owner::Release nix tut), die von Owner abgeleiteten Klassen werden aber über Release gelöscht. Wenn du nun folgendes machst...</p>
<pre><code class="language-cpp">Owner* OWN = new Owner;

NiceChild* OC1 = new Owner;
OWN-&gt;AddChild(OC1);

OWN-&gt;Update();

delete OWN;
</code></pre>
<p>...hast du ein schönes Memory-Leak.</p>
<p>----</p>
<p>Und statt manuell löschen kann (sollte) man smart pointer oder pointer container verwenden. Dadurch fallen etliche Zeilen Code weg, und man kann kaum noch was übersehen oder sonstwie unabsichtlich falsch machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1580551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1580551</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 12 Sep 2008 00:31:15 GMT</pubDate></item><item><title><![CDATA[Reply to wird alles richtig gelöscht? on Fri, 12 Sep 2008 05:47:05 GMT]]></title><description><![CDATA[<p>Also, wenn ich dich richtig verstanden habe, muss ich das so machen:</p>
<pre><code class="language-cpp">class Owner
{
public:
	Owner() { }

	virtual ~Owner() 
	{ 
		for(list&lt;Owner*&gt;::iterator i = ListChild.begin();i != ListChild.end(); i++ )
		{
			//(*i)-&gt; ???;
			delete (*i);
		}
	    ListChild.clear();
	}

	virtual void Update()
	{
		for(list&lt;Owner*&gt;::iterator i = ListChild.begin(); i != ListChild.end(); i++)
		{
		  (*i)-&gt;Update();
		}
    }

	void AddChild(Owner* child)
	{
		ListChild.push_back(child);
    }

protected:
	list&lt;Owner*&gt; ListChild;
};
</code></pre>
<p>Der destructor der Childs werden ausgeführt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1580568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1580568</guid><dc:creator><![CDATA[Code-Walker]]></dc:creator><pubDate>Fri, 12 Sep 2008 05:47:05 GMT</pubDate></item><item><title><![CDATA[Reply to wird alles richtig gelöscht? on Fri, 12 Sep 2008 06:06:12 GMT]]></title><description><![CDATA[<p>Code-Walker schrieb:</p>
<blockquote>
<p>Also, wenn ich dich richtig verstanden habe, muss ich das so machen:</p>
</blockquote>
<p>Öffentliche Vererbung sollte immer &quot;ist ein&quot; bedeuten... NiceChild ist ein Owner?</p>
<p>Über das Thema Grundlagen sowie Design hatte ich ja schon einmal etwas gesagt.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1580583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1580583</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 12 Sep 2008 06:06:12 GMT</pubDate></item><item><title><![CDATA[Reply to wird alles richtig gelöscht? on Fri, 12 Sep 2008 08:40:15 GMT]]></title><description><![CDATA[<p>Ich versuche mich ja grade mit den Grundlagen von OOP mehr vertraut zu machen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1580705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1580705</guid><dc:creator><![CDATA[Code-Walker]]></dc:creator><pubDate>Fri, 12 Sep 2008 08:40:15 GMT</pubDate></item><item><title><![CDATA[Reply to wird alles richtig gelöscht? on Fri, 12 Sep 2008 09:02:06 GMT]]></title><description><![CDATA[<p>Code-Walker schrieb:</p>
<blockquote>
<p>Ich versuche mich ja grade mit den Grundlagen von OOP mehr vertraut zu machen!</p>
</blockquote>
<p>Mir ist aber deine Intention noch nicht klar. Bzw. erschließt sich mir noch nicht ganz der Sinn und vor allem nicht deine Benennungen. Trennen wir das Problem erstmal auf, soweit wie ich es verstanden habe:</p>
<p>Du willst irgendwelche Komponenten haben (wenn ich deine Engineüberlegungen zusätzlich mit hereinnehme), die ihrerseits wieder untergeordnete Elemente enthalten können - liege ich mit dieser Einschätzung richtig? (Thema: <a href="http://de.wikipedia.org/wiki/Entwurfsmuster" rel="nofollow">Entwurfsmuster</a>, konkret <a href="http://de.wikipedia.org/wiki/Kompositum_(Entwurfsmuster)" rel="nofollow">Kompositum</a>).</p>
<p>Wenn ja, schau dir mal den Beispielcode im zweiten Link an.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1580723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1580723</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 12 Sep 2008 09:02:06 GMT</pubDate></item><item><title><![CDATA[Reply to wird alles richtig gelöscht? on Fri, 12 Sep 2008 12:38:36 GMT]]></title><description><![CDATA[<p>sieht soweit korrekt aus. das &quot;delete (*i);&quot; passt auch, genau so macht man das (wenn man keine smart-pointer verwendet).</p>
<p>mach dich aber sobalb wie möglich mit smart pointern (z.b. boost::shared_ptr bzw. tr1::shared_ptr) vertraut, die sind wirklich praktisch. ersparen viel ärger und kopfzerbrechen wegen dingen um die man sich nicht wirklich selbst kümmern muss (und sollte).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1580905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1580905</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 12 Sep 2008 12:38:36 GMT</pubDate></item><item><title><![CDATA[Reply to wird alles richtig gelöscht? on Fri, 12 Sep 2008 21:36:46 GMT]]></title><description><![CDATA[<p>Sowas hier meine ich:</p>
<p><a href="http://upload.wikimedia.org/wikipedia/de/2/2d/Kompositum_Objekte.png" rel="nofollow">http://upload.wikimedia.org/wikipedia/de/2/2d/Kompositum_Objekte.png</a></p>
<p>Leider ist das bei mir noch ein klein wenig komplitzierter. Manche von den classen sollen singletons sein, zum beispiel die oberste und die zwei unteren sind singletons. Manche von den letzten müssen wiederum auch singletons sein. Dann muss einer der mttleren auf die nachbarn zugreifen können, und die unteren müssen auf manche seine nachbarn zugreifen können ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1581166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1581166</guid><dc:creator><![CDATA[Code-Walker]]></dc:creator><pubDate>Fri, 12 Sep 2008 21:36:46 GMT</pubDate></item><item><title><![CDATA[Reply to wird alles richtig gelöscht? on Fri, 12 Sep 2008 21:55:57 GMT]]></title><description><![CDATA[<p>Du solltest aufpassen, wenn du so viele Abhängigkeiten hast. Es kann schnell mal passieren, dass man sich nicht mehr im Klaren über die Rechte an den Klassen ist oder sonst die Übersicht verliert. Ausserdem kann es gut sein, dass sich die Kompilierzeit erhöht.</p>
<p>Auch die vielen Singletons, die du da verwendest, lassen mich etwas am Design zweifeln...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1581173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1581173</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 12 Sep 2008 21:55:57 GMT</pubDate></item><item><title><![CDATA[Reply to wird alles richtig gelöscht? on Sat, 13 Sep 2008 00:45:50 GMT]]></title><description><![CDATA[<p>Nunja, eigentlich sind die singletos ganz gut. Wenn ich eine camera habe, kannich ja schlecht zwei kameras haben, den auch im spiel hat man keine gespaltene persöhnlichkeit. Und ich brauche ja auch nur ein device, und auch nur ein Fenster.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1581188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1581188</guid><dc:creator><![CDATA[Code-Walker]]></dc:creator><pubDate>Sat, 13 Sep 2008 00:45:50 GMT</pubDate></item><item><title><![CDATA[Reply to wird alles richtig gelöscht? on Sat, 13 Sep 2008 09:56:17 GMT]]></title><description><![CDATA[<p>Code-Walker schrieb:</p>
<blockquote>
<p>Nunja, eigentlich sind die singletos ganz gut. Wenn ich eine camera habe, kannich ja schlecht zwei kameras haben, den auch im spiel hat man keine gespaltene persöhnlichkeit. Und ich brauche ja auch nur ein device, und auch nur ein Fenster.</p>
</blockquote>
<p>Du kannst ohne weiteres auch mehrere Kameras haben. Mal an Splittscreen gedacht? Oder eine &quot;virtuelle&quot; Kamera, um etwas zu simulieren?<br />
Fenster sind mehrere auch gut möglich, sowie auch mehrere Devices. (OK. Devices sind mehrere eher selten der Fall, aber das andere macht wirklich Sinn.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1581252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1581252</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 13 Sep 2008 09:56:17 GMT</pubDate></item><item><title><![CDATA[Reply to wird alles richtig gelöscht? on Sat, 13 Sep 2008 13:59:14 GMT]]></title><description><![CDATA[<p>EDITED::</p>
<p>Sry, hab net nachgedaht was ich schreibe, hab fieber. Was ich meine, ich habe jetzt alles woeit hinbekommen, nur muss wenn ich jetzt ein Mesh lade, dieser wissen, wo die camera ist. Das heißt die child mussen miteinander komunizieren können. Mir würde da nur einfallen, das man sowas wie ein suchdurchlauf macht, aber da muss es doch bestimmt noch bessere möglichkeiten geben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1581341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1581341</guid><dc:creator><![CDATA[Code-Walker]]></dc:creator><pubDate>Sat, 13 Sep 2008 13:59:14 GMT</pubDate></item></channel></rss>