<?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[objekte löschen dauert zu lange]]></title><description><![CDATA[<pre><code class="language-cpp">for ( unsigned int i=vector.size()-1; i &gt; 0; --i ) { 
			delete vector[i];
	}	
	vector.clear();
</code></pre>
<p>Also ist so ein vector-container aus Zeigern. Deswegen muss man zuerst Objekte löschen, dann die zeiger selbst. Doch warum dauert das Löschen viel länger als das Anlegen von Objekten??? Gibt es da Tricks? Sind ja tausende von Objekte</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/245337/objekte-löschen-dauert-zu-lange</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 19:32:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/245337.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 12 Jul 2009 23:15:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to objekte löschen dauert zu lange on Sun, 12 Jul 2009 23:19:15 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">for ( unsigned int i=vector.size()-1; i &gt; 0; --i ) { 
			delete vector[i];
	}	
	vector.clear();
</code></pre>
<p>Also ist so ein vector-container aus Zeigern. Deswegen muss man zuerst Objekte löschen, dann die zeiger selbst. Doch warum dauert das Löschen viel länger als das Anlegen von Objekten??? Gibt es da Tricks? Sind ja tausende von Objekte</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1741830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741830</guid><dc:creator><![CDATA[xBlackKnightx]]></dc:creator><pubDate>Sun, 12 Jul 2009 23:19:15 GMT</pubDate></item><item><title><![CDATA[Reply to objekte löschen dauert zu lange on Sun, 12 Jul 2009 23:28:13 GMT]]></title><description><![CDATA[<p>Tricks gibts da schon, aber keiner ist universell verwendbar:</p>
<p>1. Stack statt Heap<br />
Beispiel:</p>
<pre><code class="language-cpp">IObject m_allObjects[10000];
</code></pre>
<p>Vorteile:<br />
- sehr schnell<br />
- wird automatisch freigegeben</p>
<p>Nachteile:<br />
- Größe beschränkt<br />
- verbraucht evtl. mehr Speicher als benutzt wird</p>
<p>2. Memory-Pool<br />
Dabei werden die mit <em>new</em> erstellten Objekte möglichst nicht gelöscht, sondern in einen anderen vector (o. Ä.) geschoben, um sie später erneut zu verwenden. Wird dann ein Objekt benötigt, wird eins vom vector der unbenutzten genommen und zurückgesetzt (mit einer clear-Methode oder so), oder ggf. mit <em>new</em> erstellt.</p>
<p>Vorteile:<br />
- Geschwindigkeit</p>
<p>Nachteile:<br />
- macht nur Sinn, wenn oft Objekte entfernt und später weitere gebraucht werden</p>
<p>3. &quot;Zeigerlose Elemente&quot;</p>
<pre><code class="language-cpp">vector&lt;IObject&gt; m_objects;
</code></pre>
<p>Vorteile:<br />
- könnte Zeit beim Löschen sparen (k. A. wieviel)</p>
<p>Nachteile:<br />
- Zeiger auf die Elemente sind gefährlich</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1741831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741831</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sun, 12 Jul 2009 23:28:13 GMT</pubDate></item><item><title><![CDATA[Reply to objekte löschen dauert zu lange on Mon, 13 Jul 2009 06:34:11 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>also so einfach mag ich das nicht glauben, dass das Löschen immer länger dauert als das Anlegen.<br />
Seeehr wesentlich dürfte dabei sein, was im Kon- und Destruktor getan wird.<br />
Das Betriebssystem/die Runtime hat meistens mit der Speicherfreigabe (beim Löschen) deutlich weniger zu tun als mit der Speicherreservierung (beim Erzeugen).</p>
<p>Und wenn Du Deine Zeit in Kon-/Destruktoren verbrätst, helfen Dir alle anderen Tricks auch nichts ... die werden dann eben 1000-mal aufgerufen - egal wie.<br />
Auch bei der Stackvariante - allerdings da wohl eher zu Programmstart und -ende (übrigens leider auch dann, wenn sich zuer Laufzeit herausstellt, dass die Objekte gar nicht gebraucht werden).</p>
<p>TyRoXx schrieb:</p>
<blockquote>
<p>...<br />
3. &quot;Zeigerlose Elemente&quot;</p>
<pre><code class="language-cpp">vector&lt;IObject&gt; m_objects;
</code></pre>
<p>Vorteile:<br />
- könnte Zeit beim Löschen sparen (k. A. wieviel)</p>
<p>Nachteile:<br />
- Zeiger auf die Elemente sind gefährlich</p>
</blockquote>
<p>War auch mein erster Gedanke ... allerdings werden höchstwahrscheinlich auch da die Objekte dynamisch angelegt - und wenn man es ungeschickt macht sogar deutlich öfter. Allerdings wird dabei wohl new[]/delete[] (also die Arrayvarianten genutzt) - <em>es wäre vorstellbar</em>, dass die ein wenig schneller sind als new/delete (wobei wie gesagt gar nicht sicher ist, dass die beiden das Problem sind).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1741870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741870</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 13 Jul 2009 06:34:11 GMT</pubDate></item><item><title><![CDATA[Reply to objekte löschen dauert zu lange on Mon, 13 Jul 2009 08:18:28 GMT]]></title><description><![CDATA[<p>Würde mich auch sehr wundern wenn da Zeit beim eigentlichen delete draufgeht.</p>
<p>Ich gehe mal davon aus dass du dein Problem auch im Release-Modus beobachtet hast?</p>
<p>Poste mal den Quelltext des Destruktors.</p>
<p>Was ich schon des öffteren gesehen hab ist folgendes:</p>
<pre><code class="language-cpp">~DTor()
{
   int time = time_now();

   while( ( time_now() - time ) &lt; 200 )
   {
      warte_auf_ressource();
   }
}
</code></pre>
<p>Dann warten alle Objekte auf eine Ressource (z.B. ein Mutex) welche nicht freigegeben wird weil z.B. der entsprechende Thread grad arbeitet.</p>
<p>Wenn das wirklich spürbar lange dauert kannst du dir auch mal die CPU-Last anschauen, wenn die auf 100 Prozent ist geht die Zeit wirklich für Arbeit und nicht fürs Warten drauf.</p>
<p>Ansonsten solltest du mal über TyRoXx' Vorschlag mit dem MemoryPool nachdenken.<br />
Musst du riesige Felder wirklich freigeben oder kannst du den Zugriff nicht einfach kapseln sodass nach Außen kein Unterschied besteht aber du immer auf dem selben Speicher arbeitest?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1741915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741915</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Mon, 13 Jul 2009 08:18:28 GMT</pubDate></item><item><title><![CDATA[Reply to objekte löschen dauert zu lange on Mon, 13 Jul 2009 08:29:34 GMT]]></title><description><![CDATA[<p>rean schrieb:</p>
<blockquote>
<p>Was ich schon des öffteren gesehen hab ist folgendes:</p>
<pre><code class="language-cpp">~DTor()
{
   int time = time_now();

   while( ( time_now() - time ) &lt; 200 )
   {
      warte_auf_ressource();
   }
}
</code></pre>
<p>Dann warten alle Objekte auf eine Ressource (z.B. ein Mutex) welche nicht freigegeben wird</p>
</blockquote>
<p>Hier warten alle Objekte, völlig unabhängig davon, ob irgendwelche Ressourcen freigegeben sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1741921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741921</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Mon, 13 Jul 2009 08:29:34 GMT</pubDate></item><item><title><![CDATA[Reply to objekte löschen dauert zu lange on Mon, 13 Jul 2009 08:56:26 GMT]]></title><description><![CDATA[<p>xBlackKnightx schrieb:</p>
<blockquote>
<pre><code class="language-cpp">for ( unsigned int i=vector.size()-1; i &gt; 0; --i ) {
  delete vector[i];
}	
vector.clear();
</code></pre>
</blockquote>
<p>Rückwärts mit unsigned int zählen ist gar nicht so einfach. <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="😉"
    /><br />
Hier vergisst Du das erste Element (i==0). Wenn Du aber die Schleife nach</p>
<pre><code class="language-cpp">for ( unsigned int i=vector.size()-1; i &gt;= 0; --i ) {
  delete vector[i];
}
</code></pre>
<p>abänderst, wird es eine Endlosschleife, da ein unsigned int ja nie negativ werden kann. Es müsste aber so gehen:</p>
<pre><code class="language-cpp">for ( unsigned int i=vector.size(); i&gt;0;) {
  --i;
  delete vector[i];
}
</code></pre>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1741935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741935</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Mon, 13 Jul 2009 08:56:26 GMT</pubDate></item><item><title><![CDATA[Reply to objekte löschen dauert zu lange on Mon, 13 Jul 2009 09:37:37 GMT]]></title><description><![CDATA[<p>Verwende doch einen Iterator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1741961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741961</guid><dc:creator><![CDATA[Iterator0r]]></dc:creator><pubDate>Mon, 13 Jul 2009 09:37:37 GMT</pubDate></item><item><title><![CDATA[Reply to objekte löschen dauert zu lange on Mon, 13 Jul 2009 09:59:06 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Rückwärts mit unsigned int zählen ist gar nicht so einfach.</p>
</blockquote>
<p>Ich glaube, daß es im vorliegenden Fall keinen Grund gibt, den Vektor von hinten nach vorne zu bearbeiten ...<br />
Also einfach:</p>
<pre><code class="language-cpp">for(unsigned int i = 0; i &lt; vector.size(); ++i)
   delete vector[i];
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1741977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741977</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Mon, 13 Jul 2009 09:59:06 GMT</pubDate></item><item><title><![CDATA[Reply to objekte löschen dauert zu lange on Mon, 13 Jul 2009 11:44:05 GMT]]></title><description><![CDATA[<p>huch, es liegt wirklich an der for-schleife</p>
<p>also der zusammenhang mit der rückwärtszählung und unsigned int?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742057</guid><dc:creator><![CDATA[xBlackKnightx]]></dc:creator><pubDate>Mon, 13 Jul 2009 11:44:05 GMT</pubDate></item><item><title><![CDATA[Reply to objekte löschen dauert zu lange on Mon, 13 Jul 2009 11:46:37 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Tricks gibts da schon, aber keiner ist universell verwendbar:</p>
<p>[u]3. &quot;Zeigerlose Elemente&quot;</p>
<pre><code class="language-cpp">vector&lt;IObject&gt; m_objects;
</code></pre>
<p>Vorteile:<br />
- könnte Zeit beim Löschen sparen (k. A. wieviel)</p>
<p>Nachteile:<br />
- Zeiger auf die Elemente sind gefährlich</p>
</blockquote>
<p>die dritte Variante wollt ich nehmen aber es hat bereits zu tiefe Wurzeln und umbauen folgt mit vielen Fehlern naja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742058</guid><dc:creator><![CDATA[xBlackKnightx]]></dc:creator><pubDate>Mon, 13 Jul 2009 11:46:37 GMT</pubDate></item><item><title><![CDATA[Reply to objekte löschen dauert zu lange on Mon, 13 Jul 2009 11:48:31 GMT]]></title><description><![CDATA[<blockquote>
<p>huch, es liegt wirklich an der for-schleife</p>
</blockquote>
<p>Und wie kommst du darauf? Oder duerfen wir wild weiterraten ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742059</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 13 Jul 2009 11:48:31 GMT</pubDate></item><item><title><![CDATA[Reply to objekte löschen dauert zu lange on Mon, 13 Jul 2009 12:19:53 GMT]]></title><description><![CDATA[<p>xBlackKnightx schrieb:</p>
<blockquote>
<p>huch, es liegt wirklich an der for-schleife</p>
<p>also der zusammenhang mit der rückwärtszählung und unsigned int?</p>
</blockquote>
<p>Kann gut sein. Auf die Schnelle würde ich sagen, wenn Du nur ein Element im Vektor hast und dann diese Schleife beginnst, läufst Du genau in die von Sebastian Pizer aufgezeigte Falle ...<br />
Allerdings würde dann wohl das Programm eher abstürzen, als so lange zu laufen ...<br />
Wie dem auch sei, es gibt keinen (ersichtlichen) Grund, den Vektor von hinten nach vorne zu durchlaufen, und vielleicht kannst Du auch einen signed int als Schleifenzähler nehmen? Dann könntest Du bei Deiner Methode bleiben und 'i &lt; 0' als Abbruchbedingung nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742081</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Mon, 13 Jul 2009 12:19:53 GMT</pubDate></item><item><title><![CDATA[Reply to objekte löschen dauert zu lange on Mon, 13 Jul 2009 12:56:05 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Rückwärts mit unsigned int zählen ist gar nicht so einfach. <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="😉"
    /><br />
Hier vergisst Du das erste Element (i==0). Wenn Du aber die Schleife nach</p>
<pre><code class="language-cpp">for ( unsigned int i=vector.size()-1; i &gt;= 0; --i ) {
  delete vector[i];
}
</code></pre>
<p>abänderst, wird es eine Endlosschleife, da ein unsigned int ja nie negativ werden kann. Es müsste aber so gehen:</p>
<pre><code class="language-cpp">for ( unsigned int i=vector.size(); i&gt;0;) {
  --i;
  delete vector[i];
}
</code></pre>
</blockquote>
<p>Wenn's auf der Plattform einen typischen Underflow gibt<br />
<code>assert( size_t(0)-1 == std::numeric_limits&lt;size_t&gt;::max() );</code><br />
, geht auch<br />
<code>for ( size_t i=vector.size()-1; i&lt;vector.size(); --i )</code><br />
.</p>
<p>PS: Unter der Voraussetzung <code>vector.size() &lt; std::numeric_limits&lt;size_t&gt;::max()-1</code></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742094</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Mon, 13 Jul 2009 12:56:05 GMT</pubDate></item><item><title><![CDATA[Reply to objekte löschen dauert zu lange on Mon, 13 Jul 2009 12:59:31 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Wenn's auf der Plattform einen typischen Underflow gibt [...]</p>
</blockquote>
<p>Das sollte für <code>unsigned</code> -Typen doch garantiert sein, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742097</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 13 Jul 2009 12:59:31 GMT</pubDate></item><item><title><![CDATA[Reply to objekte löschen dauert zu lange on Mon, 13 Jul 2009 13:04:09 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Badestrand schrieb:</p>
<blockquote>
<p>Wenn's auf der Plattform einen typischen Underflow gibt [...]</p>
</blockquote>
<p>Das sollte für <code>unsigned</code> -Typen doch garantiert sein, oder?</p>
</blockquote>
<p>Keine Ahnung, bin nicht so fit mit dem Standard <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="🙂"
    /> Ich schlag mal in einem neueren Draft nach..</p>
<p>edit: Finde nichts dazu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742098</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Mon, 13 Jul 2009 13:04:09 GMT</pubDate></item><item><title><![CDATA[Reply to objekte löschen dauert zu lange on Mon, 13 Jul 2009 13:29:07 GMT]]></title><description><![CDATA[<p>C++ Standard 14882:2003 - 3.9.1 Fundamental types - Abschnitt 4 schrieb:</p>
<blockquote>
<p>Unsigned integers, declared unsigned, shall obey the laws of arithmetic modulo 2<sup>n</sup> where n is the number of bits in the value representation of that particular size of integer.</p>
</blockquote>
<p><a href="http://en.wikipedia.org/wiki/Modular_arithmetic" rel="nofollow">http://en.wikipedia.org/wiki/Modular_arithmetic</a></p>
<p>Also würde ich sagen, dass es sehr genau definiert ist, nicht? Zu Overflow steht es sogar unten explizit als Notiz. Explizit zu Underflow steht allerdings nichts, sollte aber eigentlich aus der Definition hervorgehen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742128</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 13 Jul 2009 13:29:07 GMT</pubDate></item></channel></rss>