<?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[Konstruktor und Destruktor]]></title><description><![CDATA[<p>Hallo verwende ich den Konstruktor und den Destruktor hier sinnvoll ?</p>
<p>Oder kann man das noch besser lösen ?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class addition
{

private:

      int z1;
      int z2;

 public:

 int add( );

   addition ( int zahl_1 , int zahl_2)
   {
        z1 = zahl_1;
        z2 = zahl_2;
   }

   ~addition()
   {
     cout&lt;&lt;&quot;Destruktor&quot;&lt;&lt;endl;
   }

};

 int addition :: add()
 {
 int erg;

        erg = z1 + z2;
        cout&lt;&lt;&quot;Erg: &quot; &lt;&lt; erg &lt;&lt; endl;

 return erg;
 }

int main()
{

 addition calc(1,1);   // objekt anlegen und dem konstruktor mit werten initialisieren
 calc.add();   // die funktion add aufrufen

   {
      addition dtor ( NULL,NULL ) ;   // desturktor aufrufen
                                      // der konstrutkor hat 2 parameter also
                                      // braucht der destrutkor auch 2 parameter
   }

 addition s( 2,2);    // konstruktor mit neuen werten initialisieren
 s.add();

 {
      addition dtor ( NULL,NULL ) ; // destruktor erneut aufrufen
 }

system(&quot;PAUSE&quot;);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/265605/konstruktor-und-destruktor</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 20:31:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/265605.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 26 Apr 2010 08:38:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstruktor und Destruktor on Mon, 26 Apr 2010 08:38:38 GMT]]></title><description><![CDATA[<p>Hallo verwende ich den Konstruktor und den Destruktor hier sinnvoll ?</p>
<p>Oder kann man das noch besser lösen ?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class addition
{

private:

      int z1;
      int z2;

 public:

 int add( );

   addition ( int zahl_1 , int zahl_2)
   {
        z1 = zahl_1;
        z2 = zahl_2;
   }

   ~addition()
   {
     cout&lt;&lt;&quot;Destruktor&quot;&lt;&lt;endl;
   }

};

 int addition :: add()
 {
 int erg;

        erg = z1 + z2;
        cout&lt;&lt;&quot;Erg: &quot; &lt;&lt; erg &lt;&lt; endl;

 return erg;
 }

int main()
{

 addition calc(1,1);   // objekt anlegen und dem konstruktor mit werten initialisieren
 calc.add();   // die funktion add aufrufen

   {
      addition dtor ( NULL,NULL ) ;   // desturktor aufrufen
                                      // der konstrutkor hat 2 parameter also
                                      // braucht der destrutkor auch 2 parameter
   }

 addition s( 2,2);    // konstruktor mit neuen werten initialisieren
 s.add();

 {
      addition dtor ( NULL,NULL ) ; // destruktor erneut aufrufen
 }

system(&quot;PAUSE&quot;);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1888339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888339</guid><dc:creator><![CDATA[dest]]></dc:creator><pubDate>Mon, 26 Apr 2010 08:38:38 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Mon, 26 Apr 2010 08:48:29 GMT]]></title><description><![CDATA[<p>Grundsätzlich ist eine Addition beileibe nichts, was man als Klasse modellieren würde.</p>
<p>Darüber hinaus ist dein Code inhaltlich nicht sinnvoll. Die Zeilen 53 und 63 sind völlig sinnlos. Du erzeugst dort neue Objekte mit den Namen dtor, die sofort wieder zerstört werden. Ein Destruktor wird normalerweise am Ende der Lebensdauer eines Objekts automatisch aufgerufen, und man kann ihm auch niemals Argumente übergeben.</p>
<p>NULL ist auch keine Zahl, warum nicht einfach 0?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888347</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Mon, 26 Apr 2010 08:48:29 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Mon, 26 Apr 2010 08:49:32 GMT]]></title><description><![CDATA[<p>hiho,</p>
<p>also den Destruktor rufst du in deinem Programm nirgends manuell auf.</p>
<pre><code class="language-cpp">{
      addition dtor ( NULL,NULL ) ;   // Konstruktoraufruf
}
</code></pre>
<p>Hierbei erzeugst du ein Objekt namens &quot;dtor&quot; (Konstruktorauruf) und übergibst 2x NULL, damit ist z1=0 und z2=0.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888348</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 26 Apr 2010 08:49:32 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Mon, 26 Apr 2010 08:52:46 GMT]]></title><description><![CDATA[<p>dest schrieb:</p>
<blockquote>
<p>Hallo verwende ich den Konstruktor und den Destruktor hier sinnvoll ?</p>
</blockquote>
<p>Ich werde mal den (Un-)Sinn der Klasse nicht hinterfragen... Einen Destruktor kannst du in diesem Fall weglassen, und solltest statt einer nachträglichen Zuweisung im Konstruktorrumpf lieber die Initialisierungsliste des Konstruktors verwenden:</p>
<pre><code class="language-cpp">addition(int zahl_1, int zahl_2)
: z1(zahl_1),
  z2(zahl_2)
{
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1888351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888351</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 26 Apr 2010 08:52:46 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Mon, 26 Apr 2010 09:49:39 GMT]]></title><description><![CDATA[<p>Ab wann muss man den denn Destruktor manuell Aufrufen ?</p>
<p>Weil hier wird der ja jetzt automatisch aufgerufen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/14941">@asc</a></p>
<blockquote>
<p>Ich werde mal den (Un-)Sinn der Klasse nicht hinterfragen...</p>
</blockquote>
<pre><code class="language-cpp">Das ist nur eine Übung für mich um zu sehen wie man mit Konstruktoren und Destruktoren arbeiten kann.

#include &lt;iostream&gt;
using namespace std;

class addition
{

private:

      int z1;
      int z2;

 public:

 int add( );

   addition ( int zahl_1 , int zahl_2)  :
        z1 ( zahl_1 ) , z2 ( zahl_2)
   {

   }

   ~addition()
   {
     cout&lt;&lt;&quot;Destruktor&quot;&lt;&lt;endl;
   }

};

 int addition :: add()
 {
 int erg;

        erg = z1 + z2;
        cout&lt;&lt;&quot;Erg: &quot; &lt;&lt; erg &lt;&lt; endl;

 return erg;
 }

int main()
{    // http://fredosaurus.com/notes-cpp/oop-condestructors/constructors.html

 {
     addition calc(1,1);   // objekt anlegen und dem konstruktor mit werten initialisieren
     calc.add();   // die funktion add aufrufen
 }
  // hier wird der destruktor automatisch aufgerufen

 system(&quot;PAUSE&quot;);
 }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1888372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888372</guid><dc:creator><![CDATA[dest]]></dc:creator><pubDate>Mon, 26 Apr 2010 09:49:39 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Mon, 26 Apr 2010 10:08:35 GMT]]></title><description><![CDATA[<p>hiho,</p>
<p>den Destruktor musst du bei der dynamischen Speicherverwaltung (new/delete) indirekt aufrufen, mittels delete bzw. delete[] (bei Arrays) Operator.</p>
<p>Bei allem Anderen braucht dich das nicht zu interessieren,<br />
weil, wie du schon gesagt hast, der Destruktor automatisch,<br />
beim Verlassen des Güligkeitsbereiches, aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888375</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 26 Apr 2010 10:08:35 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Mon, 26 Apr 2010 09:57:11 GMT]]></title><description><![CDATA[<p>dest schrieb:</p>
<blockquote>
<p>Ab wann muss man den denn Destruktor manuell Aufrufen ?</p>
</blockquote>
<p>In der Regel garnicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888376</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 26 Apr 2010 09:57:11 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Mon, 26 Apr 2010 09:58:48 GMT]]></title><description><![CDATA[<p>dest schrieb:</p>
<blockquote>
<p>Ab wann muss man den denn Destruktor manuell Aufrufen ?</p>
</blockquote>
<p>Als Anfänger kannst du erstmal davon ausgehen: niemals.</p>
<p>Ich behaupte mal das mindestens 95% der C++Programmierer niemals in die Situation kommen, in dem sie ein Destruktor manuell aufgerufen müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888378</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 26 Apr 2010 09:58:48 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Mon, 26 Apr 2010 09:59:41 GMT]]></title><description><![CDATA[<p>Dweb schrieb:</p>
<blockquote>
<p>den Destruktor musst du bei der dynamischen Speicherverwaltung (new/delete) manuell aufrufen, mittels delete bzw. delete[] (bei Arrays) Operator.</p>
</blockquote>
<p>Selbst da rufst du den Destruktor nicht selbst auf (sondern nur indirekt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888379</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 26 Apr 2010 09:59:41 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Mon, 26 Apr 2010 10:05:18 GMT]]></title><description><![CDATA[<p>Habe mal ein Beispiel gemacht:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Foo
{
    public:
        ~Foo()
        {
            std::cout &lt;&lt; &quot;Destruktor&quot; &lt;&lt; std::endl;
        }
};

Foo f_global;
int main()
{
    {
        Foo f_lokal;
    } // &lt;-- f_lokal wird zerstört (automatisch).

    Foo* p = new Foo;

    delete p; // Hier musst du den Destruktor nun indirekt über den delete Operator aufrufen.
    system(&quot;pause&gt;nul&quot;);
    return 0;
}
// &lt;-- f_global wird zerstört (automatisch).

/*
    Insgesamt wurde der Destruktor nun also 3x augerfuen.
*/
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1888382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888382</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 26 Apr 2010 10:05:18 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Mon, 26 Apr 2010 11:29:15 GMT]]></title><description><![CDATA[<p>Dweb schrieb:</p>
<blockquote>
<p>Habe mal ein Beispiel gemacht:</p>
</blockquote>
<p>Und nochmal: Auch hier hast du den Destruktor NICHT manuell aufgerufen. Das delete ihn aufruft ist ein Implementierungsdetail.</p>
<pre><code class="language-cpp">// Das wäre ein manueller Aufruf:
A a;
a.~A(); // In der Regel niemals nötig
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1888384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888384</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 26 Apr 2010 11:29:15 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Mon, 26 Apr 2010 11:03:11 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">~a();
</code></pre>
<p>Das ist kein expliziter Aufruf des Destruktors.<br />
Ein solcher müsste so aussehen</p>
<pre><code class="language-cpp">a.~A();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1888417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888417</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 26 Apr 2010 11:03:11 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Mon, 26 Apr 2010 11:29:42 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">~a();
</code></pre>
<p>Das ist kein expliziter Aufruf des Destruktors.<br />
Ein solcher müsste so aussehen</p>
<pre><code class="language-cpp">a.~A();
</code></pre>
</blockquote>
<p>Da merkt man schon wie selten man so etwas braucht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888431</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 26 Apr 2010 11:29:42 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Mon, 26 Apr 2010 21:23:01 GMT]]></title><description><![CDATA[<p>Egal wie selten ich es brauchen werde. ^^</p>
<p>Wenn man weiss wie es geht dann schadet es auch wohl nicht. ^^</p>
<p>Danke für die Hilfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888704</guid><dc:creator><![CDATA[dest]]></dc:creator><pubDate>Mon, 26 Apr 2010 21:23:01 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Mon, 26 Apr 2010 22:06:29 GMT]]></title><description><![CDATA[<p>dest schrieb:</p>
<blockquote>
<p>Wenn man weiss wie es geht dann schadet es auch wohl nicht. ^^</p>
</blockquote>
<p>Solange man nicht weiss, in welchen Situationen manuelle Destruktoraufrufe sinnvoll sind, nützt einem die Information auch nichts. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>asc hat schon Recht. Du fährst besser damit, Destruktoren gar nie direkt aufzurufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888716</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 26 Apr 2010 22:06:29 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Mon, 26 Apr 2010 22:51:40 GMT]]></title><description><![CDATA[<p>Hi Nexus,</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>dest schrieb:</p>
<blockquote>
<p>Wenn man weiss wie es geht dann schadet es auch wohl nicht. ^^</p>
</blockquote>
<p>Solange man nicht weiss, in welchen Situationen manuelle Destruktoraufrufe sinnvoll sind, nützt einem die Information auch nichts. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>asc hat schon Recht. Du fährst besser damit, Destruktoren gar nie direkt aufzurufen.</p>
</blockquote>
<p>Dann lass uns mal an deinem Wissen teilhaben.<br />
In welchen Situationen benutzt man denn manuelle Destruktor-Aufrufe?<br />
Ich habe nämlich auch keine Ahnung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Ich rate mal: Vielleicht wenn man die Speicheranforderungen für new und delete neudefiniert?</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888725</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888725</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 26 Apr 2010 22:51:40 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Mon, 26 Apr 2010 22:57:14 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Ich rate mal: Vielleicht wenn man die Speicheranforderungen für new und delete neudefiniert?</p>
</blockquote>
<p>Ja. Solche Low Level Sachen.</p>
<p>Man könnte es bestimmt sonst auch noch für diverse schmutze Hacks benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888726</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 26 Apr 2010 22:57:14 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Mon, 26 Apr 2010 23:40:20 GMT]]></title><description><![CDATA[<p>dest schrieb:</p>
<blockquote>
<p>Egal wie selten ich es brauchen werde. ^^</p>
<p>Wenn man weiss wie es geht dann schadet es auch wohl nicht. ^^</p>
</blockquote>
<p>Doch kann es schaden.<br />
Wenn du weisst wie, könntest du auf die Idee kommen es irgendwann zu verwenden. Wenn dir irgendwann aber das nötige Hintergrundwissen fehlt, um es richtig zu machen, machst du irgendwann Unsinn. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888734</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 26 Apr 2010 23:40:20 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Tue, 27 Apr 2010 07:30:15 GMT]]></title><description><![CDATA[<p>z.Bsp. immer beim zerstören, mit placement new`s erzeugter, objekte...</p>
<pre><code class="language-cpp">char* two_objects = operator new[sizeof(T)*2];
T* first  = new(two_objects          ) T(/*ctor-parameter*/);
T* second = new(two_objects+sizeof(T)) T(/*ctor-parameter*/);

/*iwas mit first und second machen*/

first -&gt;~T();
second-&gt;~T();

operator delete[] two_objects;
</code></pre>
<p>T ist natürlich als template-Parameter zu verstehen...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888801</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 27 Apr 2010 07:30:15 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Tue, 27 Apr 2010 11:36:17 GMT]]></title><description><![CDATA[<p>sollte man mit placement new erzeugte objekte nicht auch mit placement delete wieder freigeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888907</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 27 Apr 2010 11:36:17 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Tue, 27 Apr 2010 11:53:06 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>placement delete</p>
</blockquote>
<p>Was ist denn das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888918</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 27 Apr 2010 11:53:06 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Tue, 27 Apr 2010 12:32:30 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Was ist denn das?</p>
</blockquote>
<p>Zu jedem eigenen definiertem placemente new Operator sollte man auch ein placemente delete schreiben:</p>
<pre><code class="language-cpp">void* operator new(std::size_t size, Pool&amp; pool)
{
  return pool.alloc(size);
}

void operator delete(void* ptr, std::size_t size, Pool&amp; pool)
{
  pool.dalloc(ptr, size);
}
</code></pre>
<p>Der Grund ist der folgende:</p>
<pre><code class="language-cpp">class MyClass
{
public:
  MyClass()
  {
    throw std::exception(&quot;bum!&quot;);
  }
};

Pool pool;
MyClass* myObject = new (pool) MyClass();
</code></pre>
<p>Der Konstruktor wirft eine Exception. Damit der angeforderte Speicher vom placement new auch wieder sauber freigegeben wird, muss ein placement delete existieren.<br />
Wenn man das Ding übrigens manuell aufrufen will, dann geht dies nur so:</p>
<pre><code class="language-cpp">operator delete(myObject, pool);
</code></pre>
<p>hustbaer schrieb:</p>
<blockquote>
<p>sollte man mit placement new erzeugte objekte nicht auch mit placement delete wieder freigeben?</p>
</blockquote>
<p>Man hat im placement <code>delete</code> Operator allerdings keine Typinformationen mehr, daher kann man keinen Destruktor mehr aufrufen. Dies muss irgendwie davor geschehen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888947</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 27 Apr 2010 12:32:30 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Tue, 27 Apr 2010 12:56:59 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>sollte man mit placement new erzeugte objekte nicht auch mit placement delete wieder freigeben?</p>
</blockquote>
<p>Nein. Das placement new verwendet man meistens nur, um den Ctor explizit aufzurufen. Den Dtor ruft man explizit mit objekt.~Klassenname() auf.</p>
<p>Manchmal verwendet man das placement new auch, um einen Hint zu geben, zum Beispiel wer der später löschenden Thread wohl sein wird oder in der Nähe welchen anderen Speicherblocks man zu liegen kommen mag für mehr Lokalität. So ein Hint ist aber kein richtiger Piratenkodex, sondern mehr so eine Richtlinie. Und gehinteter Speicher mut mit normalem delete wieder freigegeben werden können.</p>
<p>Manchmal benutzt man placement new für memory pooling. Dann braucht man kein delete, weil der Witz ja ist, daß man, sobald die Antwort versichickt wurde, nachher den ganzen Pool wegschmeißt.</p>
<p>Statt pooling kann man's auch machen, um push_back zu beschleunigen-ersetzten ohne perfect forwarding. Leider ist bei Template-Pools der GCC dumm und kann kein placement delete. Aber mit c++0x ist der Druck nicht mehr da, sowas zu machen. Auch hier würde kein delete nötig sein, der z.B. vector das alles auch ohne delete gut managen kann.</p>
<p>Ich erinnere mich noch, daß ich dem delete auch Hints mitgeben wollte. Aber irgendwie ist da auch der Druck weg. Es gibt fettere Tricks um Speed zu machen. Und im besonderen Fall, daß man die Objektgröße haben muß, für den small object allocator, so kriegt man die zum Glück kostenlos oder zu geringeren Kosten als man es per Hand könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888963</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 27 Apr 2010 12:56:59 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Tue, 27 Apr 2010 18:15:08 GMT]]></title><description><![CDATA[<p>Achja, es gibt ja keine Placement-Delete-Expression.</p>
<p>Den Operator manuell aufzurufen hat natürlich keinen Sinn, das führt einem den Destruktor ja nicht aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889106</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 27 Apr 2010 18:15:08 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Tue, 27 Apr 2010 18:20:51 GMT]]></title><description><![CDATA[<p>Das placement delete gibt es übrigens sehr wohl (siehe &lt;new&gt;) - es macht nur nichts:</p>
<pre><code class="language-cpp">inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0()
	{	// construct array with placement at _Where
	return (_Where);
	}

inline void __CRTDECL operator delete(void *, void *) _THROW0()
	{	// delete if placement new fails
	}
</code></pre>
<p>(ausm msvc 9.0)</p>
<p>Falls das nicht vorhanden ist (aber man placement new nutzt), gibts auch mindestens ne warning - vll so gar nen error - weiß ich gar nicht mehr genau und bin auch zu faul... ^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889110</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 27 Apr 2010 18:20:51 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Destruktor on Tue, 27 Apr 2010 21:06:57 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16305">@unskilled</a>:<br />
Klar gibt's das, aber es gibt keine &quot;placement delete expression&quot; analog zu &quot;new (p1, p2, ...) T&quot;.</p>
<p>Unterschied: der (placement oder nicht) new Operator besorgt nur Speicher. Eine new Expression ruft den new Operator auf und danach den Konstruktor.</p>
<p>Analog dazu gibt der (placement oder nicht) delete Operator nur Speicher frei. Da es aber nur eine normale delete Expression gibt, nicht aber eine placement Form, kann man über eine delete Expression auch kein placement Delete machen. Wenn man es braucht, muss man erst direkt den Destruktor aufrufen und dann den passenden placement-Delete Operator.</p>
<p>Und ein placement delete Operator muss nicht nichts tun.<br />
Sinnvollerweise sollte der (void*, void*) placement delete Operator nichts tun, da der new (size_t, void*) Operator auch nichts tut.</p>
<p>Du kannst aber jederzeit einen new(size_t, MyAllocator*) Operator basteln, der über MyAllocator Speicher besorgt.<br />
Dazu solltest du dann einen placement delete Operator delete(void*, MyAllocator*) machen, der den Speicher auch wieder brav freigibt. Hier einen &quot;leeren&quot; Operator delete(void*, MyAllocator*) zu machen wäre ein grober Fehler.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a>:<br />
Mal abgesehen davon was Sinn macht oder nicht...<br />
Man kann placement new für alles mögliche verwenden. Und da gibt es durchaus Varianten wo man weder das delete einfach weglassen kann, noch das &quot;normale&quot; delete verwenden. Wo man also genau das machen muss, was eine placement delete Expression machen würde, wenn es denn eine gäbe.</p>
<p>Das nächstliegende Beispiel wäre wohl ein auf irgendwas spezialisierter Allokator, dem man ganz &quot;klassisch&quot; die freigewordenen Objekte wieder zurück geben muss.</p>
<p>Wie gesagt, mal abgesehen davon ob es Sinn macht oder nicht. Das ist wieder ein anderes Thema. (Und wie man daraus schliessen kann dass ich nicht wusste dass es keine placement delete Expression gibt, habe ich sowas auch noch nie gebraucht/verwendet).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889169</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 27 Apr 2010 21:06:57 GMT</pubDate></item></channel></rss>