<?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, das Zeiger auf sich selbst enthalten kann, sinnvolle Destruktoren]]></title><description><![CDATA[<p>Hallo Forum, ich habe ein Objekt, das in etwa wie folgt ausschaut:</p>
<pre><code>class obj
{

private:
obj *o1,*o2;
}
</code></pre>
<p>Falls es nötig ist, werden o1 und o2 mit new erzeugt, und erhalten dann so wiederum ein Objekt, wodurch eine Baumstruktur entstehen kann. Es kann auch sein, dass beide Objekte mit NULL belegt bleiben, das wäre dann ein Baumende.<br />
Im Destruktor wird delete für beide Objekte aufgerufen.<br />
Jetzt kann es aber zu Fehlern kommen, vor Allem bei Verwendung lokaler Instanzen.</p>
<p>Das Problem ist, dass ein Objekt ja delete für seine Unterobjekte aufruft.<br />
In dem Fall kann aber sein, dass ein Objekt gelöscht wird, auf das ein Anderes Objekt noch zeigt. Dann wird versucht, zweimal den gleichen Speicher zu löschen, wodurch ein Fehler entsteht.<br />
Gibt es einen einfachen Weg, das zu lösen?</p>
<p>Meine Gedanken waren:<br />
1. Bei der Erstellung neuer Objekte immer den ganzen Objektbaum mit kopieren. Benötigt aber unnötig Speicherplatz.<br />
2. Ein Referenzzähler, aber das gefällt mir weniger und ich scheitere bei einer einfachen Implementierung</p>
<p>Hat jemand noch eine einfache, bessere Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/323045/objekt-das-zeiger-auf-sich-selbst-enthalten-kann-sinnvolle-destruktoren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 13:41:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/323045.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 16 Jan 2014 08:07:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekt, das Zeiger auf sich selbst enthalten kann, sinnvolle Destruktoren on Thu, 16 Jan 2014 08:07:51 GMT]]></title><description><![CDATA[<p>Hallo Forum, ich habe ein Objekt, das in etwa wie folgt ausschaut:</p>
<pre><code>class obj
{

private:
obj *o1,*o2;
}
</code></pre>
<p>Falls es nötig ist, werden o1 und o2 mit new erzeugt, und erhalten dann so wiederum ein Objekt, wodurch eine Baumstruktur entstehen kann. Es kann auch sein, dass beide Objekte mit NULL belegt bleiben, das wäre dann ein Baumende.<br />
Im Destruktor wird delete für beide Objekte aufgerufen.<br />
Jetzt kann es aber zu Fehlern kommen, vor Allem bei Verwendung lokaler Instanzen.</p>
<p>Das Problem ist, dass ein Objekt ja delete für seine Unterobjekte aufruft.<br />
In dem Fall kann aber sein, dass ein Objekt gelöscht wird, auf das ein Anderes Objekt noch zeigt. Dann wird versucht, zweimal den gleichen Speicher zu löschen, wodurch ein Fehler entsteht.<br />
Gibt es einen einfachen Weg, das zu lösen?</p>
<p>Meine Gedanken waren:<br />
1. Bei der Erstellung neuer Objekte immer den ganzen Objektbaum mit kopieren. Benötigt aber unnötig Speicherplatz.<br />
2. Ein Referenzzähler, aber das gefällt mir weniger und ich scheitere bei einer einfachen Implementierung</p>
<p>Hat jemand noch eine einfache, bessere Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377535</guid><dc:creator><![CDATA[Becker]]></dc:creator><pubDate>Thu, 16 Jan 2014 08:07:51 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt, das Zeiger auf sich selbst enthalten kann, sinnvolle Destruktoren on Thu, 16 Jan 2014 08:10:00 GMT]]></title><description><![CDATA[<p>Smartpointer. In dem Fall:<br />
<a href="http://de.cppreference.com/w/cpp/memory/shared_ptr" rel="nofollow">http://de.cppreference.com/w/cpp/memory/shared_ptr</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377537</guid><dc:creator><![CDATA[qweasdyxc]]></dc:creator><pubDate>Thu, 16 Jan 2014 08:10:00 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt, das Zeiger auf sich selbst enthalten kann, sinnvolle Destruktoren on Thu, 16 Jan 2014 08:16:29 GMT]]></title><description><![CDATA[<p>Becker schrieb:</p>
<blockquote>
<p>Das Problem ist, dass ein Objekt ja delete für seine Unterobjekte aufruft. In dem Fall kann aber sein, dass ein Objekt gelöscht wird, auf das ein Anderes Objekt noch zeigt.</p>
</blockquote>
<p>Wie soll dies bei einer &quot;echten&quot; Baumstruktur zustande kommen? Ich meine einen Baum macht auch aus das ein Element nicht von zwei Stellen gehalten wird. Ansonsten wäre dies, wenn zyklische Abhängigkeiten ausgeschlossen werden können, ein Fall für einen Smartpointer mit Referenzzählung (z.B. shared_ptr). Ganz davon abgesehen das ich für die Speicherverwaltung egal in welchen Ansatz einen geeigneten Smartpointer empfehlen würde (Dann spart man sich auch das Schreiben eines Destruktors).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377539</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 16 Jan 2014 08:16:29 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt, das Zeiger auf sich selbst enthalten kann, sinnvolle Destruktoren on Thu, 16 Jan 2014 08:31:23 GMT]]></title><description><![CDATA[<p>Danke für die schnellen Antworten.<br />
Ihr habt das richtig erkannt, eine echte Baumstruktur ist es nicht.</p>
<p>Über shared_ptr war ich auch schon gestolpert, hatte diese allerdings ausgeschlossen,<br />
da ich nicht mit dem C++11-Standard oder Hilfsbibliotheken programmieren kann.</p>
<p>Dann werde ich versuchen, die Funktionalität nachzubilden. Das dürfte wieder einfacher<br />
Referenzzählung recht nahe kommen. Aber wenn es nicht anders geht, bleibt mir wohl keine Wahl.</p>
<p>Wenn jemand noch was weiß, gern her damit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377543</guid><dc:creator><![CDATA[Becker]]></dc:creator><pubDate>Thu, 16 Jan 2014 08:31:23 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt, das Zeiger auf sich selbst enthalten kann, sinnvolle Destruktoren on Thu, 16 Jan 2014 08:34:35 GMT]]></title><description><![CDATA[<p>Wenn möglich würde dafür sorgen, dass bei der Löschung keine Zeiger mehr auf das Objekt existieren, dann könnte man auch <code>std::unique_ptr</code> oder was Simples selbstgebasteltes verwenden. Oft will man, wenn ein Objekt aus einer Datenstruktur gelöscht wird, es auch wirklich weghaben und seine Lebensdauer nicht künstlich verlängern. Aber ich kenne die konkrete Anwendung zu wenig...</p>
<p>Wieso brauchst du also geteilte Besitzverhältnisse?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377544</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 16 Jan 2014 08:34:35 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt, das Zeiger auf sich selbst enthalten kann, sinnvolle Destruktoren on Thu, 16 Jan 2014 08:42:07 GMT]]></title><description><![CDATA[<p>Erfinde eine Klasse, die alle Knoten in einem vector&lt;unique_ptr&gt; besitzt. Dann kannst du die Knoten untereinander verbinden wie du willst und hast gar keine Besitzverhaeltnisse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377547</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Thu, 16 Jan 2014 08:42:07 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt, das Zeiger auf sich selbst enthalten kann, sinnvolle Destruktoren on Thu, 16 Jan 2014 12:29:06 GMT]]></title><description><![CDATA[<p>Becker schrieb:</p>
<blockquote>
<p>Über shared_ptr war ich auch schon gestolpert, hatte diese allerdings ausgeschlossen, da ich nicht mit dem C++11-Standard oder Hilfsbibliotheken programmieren kann.</p>
</blockquote>
<p>Teste mal trotzdem, ob es std::shared_ptr oder std::tr1::shared_ptr gibt. shared_ptr gab es schon vor C++11, zum Beispiel in VS2010.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377599</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Thu, 16 Jan 2014 12:29:06 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt, das Zeiger auf sich selbst enthalten kann, sinnvolle Destruktoren on Thu, 16 Jan 2014 13:26:32 GMT]]></title><description><![CDATA[<p><code>shared_ptr</code> gibt's auch in der Boost. Die funktionieren sogar mit VC6 und ähnlichen grossväterlichen Compilern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377618</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 16 Jan 2014 13:26:32 GMT</pubDate></item></channel></rss>