<?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[Zeiger von anderer Klasse in einer abstrakten Klasse löschen]]></title><description><![CDATA[<p>Hallo!<br />
Hab folgendes Problem:<br />
Ich habe in einer abstrakten Klasse Variable einen Verweis auf eine andere Klasse Type:</p>
<pre><code>class variable
{
public:
	virtual ~variable();	//added
	// Print function
	virtual void Print(std::ostream &amp; os) const =0;
protected:
	std::string mName;
	std::string mType;
	Type* mpType; -&gt; hier liegt das Problem
};
</code></pre>
<p>wenn ich im virtuellen Destruktor den mpType delete, dann stürzt das Programm ab. eh klar weil ichs ja in den abgeleiteten Klassen eigentlich benutze. nur wenn ich dort im delete den mptype lösche (klasse javavariable und iecvariable) stürzt das programm genauso ab. habe jetzt was im internet was von shared pointers gelsen. allerdings haben wir das nie gelernt und die erklärungen auf englisch sind mir irgendwie nicht geheuer.</p>
<p>mfg<br />
ACnut</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/321838/zeiger-von-anderer-klasse-in-einer-abstrakten-klasse-löschen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 22:54:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/321838.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 25 Nov 2013 20:24:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger von anderer Klasse in einer abstrakten Klasse löschen on Mon, 25 Nov 2013 20:24:20 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Hab folgendes Problem:<br />
Ich habe in einer abstrakten Klasse Variable einen Verweis auf eine andere Klasse Type:</p>
<pre><code>class variable
{
public:
	virtual ~variable();	//added
	// Print function
	virtual void Print(std::ostream &amp; os) const =0;
protected:
	std::string mName;
	std::string mType;
	Type* mpType; -&gt; hier liegt das Problem
};
</code></pre>
<p>wenn ich im virtuellen Destruktor den mpType delete, dann stürzt das Programm ab. eh klar weil ichs ja in den abgeleiteten Klassen eigentlich benutze. nur wenn ich dort im delete den mptype lösche (klasse javavariable und iecvariable) stürzt das programm genauso ab. habe jetzt was im internet was von shared pointers gelsen. allerdings haben wir das nie gelernt und die erklärungen auf englisch sind mir irgendwie nicht geheuer.</p>
<p>mfg<br />
ACnut</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367961</guid><dc:creator><![CDATA[ACnut]]></dc:creator><pubDate>Mon, 25 Nov 2013 20:24:20 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger von anderer Klasse in einer abstrakten Klasse löschen on Mon, 25 Nov 2013 20:38:28 GMT]]></title><description><![CDATA[<p>ACnut schrieb:</p>
<blockquote>
<p>wenn ich im virtuellen Destruktor den mpType delete, dann stürzt das Programm ab. eh klar[...]</p>
</blockquote>
<p>OK, mir nicht. Wieso stürzt das Programm ab?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367965</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 25 Nov 2013 20:38:28 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger von anderer Klasse in einer abstrakten Klasse löschen on Mon, 25 Nov 2013 20:50:13 GMT]]></title><description><![CDATA[<p>hier ist mal das klassendiagramm (das tba und so könnt ihr einfach wegdenken, es ist die alte version. in dem symbolparser sind zwei listen aus variable* und type* drinnen,...):<br />
<a href="http://www.imagenetz.de/f43f8701b/Unbenannt.png.html" rel="nofollow">http://www.imagenetz.de/f43f8701b/Unbenannt.png.html</a></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/904">@Bashar</a> ich hab mir das so erklärt:<br />
hab ja eine liste aus typen (z.b int). wenn ich jetz zwei variablen hätte (int a und int b), wenn ich jetzt die variable int a lösche dann happerts ja mit int b oder nicht?</p>
<p>dieser leak ist anscheinend so arg, dass sogar der visual leak detector abkratzt. (ohne delete krieg ich nur einen memory leak und dieser kommt eben von diesem mptype pointer).</p>
<p>also wie muss ich das problem angehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367969</guid><dc:creator><![CDATA[ACnut]]></dc:creator><pubDate>Mon, 25 Nov 2013 20:50:13 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger von anderer Klasse in einer abstrakten Klasse löschen on Mon, 25 Nov 2013 20:56:36 GMT]]></title><description><![CDATA[<p>Wenn ich das jetzt richtig verstehe:<br />
Die Klasse variable (bzw. die abgeleiteten Klassen) verwaltet alle Variablen eines Typen, richtig?<br />
Und wenn der Destruktor Verwaltungsdaten löscht, bevor die zu verwaltenden Variablen gelöscht werden, crasht das Programm?<br />
Einfache Lösung: Dafür sorgen, dass der Destruktor erst aufgerufen wird, wenn alle Variablen weg sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367971</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 25 Nov 2013 20:56:36 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger von anderer Klasse in einer abstrakten Klasse löschen on Mon, 25 Nov 2013 21:16:36 GMT]]></title><description><![CDATA[<p>nicht direkt<br />
im symbolparser haben wir eine methode addvariable</p>
<pre><code>void AddVariable(std::string const&amp; name, std::string const&amp; type);
</code></pre>
<p>dieses type string wird einer funktion search übergeben der dann in der typeliste danach sucht</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/29873">@Nathan</a>:<br />
Einfache Lösung: Dafür sorgen, dass der Destruktor erst aufgerufen wird, wenn alle Variablen weg sind.</p>
<p>wie sorgt man dafür?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367974</guid><dc:creator><![CDATA[ACnut]]></dc:creator><pubDate>Mon, 25 Nov 2013 21:16:36 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger von anderer Klasse in einer abstrakten Klasse löschen on Tue, 26 Nov 2013 00:05:05 GMT]]></title><description><![CDATA[<p>Variante 1: Typen nie löschen. Leakt, klar. Ist nur die Frage ob es ne Rolle spielt dass es leakt. Natürlich ist es immer doof wenn beim Beenden des Programms Leaks gemeldet werden, aber das kann man u.U. gezielt für die Stellen ausschalten wo eben die Typen ge <code>new</code> t werden. (Zumidnest für den MSVC Debug-Heap kann man das machen, die nötige Funktion heisst <code>_CrtSetDbgFlag</code> .</p>
<p>Variante 2: Mach ne Klasse die die ganzen Type-Objekte &quot;besitzt&quot;, und sorg dafür dass dieses Type-Objekte-Besitzerobjekt erst nach allen Variablen-Objekten gelöscht wird. Irgendwo musst du ja sowieso schon ne Liste aller Typen haben, sonst kannst du die ja unmöglich nachschlagen (nen String in nen Type* verwandeln). EDIT: ja, hast du auch, nämlich deine &quot;typeliste&quot; /EDIT<br />
Genau der Klasse die diese Liste/Map hat könntest du die Verantwortung umbinden alle Typen zu löschen.<br />
(Aber natürlich nur, wenn das Objekt dieser Klasse auch erst gelöscht wird nachdem alle Variablen Objekte gelöscht wurden.)</p>
<p>Variante 2.1: Pack die Typen in einen besitzenden Container. z.B. Boost <code>ptr_map</code> . Dann musst du dich um die Freigabe nicht explizit kümmern. Bzw. falls <code>Type</code> nicht polymorph ist, dann tut es sogar ne <code>std::map</code> .</p>
<p>Variante 3: Verwende <code>shared_ptr&lt;Type&gt;</code> statt <code>Type*</code> . Dann wird der Type automatisch dann gelöscht, wenn der letzte <code>shared_ptr&lt;Type&gt;</code> verschwindet der auf diese <code>Type</code> Instanz zeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368008</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 26 Nov 2013 00:05:05 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger von anderer Klasse in einer abstrakten Klasse löschen on Tue, 26 Nov 2013 00:20:48 GMT]]></title><description><![CDATA[<p>von wo muss ich diesen boost.h holen damit ich das mit dem unique_ptr überhaupt benutzen kann?<br />
weil wenn ich das header von diesem bsp laden will gehts natürlich nicht <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="🙂"
    /><br />
<a href="http://www.c-plusplus.net/forum/134971-full" rel="nofollow">http://www.c-plusplus.net/forum/134971-full</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368010</guid><dc:creator><![CDATA[ACnut]]></dc:creator><pubDate>Tue, 26 Nov 2013 00:20:48 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger von anderer Klasse in einer abstrakten Klasse löschen on Tue, 26 Nov 2013 00:50:15 GMT]]></title><description><![CDATA[<p>Boost besteht aus etwas mehr als nur einem Header-File. Inklusive Doku, Unit-Tests etc. sind es zigtausend Files.<br />
Und runterladen kannst du das Ding auf <a href="http://boost.org" rel="nofollow">boost.org</a>. Hättest du aber in 5 Sekunden selbst rausgefunden - &quot;Boost C++&quot; in Google eintippen reicht (ohne die &quot;&quot;).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368013</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 26 Nov 2013 00:50:15 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger von anderer Klasse in einer abstrakten Klasse löschen on Tue, 26 Nov 2013 00:54:18 GMT]]></title><description><![CDATA[<p>dachte, dass man das aus den libraries iwo rauskopieren muss <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="🙂"
    /><br />
vielen dank nochmal für die hilfe <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368014</guid><dc:creator><![CDATA[ACnut]]></dc:creator><pubDate>Tue, 26 Nov 2013 00:54:18 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger von anderer Klasse in einer abstrakten Klasse löschen on Tue, 26 Nov 2013 09:29:59 GMT]]></title><description><![CDATA[<p>ACnut schrieb:</p>
<blockquote>
<p>von wo muss ich diesen boost.h holen damit ich das mit dem unique_ptr überhaupt benutzen kann?</p>
</blockquote>
<p>Für unique_ptr&lt;&gt; brauchst Du kein Boost, ist Teil von C++11.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368049</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Tue, 26 Nov 2013 09:29:59 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger von anderer Klasse in einer abstrakten Klasse löschen on Tue, 26 Nov 2013 09:54:00 GMT]]></title><description><![CDATA[<p>Wobei ich nicht weiss wozu man <code>unique_ptr</code> her einsetzen sollte.<br />
OK, ja, <code>map&lt;string, unique_ptr&lt;T&gt;&gt;</code> ginge vermutlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368052</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 26 Nov 2013 09:54:00 GMT</pubDate></item></channel></rss>