<?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[Vector zerstören]]></title><description><![CDATA[<p>Wie zerstöre ich ordnungsgemäß einen Vector? Ich sehe da was von ~vector(), also</p>
<p>myVector.~vector()</p>
<p>Sieht etwas komisch aus, er meckert aber nicht rum. Ist das der rictige Weg?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/153856/vector-zerstören</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 15:02:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/153856.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 21 Jul 2006 09:23:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vector zerstören on Fri, 21 Jul 2006 09:23:13 GMT]]></title><description><![CDATA[<p>Wie zerstöre ich ordnungsgemäß einen Vector? Ich sehe da was von ~vector(), also</p>
<p>myVector.~vector()</p>
<p>Sieht etwas komisch aus, er meckert aber nicht rum. Ist das der rictige Weg?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101657</guid><dc:creator><![CDATA[JPSelter]]></dc:creator><pubDate>Fri, 21 Jul 2006 09:23:13 GMT</pubDate></item><item><title><![CDATA[Reply to Vector zerstören on Fri, 21 Jul 2006 09:30:50 GMT]]></title><description><![CDATA[<p>Nein. Wenn der vector auf dem Stack allokiert wurde (wohl der Normalfall) wird er im Allgemeinen automatisch zerstört, wenn der Scope verlassen wird (also bei der schließenden Klammer }). Wenn du den Vektor dynamisch mit new allokiert hast, dann musst du ihn auch manuell mit delete löschen. In beiden Fällen wird der Destruktor automatisch aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101658</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Fri, 21 Jul 2006 09:30:50 GMT</pubDate></item><item><title><![CDATA[Reply to Vector zerstören on Fri, 21 Jul 2006 09:31:30 GMT]]></title><description><![CDATA[<p>Destructoren dürfen nicht explizit aufgerufen werden.<br />
Mach es besser über delete myVector, wenn Du ihn dynamisch angelegt hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101659</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Fri, 21 Jul 2006 09:31:30 GMT</pubDate></item><item><title><![CDATA[Reply to Vector zerstören on Fri, 21 Jul 2006 09:33:33 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>1310-Logik schrieb:</p>
<blockquote>
<p>Destructoren dürfen nicht explizit aufgerufen werden.<br />
Mach es besser über delete myVector, wenn Du ihn dynamisch angelegt hast.</p>
</blockquote>
<p>Man darf sie wirklich nicht aufrufen? Ich dachte, dass das nur unüblich sei.</p>
<p>chrische</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101661</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 21 Jul 2006 09:33:33 GMT</pubDate></item><item><title><![CDATA[Reply to Vector zerstören on Fri, 21 Jul 2006 09:36:56 GMT]]></title><description><![CDATA[<p>Ich habe ihn am Anfang einer Funktion deklariert:</p>
<pre><code class="language-cpp">vector&lt;double&gt; myVector;
</code></pre>
<p>Also brauche ich am Ende nichts machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101665</guid><dc:creator><![CDATA[JPSelter]]></dc:creator><pubDate>Fri, 21 Jul 2006 09:36:56 GMT</pubDate></item><item><title><![CDATA[Reply to Vector zerstören on Fri, 21 Jul 2006 09:37:21 GMT]]></title><description><![CDATA[<p>Ich auch. Ich denke man darf sie schon aufrufen (es sind schließlich &quot;nur&quot; Methoden), nur das Objekt danach nicht mehr benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101666</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Fri, 21 Jul 2006 09:37:21 GMT</pubDate></item><item><title><![CDATA[Reply to Vector zerstören on Fri, 21 Jul 2006 09:39:06 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>JPSelter schrieb:</p>
<blockquote>
<p>Ich habe ihn am Anfang einer Funktion deklariert:</p>
<pre><code class="language-cpp">vector&lt;double&gt; myVector;
</code></pre>
<p>Also brauche ich am Ende nichts machen?</p>
</blockquote>
<p>Nein du musst nichts machen. Der D'tor wird wie bei jeder anderen Klasse aufgerfuen, wenn der scope verlassen wird.</p>
<p>.filmor schrieb:</p>
<blockquote>
<p>Ich auch. Ich denke man darf sie schon aufrufen (es sind schließlich &quot;nur&quot; Methoden), nur das Objekt danach nicht mehr benutzen.</p>
</blockquote>
<p>So dachte ich mir das auch.</p>
<p>chrische</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101669</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 21 Jul 2006 09:39:06 GMT</pubDate></item><item><title><![CDATA[Reply to Vector zerstören on Fri, 21 Jul 2006 09:39:54 GMT]]></title><description><![CDATA[<p>chrische5 schrieb:</p>
<blockquote>
<p>Hallo</p>
<p>1310-Logik schrieb:</p>
<blockquote>
<p>Destructoren dürfen nicht explizit aufgerufen werden.<br />
Mach es besser über delete myVector, wenn Du ihn dynamisch angelegt hast.</p>
</blockquote>
<p>Man darf sie wirklich nicht aufrufen? Ich dachte, dass das nur unüblich sei.</p>
<p>chrische</p>
</blockquote>
<p>Naja was heisst dürfen?<br />
Man darf auch Memoryleaks machen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101670</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Fri, 21 Jul 2006 09:39:54 GMT</pubDate></item><item><title><![CDATA[Reply to Vector zerstören on Fri, 21 Jul 2006 09:45:01 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>1310-Logik schrieb:</p>
<blockquote>
<p>chrische5 schrieb:</p>
<blockquote>
<p>Hallo</p>
<p>1310-Logik schrieb:</p>
<blockquote>
<p>Destructoren dürfen nicht explizit aufgerufen werden.<br />
Mach es besser über delete myVector, wenn Du ihn dynamisch angelegt hast.</p>
</blockquote>
<p>Man darf sie wirklich nicht aufrufen? Ich dachte, dass das nur unüblich sei.</p>
<p>chrische</p>
</blockquote>
<p>Naja was heisst dürfen?<br />
Man darf auch Memoryleaks machen...</p>
</blockquote>
<p>Für mich &quot;nicht dürfen&quot;, dass es entweder gar nicht geht, oder zu undefinierten Verhalten führt und das ist doch nicht zwangsläufig so, wenn man den D'tor aufrufst oder täusche ich mich da.</p>
<p>chrische</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101674</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 21 Jul 2006 09:45:01 GMT</pubDate></item><item><title><![CDATA[Reply to Vector zerstören on Fri, 21 Jul 2006 09:46:56 GMT]]></title><description><![CDATA[<p>Das ist was anderes. Memoryleaks sind ein Fehler des Programmierers, der nicht vom Compiler geahndet wird, weil trotzdem alles legales C++ sein sollte. Ein expliziter Destruktoraufruf dagegen wäre, wenn es illegal wäre, undefiniertes Verhalten.<br />
Aber ich denke schon, dass es geht, schließlich kann man ja auch iirc einen Konstruktor explizit auf Speicherbereiche aufrufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101675</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Fri, 21 Jul 2006 09:46:56 GMT</pubDate></item><item><title><![CDATA[Reply to Vector zerstören on Fri, 21 Jul 2006 09:51:17 GMT]]></title><description><![CDATA[<p>Einfach nur meine Frage beantworten bitte <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>EDIT: Oh, war beantwortet. Seid ja alle fleissig am schreiben <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/1101676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101676</guid><dc:creator><![CDATA[JPSelter]]></dc:creator><pubDate>Fri, 21 Jul 2006 09:51:17 GMT</pubDate></item><item><title><![CDATA[Reply to Vector zerstören on Fri, 21 Jul 2006 09:51:34 GMT]]></title><description><![CDATA[<p>Es sind wirklich sehr spezielle Fälle, in denen der Destruktor explizit aufgerufen wird. Die STL macht davon gebrauch, aber ich empfehle es sonst niemanden.</p>
<p>Selbst wenn man nach dem Aufruf das Objekt nicht mehr benutzt, hat man ein Problem. Wenn der Speicher frei gegeben wird, ruft der Compiler des Destruktor noch mal auf, was in der Regel schief läuft.</p>
<p>Ein expliziter Destruktoraufruf gibt den Speicher nicht frei.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">{
  MyClass myObject;
  myObject.~MyClass();  // hier wird der Destruktor explizit aufgerufen
}  // hier verläßt myObject seinen Scope, was bewirkt, daß der Destruktor noch mal aufgerufen wird und dann der Speicher frei gegeben wird
</code></pre>
<p>Und jetzt das ganze auf dem Heap:</p>
<pre><code class="language-cpp">{
  MyClass* myObjectPtr = new MyClass();
  myObjectPtr-&gt;~MyClass(); // des Destruktor wird aufgerufen, aber der Speicher wird nicht frei gegeben!
  delete myObjectPtr; // der Destruktor wird nochmals aufgerufen und dann der Speicher frei gegeben
}
</code></pre>
<p>Lasse ich das &quot;delete myObjectPtr&quot; weg, wird zwar der Destruktor aufgerufen, aber es bleibt ein Memoryleak! <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="😞"
    /></p>
<p>Hier wird es richtig gemacht (denke ich - ich würde so etwas nie machen):</p>
<pre><code class="language-cpp">{
  MyClass* myObjectPtr = (MyClass*)malloc(sizeof(MyClass));
  myObjectPtr-&gt;MyClass(); // Konstuktor aufrufen
  myObjectPtr-&gt;~MyClass(); // Destruktor aufrufen
  free(myObjectPtr); // und Speicher wieder frei geben
}
</code></pre>
<p>Ich hoffe, daß das letzte Beispiel auch den letzten davon abschreckt, den Destruktor explizit aufrufen zu wollen <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>Tntnet</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101677</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Fri, 21 Jul 2006 09:51:34 GMT</pubDate></item><item><title><![CDATA[Reply to Vector zerstören on Fri, 21 Jul 2006 09:54:21 GMT]]></title><description><![CDATA[<p>Man kann (muss imho sogar) den Destruktor selbst aufrufen wenn man die Instanz mit Placement-new erzeugt hat, z.B. weil man einen 100 char großen Speicherbereich allokiert und dort 10 x 10 Byte Objekte angelegt hat. Hier müsste man zum Schluss 10x den Destruktor aufrufen und dann die 100 Byte am Stück wieder deallokieren.</p>
<pre><code class="language-cpp">#include &lt;new&gt;

struct X { int y; };

int main(int argc, char* argv[])
{
	char mem[100];
	X *ary = (X*) mem;
	new (ary + 0) X;
	new (ary + 1) X;
	new (ary + 2) X;
	/* ... */

	/* delete[] ary geht schlecht, da der Speicher auf dem Stack liegt */
	(ary + 0)-&gt;~X();
	(ary + 1)-&gt;~X();
	(ary + 2)-&gt;~X();
	/* ... */
}
</code></pre>
<p>EDIT:<br />
Zu lahm <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/1101678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101678</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 21 Jul 2006 09:54:21 GMT</pubDate></item><item><title><![CDATA[Reply to Vector zerstören on Fri, 21 Jul 2006 09:53:31 GMT]]></title><description><![CDATA[<p>Mein erster Post hat doch alles beantwortet?! Nochmal, du musst nichts tun, das Objekt wird am Ende des Gültigkeitsbereiches automatisch zerstört und der Speicherplatz freigegeben. Nur wenn du das Objekt mit new allokiert hast musst du es manuell mit delete wieder freigeben.</p>
<p>/edit. Mkay, zu spät ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101679</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Fri, 21 Jul 2006 09:53:31 GMT</pubDate></item><item><title><![CDATA[Reply to Vector zerstören on Fri, 21 Jul 2006 11:25:14 GMT]]></title><description><![CDATA[<p>Nur als Berichtigung. Wie LordJaxom schon sagte braucht man direkte Destruktor-Aufrufe bei Objekterzeugung durch placement new. Deswegen muß man bei tntnets Code den Konstruktor-Aufruf (der so nicht funktionieren würde) auch durch ein placement new ersetzen.<br />
Also:</p>
<pre><code class="language-cpp">MyClass* myObjectPtr = (MyClass*)malloc(sizeof(MyClass));
  new (myObjectPtr) MyClass(); // Konstuktor über placement new aufrufen
  myObjectPtr-&gt;~MyClass(); // Destruktor aufrufen
  free(myObjectPtr); // und Speicher wieder frei geben
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1101747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101747</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 21 Jul 2006 11:25:14 GMT</pubDate></item></channel></rss>