<?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[Wer löscht?]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgende Situation:</p>
<p>Ich lege auf dem Heap 2 Objekte an:<br />
A* a = new A;<br />
B* b = new B;</p>
<p>ein Objekt C hat einen Zeiger auf A und einen auf B und bekommt nun die 2 Zeiger übergeben:</p>
<p>C* c = new C(a, b);</p>
<p>Meine Frage:<br />
Wer soll nun den Speicher von a und b löschen? Der Dtor von C oder die Funktion, die a und b initiiert hat (und die Zeiger nur an C übergibt)?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/222643/wer-löscht</link><generator>RSS for Node</generator><lastBuildDate>Sun, 04 Oct 2026 22:43:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/222643.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 15 Sep 2008 16:49:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wer löscht? on Mon, 15 Sep 2008 16:49:45 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgende Situation:</p>
<p>Ich lege auf dem Heap 2 Objekte an:<br />
A* a = new A;<br />
B* b = new B;</p>
<p>ein Objekt C hat einen Zeiger auf A und einen auf B und bekommt nun die 2 Zeiger übergeben:</p>
<p>C* c = new C(a, b);</p>
<p>Meine Frage:<br />
Wer soll nun den Speicher von a und b löschen? Der Dtor von C oder die Funktion, die a und b initiiert hat (und die Zeiger nur an C übergibt)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582327</guid><dc:creator><![CDATA[Löschwilliger]]></dc:creator><pubDate>Mon, 15 Sep 2008 16:49:45 GMT</pubDate></item><item><title><![CDATA[Reply to Wer löscht? on Mon, 15 Sep 2008 16:54:00 GMT]]></title><description><![CDATA[<p>ohne den programmaufbau zu kennen sagt mir mein Gefühl das C dies tun sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582329</guid><dc:creator><![CDATA[zeh111]]></dc:creator><pubDate>Mon, 15 Sep 2008 16:54:00 GMT</pubDate></item><item><title><![CDATA[Reply to Wer löscht? on Mon, 15 Sep 2008 17:11:16 GMT]]></title><description><![CDATA[<p>Falls ich es zu ungenau erklärt hab hier nochmal genauer:</p>
<p>Soll ich wie in Beispiel I oder II löschen?</p>
<p>I)</p>
<pre><code class="language-cpp">A* a = new A; 
B* b = new B; 

C* c = new C(a, b);
/* arbeite mit c */
delete c; // Dtor von C ruft jetzt delete auf A und B auf
</code></pre>
<p>II)</p>
<pre><code class="language-cpp">A* a = new A; 
B* b = new B; 

C* c = new C(a, b);
/* arbeite mit c */
delete c; // Dtor von C löscht seine eigenen alloziierten Speicher aber NICHT B und C
delete a;
delete b;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1582347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582347</guid><dc:creator><![CDATA[Löschwilliger]]></dc:creator><pubDate>Mon, 15 Sep 2008 17:11:16 GMT</pubDate></item><item><title><![CDATA[Reply to Wer löscht? on Mon, 15 Sep 2008 17:16:12 GMT]]></title><description><![CDATA[<p>Variante 2. Ausser du hast einen sehr guten Grund das anderst zu machen.<br />
Üblicherweise gibt derjenige die Objekte frei, der sie anfordert. Und C kann theoretisch auch einmal wo anderst benutzt werden und wenn man da nicht weiss, dass C den Speicher wieder freigibt, dann gibts ein Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582355</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 15 Sep 2008 17:16:12 GMT</pubDate></item><item><title><![CDATA[Reply to Wer löscht? on Mon, 15 Sep 2008 17:17:40 GMT]]></title><description><![CDATA[<p>Das kann man nicht pauschal sagen, beide Designs sind möglich. Du musst dir halt überlegen, ob C die Verantwortung für a und b übernimmt oder nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582358</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 15 Sep 2008 17:17:40 GMT</pubDate></item><item><title><![CDATA[Reply to Wer löscht? on Mon, 15 Sep 2008 17:49:58 GMT]]></title><description><![CDATA[<p>Löschwilliger schrieb:</p>
<blockquote>
<p>Meine Frage:<br />
Wer soll nun den Speicher von a und b löschen? Der Dtor von C oder die Funktion, die a und b initiiert hat (und die Zeiger nur an C übergibt)?</p>
</blockquote>
<p>Ich persönlich bin kein Fan von Allozieren und Freigeben an unterschiedlichen Orten, da man dann gerade über solche Dinge stolpert. Entweder sollte C beides tun oder eben nicht.</p>
<p>Alternativ, wenn dies keine Option ist, und auch nicht genau zu klären ist wer was tut, ist shared_ptr/weak_ptr statt dem normalen Zeiger die richtige Option.</p>
<p>Enthalten entweder in boost oder in TR1.</p>
<pre><code class="language-cpp">#include &lt;memory&gt; // TR1 mit std::tr1 Namensraum oder
// #include &lt;boost/shared_ptr.hpp&gt; bei Boost, mit dem boost Namesraum

class A{};
class B{};

class C
{
    public:
        C(std::tr1::shared_ptr&lt;A&gt; const &amp; a,
          std::tr1::shared_ptr&lt;B&gt; const &amp; b)
        : a(a),
          b(b)
        {}

    private:
        std::tr1::shared_ptr&lt;A&gt; a;
        std::tr1::shared_ptr&lt;B&gt; b;
};

void main
{
    std::tr1::shared_ptr&lt;A&gt; a(new A);
    std::tr1::shared_ptr&lt;B&gt; b(new B);
    C c(a, b);
}
</code></pre>
<p>cu André<br />
Nachtrag: sobald dadurch ein gegenseitiges Aufrechterhalten passiert, muss man dies mittels weak_ptr auflösen... Aber ich schreibe jetzt keine Abhandlung über die Verwendung der Smartpointer, gibt garantiert dazu genug im Forum und in der boost-Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582386</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 15 Sep 2008 17:49:58 GMT</pubDate></item><item><title><![CDATA[Reply to Wer löscht? on Tue, 16 Sep 2008 08:46:29 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich persönlich bin kein Fan von Allozieren und Freigeben an unterschiedlichen Orten</p>
</blockquote>
<p>Ich wuerd noch weitergehen und sagen, das es definitiv kein guter Stil ist ... und ned nur ne persoenliche Abneigung <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>
<p>Also wenn technisch nix gegen spricht, sollten das new und delete immer an aequivalenten stellen zu finden sein, wie zb:</p>
<p>new: irgendwo in ner funktion/methode<br />
delete: in der selben funktion/methode weiter hinten</p>
<p>new: im Konstruktor/Initialisierungsliste einer Klasse<br />
delete: im Destructor der klasse.</p>
<p>besser:</p>
<p>new: in der initialisierungsliste als konstruktor parameter fuer nen smartpointer(member)<br />
delete: automatisch.</p>
<p>Ausnahmen:<br />
gibts immer, klar. Wenn die lebenszeit einer Instanz definizieleren bedingungen unterliegt. Quelle /senken z.b. aber dann Smartpointer verwenden.<br />
Objektfabriken ...</p>
<p>Prinzipiell: new und deletes vermeiden, wenns geht. Oft kann man die dinger impliziet dynamisch anlegen lassen. zb in ne Liste werfen und nen zeiger auf das object in der liste weitergeben ... vorrausgesetzt die CCToren sind trivial (performance), und nen CCtor ueberhaupt logisch möglich ...</p>
<p>In deinem Fall wuerd ich mich fragen:<br />
dein C wird eh dynamisch allokiert, warum dann die kosntruktion von a und b auch expliziet dynamisch ? warum ned in die konstruktion von C verlagern, und die Information zum erzeugen von a unf b an c (konstruktor) uebermitteln. dann koennen a und b normale member von c sein.<br />
wenn nein, wer ist fuer a und b sonst zustaendig ?</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582662</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Tue, 16 Sep 2008 08:46:29 GMT</pubDate></item><item><title><![CDATA[Reply to Wer löscht? on Tue, 16 Sep 2008 09:37:22 GMT]]></title><description><![CDATA[<p>ich denke, C sollte es keinesfalls freigeben.<br />
Schließlich weißt du ja nicht, ob die im kontruktor übergebenen pointer im Heap oder Stack liegen.</p>
<p>je nach Aufgabe deiner klasse würde sich folgendes anbieten:</p>
<pre><code class="language-cpp">class C
{
public:

  C()
  : m_a(new A)
  , m_b(new B)
  , m_freeMem(true)
  {};

  C( A* a, B* b)
  : m_a(a)
  , m_b(b)
  , m_freeMem(false)
  {};

  ~C()
  {
    if(m_freeMem){
      delete m_a;
      delete m_b
    }
  }

private:
  A* m_a;
  B* m_b;
  bool m_freeMem;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1582706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582706</guid><dc:creator><![CDATA[vlad_tepesch]]></dc:creator><pubDate>Tue, 16 Sep 2008 09:37:22 GMT</pubDate></item><item><title><![CDATA[Reply to Wer löscht? on Tue, 16 Sep 2008 10:49:24 GMT]]></title><description><![CDATA[<p>vlad_tepesch schrieb:</p>
<blockquote>
<p>ich denke, C sollte es keinesfalls freigeben.<br />
Schließlich weißt du ja nicht, ob die im kontruktor übergebenen pointer im Heap oder Stack liegen.</p>
</blockquote>
<p>Genau das ist die Crux. Wenn `C` freigibt, müsste man diese Anforderung in der Dokumentation formuieren und es lässt sich sehr schwer die Korrektheit eines entsprechendne Programms überprüfen. Solche Besitzübergabe von Freispeicher ist immer eine äußerst heikle Angelegenheit und sollte gut durchdacht werden.</p>
<p>So allgemein, wie die Frage gestellt ist, sollte `C` den Speicher auf keinen Fall freigeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582753</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Tue, 16 Sep 2008 10:49:24 GMT</pubDate></item><item><title><![CDATA[Reply to Wer löscht? on Tue, 16 Sep 2008 10:54:05 GMT]]></title><description><![CDATA[<p>Benutze auto_ptr zur Parameterübergabe (wenn das Löschen der Objekt durch C überhaupt in Frage kommt). Dann beantwortet sich die Frage von selbst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582761</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 16 Sep 2008 10:54:05 GMT</pubDate></item><item><title><![CDATA[Reply to Wer löscht? on Tue, 16 Sep 2008 10:55:44 GMT]]></title><description><![CDATA[<p>Löschwilliger schrieb:</p>
<blockquote>
<p>Soll ich wie in Beispiel I oder II löschen?</p>
</blockquote>
<p>Weder Beispiel I noch II sind Exception safe, d.h. das Programm muß umgeschrieben werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582763</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Tue, 16 Sep 2008 10:55:44 GMT</pubDate></item><item><title><![CDATA[Reply to Wer löscht? on Tue, 16 Sep 2008 11:51:24 GMT]]></title><description><![CDATA[<p>vlad_tepesch schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Grundsätzlich würde ich eine Schnittstelle möglichst frei von Mehrdeutigkeiten halten. Ja, solche Konstrukte wie dort geschrieben habe ich auch schon verwendet, aber nein, ich würde dies nicht wieder tun.</p>
<p>camper schrieb:</p>
<blockquote>
<p>Benutze auto_ptr zur Parameterübergabe (wenn das Löschen der Objekt durch C überhaupt in Frage kommt). Dann beantwortet sich die Frage von selbst.</p>
</blockquote>
<p>Zugegeben: Ich bin auch kein Fan vom als &quot;deprecated&quot; markierten auto_ptr, auch wenn er hier eine Option sein kann...</p>
<p>Ich weiß, der shared_ptr ist mit mehr Overhead versehen, aber seine Verwendung wurde im Laufe der Zeit nicht geändert, und er ist ab TR1 fester Bestandteil des Standards (und nicht &quot;deprecated&quot;). Zudem besagt er IMHO sehr schön was Sache ist.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582809</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 16 Sep 2008 11:51:24 GMT</pubDate></item><item><title><![CDATA[Reply to Wer löscht? on Tue, 16 Sep 2008 12:10:43 GMT]]></title><description><![CDATA[<p>RHBaum schrieb:</p>
<blockquote>
<p>new: irgendwo in ner funktion/methode<br />
delete: in der selben funktion/methode weiter hinten</p>
</blockquote>
<p>Das würde ich nicht machen. Das gibt mit Sicherheit keinen Exception-Sicheren Code. Deletes sind bei mir in der Regel immer in irgendeinem Destruktor. Oder genauer: in dem Destruktor der Klasse, welche die Objekte auch angelegt hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582820</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Tue, 16 Sep 2008 12:10:43 GMT</pubDate></item><item><title><![CDATA[Reply to Wer löscht? on Tue, 16 Sep 2008 17:44:30 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Das würde ich nicht machen. Das gibt mit Sicherheit keinen Exception-Sicheren Code. Deletes sind bei mir in der Regel immer in irgendeinem Destruktor. Oder genauer: in dem Destruktor der Klasse, welche die Objekte auch angelegt hat.</p>
</blockquote>
<p>Es ging RHBaum wohl eher darum, wo dynamische Objekte zerstört werden sollen, wenn sie während einer Funktion erstellt werden. Und ein Destruktor kommt dann natürlich nicht in Frage.</p>
<p>Wenn man aber (rohe) Zeiger, die auf dynamischen Speicher verweisen, zurückgeben muss, kommt es nicht selten zu Memory Leaks, weil der Aufrufer nicht weiss, dass er das Objekt zu löschen hat (sieht man auch schön bei C-Funktionen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1583043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1583043</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 16 Sep 2008 17:44:30 GMT</pubDate></item></channel></rss>