<?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[Ruft map::erease den Destruktor auf?]]></title><description><![CDATA[<p>Wie der Titel schon sagt: ruft map::erease den Destruktor des zu löschenden Objektes auf? Wenn ja, kann man das irgendwie verhindern? Denn bei meinem Destruktor entfernt er das eigene Objekt selbst aus einer Map und das passiert irgenwie in ner Endlosschleife <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/177910/ruft-map-erease-den-destruktor-auf</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 06:37:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/177910.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Apr 2007 10:18:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ruft map::erease den Destruktor auf? on Thu, 05 Apr 2007 10:18:36 GMT]]></title><description><![CDATA[<p>Wie der Titel schon sagt: ruft map::erease den Destruktor des zu löschenden Objektes auf? Wenn ja, kann man das irgendwie verhindern? Denn bei meinem Destruktor entfernt er das eigene Objekt selbst aus einer Map und das passiert irgenwie in ner Endlosschleife <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259898</guid><dc:creator><![CDATA[Dr. C++]]></dc:creator><pubDate>Thu, 05 Apr 2007 10:18:36 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft map::erease den Destruktor auf? on Thu, 05 Apr 2007 10:42:51 GMT]]></title><description><![CDATA[<p>ja, bei erase werden die gespeicherten objekte ordungsgemäß zerstört sprich deren konstruktor aufgerufen. Gilt auch für Pointer. Allerdings wird hier natürlich nur der Pointer zerstört, nicht jedoch das Objekt auf das er verweist. Diese muessen zuvor &quot;per Hand&quot; mit delete aus dem Speicher entfernt werden.<br />
Wenn du also lediglich die Adressen auf die zu speichernden Objekte in deiner map speicherst, dann wird bei &quot;map.erase()&quot; lediglich die Adressinfo, nicht aber das Objekt gelöscht. Das koennte also eine Möglichkeit für dein Problem darstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259912</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Thu, 05 Apr 2007 10:42:51 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft map::erease den Destruktor auf? on Thu, 05 Apr 2007 11:29:08 GMT]]></title><description><![CDATA[<p>muffmolch schrieb:</p>
<blockquote>
<p>...Allerdings wird hier natürlich nur der Pointer zerstört, nicht jedoch das Objekt auf das er verweist....</p>
</blockquote>
<p>und das ist auch gut so <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 />
schließlich weiß die map ja nicht, ob es da Zeiger auf Heap- oder Stackobjekte in der Hand hält. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259951</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 05 Apr 2007 11:29:08 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft map::erease den Destruktor auf? on Thu, 05 Apr 2007 12:52:25 GMT]]></title><description><![CDATA[<p>Ein anderes Problem: folgender Code:</p>
<pre><code class="language-cpp">this-&gt;p_Server-&gt;mConnections.erase(GetCurrentThreadId());
</code></pre>
<p>Funktioniert bei mir bei der normalen Ausführung nur 1 mal, beim 2. mal nicht mehr, und beim Debugging crasht das Proggy gleich beim ersten mal(Visual C++ zeigt an, dass er in der Funktion equal_range() crasht).<br />
Das zu löschende Objekt existiert 100% prozentig(hab die Thread-IDs vorher 2 mal(1 mal beim anlegen des Objektes und 1 mal vor dem entfernen) ausgeben lassen und sie sind identisch).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260032</guid><dc:creator><![CDATA[Dr. C++]]></dc:creator><pubDate>Thu, 05 Apr 2007 12:52:25 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft map::erease den Destruktor auf? on Thu, 05 Apr 2007 13:46:44 GMT]]></title><description><![CDATA[<p>also: erase löscht ALLE elemente zu dem key (bei multimaps kann es ja zu einem schlüssel mehrere elemente geben).<br />
du verwendest vermutlich aber ne stl::map, sprich ein key-&gt;ein element.<br />
dabei ist erase unkritisch.<br />
mach doch mal folgendes:</p>
<pre><code class="language-cpp">std::cout&lt;&lt;this-&gt;p_Server-&gt;mConnections.erase(GetCurrentThreadId())&lt;&lt;std::endl;
</code></pre>
<p>dann siehst du ob prinzipiell ein element gefunden wurde.<br />
der Fehler wird so wie es aussieht nichts mit der map zu tun haben, sondern mit den darin enthaltenen &quot;threads&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260106</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Thu, 05 Apr 2007 13:46:44 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft map::erease den Destruktor auf? on Thu, 05 Apr 2007 14:48:26 GMT]]></title><description><![CDATA[<p>Der &quot;Fehler&quot; besteht darin, dass das Programm mit dem Aufruf der Funktion crasht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260192</guid><dc:creator><![CDATA[Dr. C++]]></dc:creator><pubDate>Thu, 05 Apr 2007 14:48:26 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft map::erease den Destruktor auf? on Thu, 05 Apr 2007 19:11:22 GMT]]></title><description><![CDATA[<p>Gib mal ein bisschen Kontext.<br />
Davon abgesehen: wenn erase crasht ... dann wirds wohl gröber was haben. erase selbst kann man eigentlich nicht mit Parametern füttern die zu einem Absturz führen könnte, d.h. höchstens die Destruktoren die dann laufen könnten den Absturz verursachen, oder er ist evtl. schon verursacht worden bevor erase läuft, Speicher überschrieben oder sowas.</p>
<p>Andere sache: da du offensichtlich mit Threads arbeitest: synchronisierst du auch brav alle Zugriffe auf diese map (und andere gemeinsam genutzte Daten)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260352</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 05 Apr 2007 19:11:22 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft map::erease den Destruktor auf? on Thu, 05 Apr 2007 19:24:37 GMT]]></title><description><![CDATA[<p>Also, ich schreib grad eine Art &quot;Server-Engine&quot;, in der alle Verbindungen und der ganze socket-Kram in einer Klasse gemanaged werden. Die einzelnen Verbindungen werden wiederrum in einer eigenen Klasse gemanaged. Die ganzen Verbindungen werden dann in einer Map abgelegt und als Index dient die Thread-ID des Threads, der für die Verbindung &quot;zuständig&quot; ist. Nun wird, wenn Thread, der zuständig ist, &quot;fertig&quot; ist, die Verbindung dazu über delete connection; gelöscht. Im Destruktor von connection wiederrum trägt sich die Verbindung eigenhändig aus der Sammel-Map vom Server aus.<br />
Das komische ist jetzt, dass das ganze bei der 1. Verbindung problemlos funzt und bei der 2. Verbindung bis vor mConnections.erase() im Destruktor kommt(vor map::erase funktioniert noch eine Ausgabe mit printf).</p>
<p>Wegen der Synchronisierung: so wie der Code gebaut ist, kommen nie ein 2 Zugriffe gleichzeitig zustande.</p>
<p>Edit: Hab grad rausgefunden, dass map::erase bei 1. mal zwar nicht crasht aber auch nich die Verbindung löscht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260356</guid><dc:creator><![CDATA[Dr. C++]]></dc:creator><pubDate>Thu, 05 Apr 2007 19:24:37 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft map::erease den Destruktor auf? on Thu, 05 Apr 2007 20:23:23 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>kenne mich damit nicht besonders gut in dem Thema aus, aber: Bist Du sicher, dass diese &quot;Connections&quot; das Kopieren überstehen ? Immerhin wird in eine map hinein und &quot;drin herum&quot; einiges kopiert ...</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260373</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 05 Apr 2007 20:23:23 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft map::erease den Destruktor auf? on Fri, 06 Apr 2007 11:30:21 GMT]]></title><description><![CDATA[<p>Die Map sieht so hier aus:</p>
<pre><code class="language-cpp">map&lt;unsigned long, IServerConnection*&gt; mConnections
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Da drin gibt es nur Pointer auf die Connections. Das komische ist ja, dass alles einwandfrei funktioniert, nur das löschen nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260551</guid><dc:creator><![CDATA[Dr. C++]]></dc:creator><pubDate>Fri, 06 Apr 2007 11:30:21 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft map::erease den Destruktor auf? on Fri, 06 Apr 2007 11:55:50 GMT]]></title><description><![CDATA[<p>Steht <strong>this-&gt;p_Server-&gt;mConnections.erase(GetCurrentThreadId());</strong> in dem Destruktor, von Connection der aufgerufen wird, wenn du delete connection machst? (ich nehme mal an ja, aber möchte sicher gehen, dass ich deine funktionsweise richtig verstanden hab).</p>
<p>Hat IServerConnection einen virtuellen Destruktor?</p>
<p>Wenn das Löschen nicht funktioniert, dann liegt das aber definitiv nicht an der map, weil hier nur mit einfachen Typen gearbeitet wird und nicht mit deinen Objekten. Ich vermute daher stark, dass der Speicher bis zum Löschen schon längst nicht mehr gültig ist und es deshalb zum Absturz kommt (dass es im Debugger direkt crasht spricht ebenfalls stark dafür).</p>
<p>Zeigt this-&gt;p_server auch ganz sicher auf gültigen Speicher (schau mal im Debugger)?</p>
<p>Ist this bzw. das connection-Objekt bei dem delete connection Aufruf auch nur wirklich existent?</p>
<p>Auch wenn (theoretisch) keine 2 Zugriffe auf die map statt finden können, pack die Zugriffe da doch zur Sicherheit mal in ne critical section um auch ganz sicher zu gehen, dass es das wirklich nicht ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260577</guid><dc:creator><![CDATA[lolz]]></dc:creator><pubDate>Fri, 06 Apr 2007 11:55:50 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft map::erease den Destruktor auf? on Fri, 06 Apr 2007 12:05:08 GMT]]></title><description><![CDATA[<p>Verdammt bin ich blöd! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Ich hab in jeder den beiden Klassen(Connection und Instance Template) folgendes stehen:</p>
<pre><code class="language-cpp">friend IServer;
    IServer* p_Server;
</code></pre>
<p>Hab aber den Pointer für p_Server nur beim Instance Template mitgegeben und bei der Connection völlig vergessen.<br />
Vielen Dank für den Denkanstoß!</p>
<p>Nochmal wegen der Synchronisierung: werd ich noch machen, nicht dass ich dann wieder mit so nem dummen Problem hierher gerannt komme <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260585</guid><dc:creator><![CDATA[Dr. C++]]></dc:creator><pubDate>Fri, 06 Apr 2007 12:05:08 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft map::erease den Destruktor auf? on Fri, 06 Apr 2007 18:27:00 GMT]]></title><description><![CDATA[<p>Dr. C++ schrieb:</p>
<blockquote>
<p>Die Map sieht so hier aus:</p>
<pre><code class="language-cpp">map&lt;unsigned long, IServerConnection*&gt; mConnections
</code></pre>
<p>...</p>
</blockquote>
<p>Ok, das wusste ich nicht.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260837</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 06 Apr 2007 18:27:00 GMT</pubDate></item></channel></rss>