<?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[Welchen Smartpointer verwenden?]]></title><description><![CDATA[<p>Ist folgendes mit Smartpointern möglich?</p>
<p>sp2 = sp1<br />
sp2.reset() // soll dynamischen Speicher freigeben auf den sp1 zeigt.</p>
<p>Mit welchen Smartpointern kann über sp2 der dynamische Speicher freigegeben werden auf den sp1 und sp2 zeigt? Mit shared_ptr funktioniert das anscheinend nicht:</p>
<p>class CForm {};</p>
<p>class CDreieck : public CForm {};</p>
<p>std::shared_ptr&lt;CDreieck&gt;Dreieck;<br />
std::shared_ptr&lt;CForm&gt;Form;</p>
<p>Dreieck = std::make_shared&lt;CDreieck&gt;();</p>
<p>Form = Dreieck;<br />
Form.reset(); // gibt den Speicher von Dreieck nicht frei</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/338620/welchen-smartpointer-verwenden</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Apr 2026 10:15:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/338620.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 Jun 2016 04:59:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Welchen Smartpointer verwenden? on Tue, 28 Jun 2016 06:29:07 GMT]]></title><description><![CDATA[<p>Ist folgendes mit Smartpointern möglich?</p>
<p>sp2 = sp1<br />
sp2.reset() // soll dynamischen Speicher freigeben auf den sp1 zeigt.</p>
<p>Mit welchen Smartpointern kann über sp2 der dynamische Speicher freigegeben werden auf den sp1 und sp2 zeigt? Mit shared_ptr funktioniert das anscheinend nicht:</p>
<p>class CForm {};</p>
<p>class CDreieck : public CForm {};</p>
<p>std::shared_ptr&lt;CDreieck&gt;Dreieck;<br />
std::shared_ptr&lt;CForm&gt;Form;</p>
<p>Dreieck = std::make_shared&lt;CDreieck&gt;();</p>
<p>Form = Dreieck;<br />
Form.reset(); // gibt den Speicher von Dreieck nicht frei</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500339</guid><dc:creator><![CDATA[mireiner]]></dc:creator><pubDate>Tue, 28 Jun 2016 06:29:07 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Smartpointer verwenden? on Tue, 28 Jun 2016 05:34:09 GMT]]></title><description><![CDATA[<p>ist ja auch ein <strong>&quot;shared&quot;</strong> Pointer - wenn jemand anderes den Pointer hält z.B . Dreieck wird da nix gelöscht, oder meinst du einen unique_ptr?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500340</guid><dc:creator><![CDATA[Gast3]]></dc:creator><pubDate>Tue, 28 Jun 2016 05:34:09 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Smartpointer verwenden? on Tue, 28 Jun 2016 06:17:03 GMT]]></title><description><![CDATA[<p>Kenne mich mit Smart Pointer noch nicht gut aus. Deshalb meine Frage, ob es möglich ist mit der Kopie einer Pointers (Form) den Speicher von (Dreieck) freizugeben?</p>
<p>Ist das mit Smartpointern oder einer Kombination aus Smartpointern und RAW-Pointer möglich? &quot;Dreieck&quot; sollte auf jeden Fall über einen Smartpointer erstellt werden. &quot;Form&quot; darf auch ein RAW-Pointer sein.</p>
<p>Soweit ich weiß, ist bei unique_ptr keine Kopie des Pointers möglich, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500342</guid><dc:creator><![CDATA[mireiner]]></dc:creator><pubDate>Tue, 28 Jun 2016 06:17:03 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Smartpointer verwenden? on Tue, 28 Jun 2016 06:37:08 GMT]]></title><description><![CDATA[<p>Mit unique_ptr + RAW Pointer geht das. Ob es sinnvoll ist, steht auf einem anderen Blatt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500346</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 28 Jun 2016 06:37:08 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Smartpointer verwenden? on Tue, 28 Jun 2016 07:04:17 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Mit unique_ptr + RAW Pointer geht das. Ob es sinnvoll ist, steht auf einem anderen Blatt.</p>
</blockquote>
<p>class CForm {};<br />
class CDreieck : public CForm {};</p>
<p>std::unique_ptr&lt;CDreieck&gt;Dreieck;<br />
Dreieck = std::make_unique&lt;CDreieck&gt;();</p>
<p>CForm* Form = Dreieck.get();<br />
delete Form;</p>
<p>Hallo manni66,<br />
meinst Du so? 'delete Form' sieht irgendwie brutal aus - da meckert der Compiler auch beim beenden des Programms: Debug Assertion failed - 'ValidHeapPointer(block)'.</p>
<p>Wie wird es richtig gemacht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500348</guid><dc:creator><![CDATA[mireiner]]></dc:creator><pubDate>Tue, 28 Jun 2016 07:04:17 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Smartpointer verwenden? on Tue, 28 Jun 2016 07:07:11 GMT]]></title><description><![CDATA[<p>Ich glaube, die Frage, die wir lieber beantworten sollten, lautet: Warum willst du das überhaupt so machen? Vielleicht ist der Ansatz schon falsch.</p>
<p>Zum Beispiel stellt sich doch die Frage, was nach der Zuweisung <code>Form = Dreieck;</code> mit Dreieck passieren soll - greift noch irgendjemand darauf zu und wenn ja, wie lange? Diese Frage stellt sich auch später noch einmal, wenn du den Speicher via Form freigeben willst. Was ist dann mit Dreieck?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500349</guid><dc:creator><![CDATA[wob]]></dc:creator><pubDate>Tue, 28 Jun 2016 07:07:11 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Smartpointer verwenden? on Tue, 28 Jun 2016 07:09:37 GMT]]></title><description><![CDATA[<p>So natürlich nicht! Es wird zweimal gelöscht.</p>
<p>Erkläre, was du erreichen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500350</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 28 Jun 2016 07:09:37 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Smartpointer verwenden? on Tue, 28 Jun 2016 09:46:27 GMT]]></title><description><![CDATA[<p>Danke für die Hinweise meinen Ansatz einmal zu überprüfen. Es lag wirklich an einem Denkfehler - falscher Reihenfolge.</p>
<p>1. Abgeleitete Klassen sollen über einen Member Basisklassenzeiger aufgerufen werden. Dabei soll immer nur eine Instanz aktiv sein.<br />
2. Um unfangreiches Casting zu vermeiden wird ein Zeiger auf die abgeleitete Klasse benötigt.</p>
<p>Ich hatte nun Punkt 2 über eine unique_ptr Instanz erzeugt und dann darauf einen Basisklassenzeiger gesetzt. Mit dem ich wiederum den Speicher der abgeleiteten Klasse freigeben wollte. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Viel einfacher ist aber eine unique_ptr Instanz des Basisklassenzeigers auf die abgeleitete Klasse zu erzeugen. Und dann einen RAW Pointer der abgeleiteten Klasse darauf zu setzen, um umfangreiches Casting zu ersparen.</p>
<p>class CForm {};<br />
class CDreieck : public CForm {};<br />
class CQuadrat : public CForm {};</p>
<p>std::unique_ptr&lt;CForm&gt;form;</p>
<p>form.reset(new CDreieck()); // Basisklassenzeiger zum Ausführen überladener Funktionen<br />
CDreieck *dreieck = static_cast&lt;CDreieck*&gt;form.get(); // RAW Zeiger für Menühandling</p>
<p>form.reset(new CQuadrat()); // Basisklassenzeiger zum Ausführen überladener Funktionen<br />
CQuadrat *quadrat = static_cast&lt;CQuadrat*&gt;form.get(); // RAW Zeiger für Menühandling<br />
usw.</p>
<p>Danke an alle für die Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500363</guid><dc:creator><![CDATA[mireiner]]></dc:creator><pubDate>Tue, 28 Jun 2016 09:46:27 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Smartpointer verwenden? on Tue, 28 Jun 2016 10:13:39 GMT]]></title><description><![CDATA[<p>mireiner schrieb:</p>
<blockquote>
<p>class CForm {};<br />
class CDreieck : public CForm {};<br />
class CQuadrat : public CForm {};</p>
<p>std::unique_ptr&lt;CForm&gt;form;</p>
<p>form.reset(new CDreieck()); // Basisklassenzeiger zum Ausführen überladener Funktionen<br />
CDreieck *dreieck = static_cast&lt;CDreieck*&gt;form.get(); // RAW Zeiger für Menühandling</p>
<p>form.reset(new CQuadrat()); // Basisklassenzeiger zum Ausführen überladener Funktionen<br />
CQuadrat *quadrat = static_cast&lt;CQuadrat*&gt;form.get(); // RAW Zeiger für Menühandling<br />
usw.</p>
<p>Danke an alle für die Hilfe!</p>
</blockquote>
<p>Das ist, sagen wir mal suboptimal, wenn du für jeden konkreten Typen wieder einen downcast machst. Kannst du die benötigte Funktionalität (zB fürs Menühandling) nicht in die Basisklasse verlagern? Oder als Interface anbieten?<br />
Ansonsten gibt es noch das Visitor Pattern, um verschiedene Funktionen in Abhängigkeit des konketen Typs zu implementieren, ohne eine cast-Kaskade machen zu müssen.</p>
<p>Oder du stellst die Reihenfolge deiner Anweisungen etwas um:</p>
<pre><code>shared_ptr&lt;Quadrat&gt; q = make_shared&lt;Quadrat&gt;();
do_something( q );
form = q;
</code></pre>
<p>Edit:<br />
Wann genau und wie oft brauchst du denn das konkrete Objekt. Nur ein Mal bei Erstellung oder immer wieder zwischendurch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500368</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Tue, 28 Jun 2016 10:13:39 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Smartpointer verwenden? on Tue, 28 Jun 2016 12:04:28 GMT]]></title><description><![CDATA[<p>DocShoe schrieb:</p>
<blockquote>
<p>Das ist, sagen wir mal suboptimal, wenn du für jeden konkreten Typen wieder einen downcast machst. Kannst du die benötigte Funktionalität (zB fürs Menühandling) nicht in die Basisklasse verlagern? Oder als Interface anbieten?<br />
Ansonsten gibt es noch das Visitor Pattern, um verschiedene Funktionen in Abhängigkeit des konketen Typs zu implementieren, ohne eine cast-Kaskade machen zu müssen.</p>
<p>Oder du stellst die Reihenfolge deiner Anweisungen etwas um:</p>
<pre><code>shared_ptr&lt;Quadrat&gt; q = make_shared&lt;Quadrat&gt;();
do_something( q );
form = q;
</code></pre>
<p>Edit:<br />
Wann genau und wie oft brauchst du denn das konkrete Objekt. Nur ein Mal bei Erstellung oder immer wieder zwischendurch?</p>
</blockquote>
<p>Das ganze befindet sich in einem Qt GUI Programm, wo bestimmte Strukturen vorgegeben sind, wie die Paint() Funktion und die Menüeinsprung Funktionen.</p>
<p>Vom User können ca. 15 abgeleitete Objekte dynamisch erzeugt und gewechselt, bzw. gelöscht werden. Die Zeiger sind aber als Member Zeigervariablen in der umschließenden GUI Klasse (QMainWindow) angelegt. Letztere beleibt während der gesammten Laufzeit erhalten.</p>
<p>Jede abgeleitete Klasse hat ca. 4-10 Parameter, die über Menükommandos geändert werden können. Zuviel um es in der Basisklasse unterzubringen.</p>
<p>Spricht denn generell etwas gegen downcasting? Das geschieht ja nur einmalig bei der Erzeugung eines Objekts in einer Menüfunktion. Mit dem daraus gewonnenen RAW-Pointer kann das Objekt dann während seiner Lebzeit beliebig oft über Menükommandos verändert werden. Die Menükommandos sind in keiner Weise Laufzeit kritisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500381</guid><dc:creator><![CDATA[mireiner]]></dc:creator><pubDate>Tue, 28 Jun 2016 12:04:28 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Smartpointer verwenden? on Wed, 29 Jun 2016 07:18:43 GMT]]></title><description><![CDATA[<p>mireiner schrieb:</p>
<blockquote>
<p>Vom User können ca. 15 abgeleitete Objekte dynamisch erzeugt und gewechselt, bzw. gelöscht werden. Die Zeiger sind aber als Member Zeigervariablen in der umschließenden GUI Klasse (QMainWindow) angelegt. Letztere beleibt während der gesammten Laufzeit erhalten.</p>
<p>Jede abgeleitete Klasse hat ca. 4-10 Parameter, die über Menükommandos geändert werden können. Zuviel um es in der Basisklasse unterzubringen.</p>
<p>Spricht denn generell etwas gegen downcasting? Das geschieht ja nur einmalig bei der Erzeugung eines Objekts in einer Menüfunktion. Mit dem daraus gewonnenen RAW-Pointer kann das Objekt dann während seiner Lebzeit beliebig oft über Menükommandos verändert werden. Die Menükommandos sind in keiner Weise Laufzeit kritisch.</p>
</blockquote>
<p>Warum soll sich die GUI um die Menükommandos zum Verändern des jeweiligen Objektes kümmern? Die aufgerufenen Funktionen sind doch dann &quot;spezielle&quot; Member des Objektes, oder sehe ich das falsch?<br />
Lösung:<br />
Die Objekte von QObject ableiten (oder direkt die Basisklasse) und die speziellen Funktionen in den abgeleteten Klassen als SLOTS deklarieren. Memberfunktion <em><em>virtual QList&lt;QAction</em>&gt; menuKommandos()</em>* in die Basisklasse und bei einem reset die alten actions aus dem Menü entfernen und durch die neuen ersetzen. Die actions werden in der abgeleiteten Klassen in menuKommandos() erzeugt und mit den passenden SLOTS connect()ed.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500446</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500446</guid><dc:creator><![CDATA[Cantonator]]></dc:creator><pubDate>Wed, 29 Jun 2016 07:18:43 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Smartpointer verwenden? on Wed, 29 Jun 2016 17:25:26 GMT]]></title><description><![CDATA[<p>Cantonator schrieb:</p>
<blockquote>
<p>Lösung:<br />
Die Objekte von QObject ableiten (oder direkt die Basisklasse) und die speziellen Funktionen in den abgeleteten Klassen als SLOTS deklarieren. Memberfunktion <em><em>virtual QList&lt;QAction</em>&gt; menuKommandos()</em>* in die Basisklasse und bei einem reset die alten actions aus dem Menü entfernen und durch die neuen ersetzen. Die actions werden in der abgeleiteten Klassen in menuKommandos() erzeugt und mit den passenden SLOTS connect()ed.</p>
</blockquote>
<p>Für einen Qt Anfänger wie mich, klingt das erst einmal sehr komplex. Werde es in Ruhe einmal durchdenken. Danke für diesen Lösungvorschlag.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500523</guid><dc:creator><![CDATA[mireiner]]></dc:creator><pubDate>Wed, 29 Jun 2016 17:25:26 GMT</pubDate></item></channel></rss>