<?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[Kann es sich hierbei um ein Speicherleck handeln?]]></title><description><![CDATA[<p>Ich stelle fest, dass mein Programm immer mehr Speicher verbraucht, obwohl ich keine Freigabelücke in meinem Code finden kann. Ich habe jetzt eine interessante Stelle im Code gefunden und habe eine Vermutung, bin mir aber nicht sicher ob das sein kann.</p>
<p>Ich habe eine boost::unordered_map die Pointer auf Objekte speichert. Nach einer gewissen Zeit (3 Sekunden) möchte ich die Objekte löschen. Das mache ich mit folgender Methode</p>
<pre><code class="language-cpp">void BufferedTCPConnectionTracker::cleanUpMap( int64_t now, boost::unordered_map&lt; long, ddos_packet*, boost::hash&lt;long&gt; &gt;&amp; map ) {

	std::vector&lt;long&gt; deletionMarkers;

	for( boost::unordered_map&lt;long,ddos_packet*&gt;::iterator it = map.begin(); it != map.end(); ++it ) 
		if( ( now - it-&gt;second-&gt;timestamp ) &gt;= int64_t(3000000) /*3 Sekunden*/ || it-&gt;second-&gt;marker )
			deletionMarkers.push_back(it-&gt;first);

	for( unsigned int i = 0; i &lt; deletionMarkers.size(); ++i) {
		delete map[deletionMarkers[i&rsqb;&rsqb;;
		cout &lt;&lt; map[deletionMarkers[i&rsqb;&rsqb;-&gt;getTCPSequenceNumber() &lt;&lt; endl; 
		map.erase( deletionMarkers[i] );
	}
}
</code></pre>
<p>Das Problem bei der Sache ist, dass bei dieser Methode &quot;eigentlich&quot; alles sauber gelöscht werden sollte. Mir bereitet aber die Zeile</p>
<p>delete map[deletionMarkers[i&rsqb;&rsqb;;</p>
<p>Kopfzerbrechen, denn eine Zeile darunter kann ich immer noch eine Methode von diesem Objekt in der Map aufrufen, ohne das ein Segfault auftritt. Wie kann das sein? Ist das Objekt etwa noch nicht gelöscht?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/273635/kann-es-sich-hierbei-um-ein-speicherleck-handeln</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 03:14:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/273635.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 10 Sep 2010 09:15:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kann es sich hierbei um ein Speicherleck handeln? on Fri, 10 Sep 2010 09:15:25 GMT]]></title><description><![CDATA[<p>Ich stelle fest, dass mein Programm immer mehr Speicher verbraucht, obwohl ich keine Freigabelücke in meinem Code finden kann. Ich habe jetzt eine interessante Stelle im Code gefunden und habe eine Vermutung, bin mir aber nicht sicher ob das sein kann.</p>
<p>Ich habe eine boost::unordered_map die Pointer auf Objekte speichert. Nach einer gewissen Zeit (3 Sekunden) möchte ich die Objekte löschen. Das mache ich mit folgender Methode</p>
<pre><code class="language-cpp">void BufferedTCPConnectionTracker::cleanUpMap( int64_t now, boost::unordered_map&lt; long, ddos_packet*, boost::hash&lt;long&gt; &gt;&amp; map ) {

	std::vector&lt;long&gt; deletionMarkers;

	for( boost::unordered_map&lt;long,ddos_packet*&gt;::iterator it = map.begin(); it != map.end(); ++it ) 
		if( ( now - it-&gt;second-&gt;timestamp ) &gt;= int64_t(3000000) /*3 Sekunden*/ || it-&gt;second-&gt;marker )
			deletionMarkers.push_back(it-&gt;first);

	for( unsigned int i = 0; i &lt; deletionMarkers.size(); ++i) {
		delete map[deletionMarkers[i&rsqb;&rsqb;;
		cout &lt;&lt; map[deletionMarkers[i&rsqb;&rsqb;-&gt;getTCPSequenceNumber() &lt;&lt; endl; 
		map.erase( deletionMarkers[i] );
	}
}
</code></pre>
<p>Das Problem bei der Sache ist, dass bei dieser Methode &quot;eigentlich&quot; alles sauber gelöscht werden sollte. Mir bereitet aber die Zeile</p>
<p>delete map[deletionMarkers[i&rsqb;&rsqb;;</p>
<p>Kopfzerbrechen, denn eine Zeile darunter kann ich immer noch eine Methode von diesem Objekt in der Map aufrufen, ohne das ein Segfault auftritt. Wie kann das sein? Ist das Objekt etwa noch nicht gelöscht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1950692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950692</guid><dc:creator><![CDATA[HändyÄndy]]></dc:creator><pubDate>Fri, 10 Sep 2010 09:15:25 GMT</pubDate></item><item><title><![CDATA[Reply to Kann es sich hierbei um ein Speicherleck handeln? on Fri, 10 Sep 2010 09:35:08 GMT]]></title><description><![CDATA[<p>Das nennt man undefiniertes Verhalten.</p>
<p>Dein großzügiges Benutzen von new und delete bereitet mir aber Sorge. Besonders wenn du selber zugibst, nicht besonders fit damit zu sein (sonst bräuchtest du nicht fragen). Ist das wirklich nötig? Und falls ja (was unwahrscheinlich ist): Wie wäre es mit etwas intelligenteren Pointern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1950709</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950709</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 10 Sep 2010 09:35:08 GMT</pubDate></item><item><title><![CDATA[Reply to Kann es sich hierbei um ein Speicherleck handeln? on Fri, 10 Sep 2010 09:34:18 GMT]]></title><description><![CDATA[<p>???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1950712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950712</guid><dc:creator><![CDATA[HändyÄndy]]></dc:creator><pubDate>Fri, 10 Sep 2010 09:34:18 GMT</pubDate></item><item><title><![CDATA[Reply to Kann es sich hierbei um ein Speicherleck handeln? on Fri, 10 Sep 2010 09:38:31 GMT]]></title><description><![CDATA[<p>HändyÄndy schrieb:</p>
<blockquote>
<p>???</p>
</blockquote>
<p>Du kannst Pointer dereferenzieren, auch wenn sie auf ein nicht existierendes Objekt zeigen. Das Verhalten ist dann undefiniert.</p>
<p>In der Praxis geschieht dann so etwas wie ein reinterpret_cast auf die Stelle an die der Pointer zeigt. Und da an der Stelle noch das alte Objekt liegt (da es noch nicht durch etwas anderes überschrieben wurde), kommt dabei sogar etwas sinnvolles raus, obwohl das Objekt offiziell ungültig ist. Ein delete setzt den Speicher schließlich nicht auf 0, sondern markiert nur in einer internen Tabelle den Speicherbereich als &quot;wieder zum Schreiben verfügbar&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1950716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950716</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 10 Sep 2010 09:38:31 GMT</pubDate></item><item><title><![CDATA[Reply to Kann es sich hierbei um ein Speicherleck handeln? on Fri, 10 Sep 2010 09:38:33 GMT]]></title><description><![CDATA[<p>Ja, es ist sogar absolut nötig. Beantwortet aber nicht meine ursprüngliche Frage. Wieso bekomme ich keinen Segfault wenn ich auf ein gelöschtes Objekt zugreife?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1950718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950718</guid><dc:creator><![CDATA[HändyÄndy]]></dc:creator><pubDate>Fri, 10 Sep 2010 09:38:33 GMT</pubDate></item><item><title><![CDATA[Reply to Kann es sich hierbei um ein Speicherleck handeln? on Fri, 10 Sep 2010 09:39:33 GMT]]></title><description><![CDATA[<p>Google mal nach RAII (Resource Acquisition is Initialization) und lies anschliessend das mal durch: <a href="http://www.highscore.de/cpp/boost/" rel="nofollow">Boost - Smart Pointers</a></p>
<p>Dann musst du nachher selber nix mehr mit delete machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1950719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950719</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Fri, 10 Sep 2010 09:39:33 GMT</pubDate></item><item><title><![CDATA[Reply to Kann es sich hierbei um ein Speicherleck handeln? on Fri, 10 Sep 2010 09:40:25 GMT]]></title><description><![CDATA[<p>Tja, da haben wir wohl gleichzeitig einen Beitrag geschrieben und Du warst wohle einen Tick schneller :). Danke für die Antwort.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1950721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950721</guid><dc:creator><![CDATA[HändyÄndy]]></dc:creator><pubDate>Fri, 10 Sep 2010 09:40:25 GMT</pubDate></item><item><title><![CDATA[Reply to Kann es sich hierbei um ein Speicherleck handeln? on Fri, 10 Sep 2010 09:51:57 GMT]]></title><description><![CDATA[<p>HändyÄndy schrieb:</p>
<blockquote>
<p>Ja, es ist sogar absolut nötig. Beantwortet aber nicht meine ursprüngliche Frage. Wieso bekomme ich keinen Segfault wenn ich auf ein gelöschtes Objekt zugreife?</p>
</blockquote>
<p>Weil die Speicherverwaltung nicht so exakt arbeitet. Segfault heißt (auf x86-Architektur), dass du eine Speicherseite (=Segment) angefordert hast, die dir nicht gehört. Die Speicheradresse auf die dein Pointer verweist gehört deinem Programm aber noch. delete gibt freigegebenen Speicher in der Regel nicht an das Betreibssystem zurück sondern behält ihn auf Vorrat um ihn beim nächsten new erneut benutzen zu können.</p>
<p>Das ist wie gesagt alles undefiniert, aber so läuft es in der Praxis auf den gängigen Compilern/Betriebssystemen.</p>
<p>HändyÄndy schrieb:</p>
<blockquote>
<p>Tja, da haben wir wohl gleichzeitig einen Beitrag geschrieben und Du warst wohle einen Tick schneller :). Danke für die Antwort.</p>
</blockquote>
<p>Hehe, du jetzt auch <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="🙂"
    /> . Aber doppelte Antwort hält besser <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/1950728</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950728</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 10 Sep 2010 09:51:57 GMT</pubDate></item><item><title><![CDATA[Reply to Kann es sich hierbei um ein Speicherleck handeln? on Fri, 10 Sep 2010 11:08:27 GMT]]></title><description><![CDATA[<p>Stimmt, Segfault ist natürlich die falsche Bezeichnung für mein Problem.</p>
<p>Und, wow, ich hab auf boost::shared_ptr umgestellt und es funktioniert. top sagt mir jedenfalls, dass der Speicherverbrauch nach einer gewissen Zeit defacto konstant bleibt. Super Tip! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1950780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950780</guid><dc:creator><![CDATA[HändyÄndy]]></dc:creator><pubDate>Fri, 10 Sep 2010 11:08:27 GMT</pubDate></item><item><title><![CDATA[Reply to Kann es sich hierbei um ein Speicherleck handeln? on Fri, 10 Sep 2010 11:28:43 GMT]]></title><description><![CDATA[<p>Für Zeiger innerhalb von Containern gibt es im Allgemeinen bessere Lösungen, z.B. die Bibliothek <em>Boost.PointerContainers</em>. Das Template <code>boost::ptr_unordered_map</code> ist auch dabei.</p>
<p>Nimm <code>shared_ptr</code> , wenn du tatsächlich geteilte Besitzverhältnisse hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1950795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1950795</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 10 Sep 2010 11:28:43 GMT</pubDate></item></channel></rss>