<?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[Garbage Collector]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich muß einen Garbage Collector schreiben.<br />
Wenn man von dieser Klasse ableitet,<br />
dann sollen durch einen funktionfaufruf alle mit new erzeugten Klassen zerstört werden, welche zuvor nich mit delete zerstört worden sind.<br />
Dies geschieht dadurch , dass ich in der Garbage Collector Klasse die operatoren new new[] delete delete[] überschreibe, und die<br />
so erhaltenen Pointer zwischenspeichere, oder bei einem Delete wieder aus der Liste nehme.</p>
<pre><code class="language-cpp">void *GarbageCollect::operator new(size_t size)throw()
{
  if(void* ptr=malloc(size))
  {
    static_cast&lt;GarbageCollect*&gt;(ptr)-&gt;this_ptr.insert(ptr);
    return ptr;
  }
  return NULL;
}
</code></pre>
<p>Das delete gibt dann den Speicher mit free wieder frei.<br />
Ich frag mich nun, woher kennt free die größe des frei zu gebenden Speichers ???</p>
<p>Gruß Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272754/garbage-collector</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 15:44:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272754.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 24 Aug 2010 12:48:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 12:48:46 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich muß einen Garbage Collector schreiben.<br />
Wenn man von dieser Klasse ableitet,<br />
dann sollen durch einen funktionfaufruf alle mit new erzeugten Klassen zerstört werden, welche zuvor nich mit delete zerstört worden sind.<br />
Dies geschieht dadurch , dass ich in der Garbage Collector Klasse die operatoren new new[] delete delete[] überschreibe, und die<br />
so erhaltenen Pointer zwischenspeichere, oder bei einem Delete wieder aus der Liste nehme.</p>
<pre><code class="language-cpp">void *GarbageCollect::operator new(size_t size)throw()
{
  if(void* ptr=malloc(size))
  {
    static_cast&lt;GarbageCollect*&gt;(ptr)-&gt;this_ptr.insert(ptr);
    return ptr;
  }
  return NULL;
}
</code></pre>
<p>Das delete gibt dann den Speicher mit free wieder frei.<br />
Ich frag mich nun, woher kennt free die größe des frei zu gebenden Speichers ???</p>
<p>Gruß Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943789</guid><dc:creator><![CDATA[AlexanderKiebler]]></dc:creator><pubDate>Tue, 24 Aug 2010 12:48:46 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 13:15:02 GMT]]></title><description><![CDATA[<p>AlexanderKiebler schrieb:</p>
<blockquote>
<p>Ich muß einen Garbage Collector schreiben.</p>
</blockquote>
<p>So ein Unfug. Sag dem Auftraggeber, er soll programmieren lernen und sich RAII anschauen.</p>
<p>AlexanderKiebler schrieb:</p>
<blockquote>
<p>Ich frag mich nun, woher kennt free die größe des frei zu gebenden Speichers ???</p>
</blockquote>
<p>free speichert selber die Größe. Aber vielleicht nicht aufs Byte genau. Gerade genug, um den Speicher wieder freigeben zu können. Wobei der Speicher auch ein bißchen zu viel gewesen sein könnte, das ist in C ja keine Schande.<br />
Genauer kriegste die Größe von delete. Und das weiß es vom zu löschenden Typen. Wobei gerne ein wenig Größeninformation in die vtbl geschrieben werdne darf. Der Compilerbauer hat viele Möglichkeiten, Compilermagie einzubauen, die wir nicht erreichen können. Du benutzt dazu doch den operator delete(void*,size_t) für diese Schnapsidee? Falls nicht, solltest Du ernsthaft darüber nachdenken, falls die Größe für Dich von interesse ist. Sollte aber gar nicht von Interesse sein, außer Du baust auch small object allocators oder so. Obwohl, wer einen GC bauen will, der will auch einen Schutzbereich dranhängen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943798</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 24 Aug 2010 13:15:02 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 13:16:42 GMT]]></title><description><![CDATA[<p>AlexanderKiebler schrieb:</p>
<blockquote>
<p>Ich muß einen Garbage Collector schreiben.</p>
</blockquote>
<p>Aha. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>AlexanderKiebler schrieb:</p>
<blockquote>
<p>Wenn man von dieser Klasse ableitet,<br />
dann sollen durch einen funktionfaufruf alle mit new erzeugten Klassen zerstört werden, welche zuvor nich mit delete zerstört worden sind.</p>
</blockquote>
<p><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>
<p>AlexanderKiebler schrieb:</p>
<blockquote>
<p>Dies geschieht dadurch , dass ich in der Garbage Collector Klasse die operatoren new new[] delete delete[] überschreibe, und die<br />
so erhaltenen Pointer zwischenspeichere, oder bei einem Delete wieder aus der Liste nehme.</p>
</blockquote>
<p>new[] und delete[] soll man doch gar nicht benutzen, da zu &quot;low level&quot;. Stephan T. Lavavej hat das mal als nette Daumenregel <a href="http://blogs.msdn.com/b/vcblog/archive/2010/08/13/video-introduction-to-the-stl-part-3.aspx" rel="nofollow">hier</a> formuliert:<br />
Nacktes new/delete sollte man zugunsten von shared_ptr und unique_ptr vermeiden.<br />
Nacktes new[]/delete[] sollte man zugunsten der Standardcontainer vermeiden.</p>
<p>Gut, shared_ptr/unique_ptr sind noch nicht offizieller Bestandteil des C++ Standards. Aber das wird noch.</p>
<p>AlexanderKiebler schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void *GarbageCollect::operator new(size_t size)throw()
{
  if(void* ptr=malloc(size))
  {
    static_cast&lt;GarbageCollect*&gt;(ptr)-&gt;this_ptr.insert(ptr);
    return ptr;
  }
  return NULL;
}
</code></pre>
</blockquote>
<p>Herzlichen Glückwunsch. Du greifst auf ein Datenelement (this_ptr) eines noch nicht initialisierten Objekts zurück. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
<p>AlexanderKiebler schrieb:</p>
<blockquote>
<p>Das delete gibt dann den Speicher mit free wieder frei.<br />
Ich frag mich nun, woher kennt free die größe des frei zu gebenden Speichers ???</p>
</blockquote>
<p>Na, die Größe wird irgendwo von irgendwem gespeichert. Ist das wichtig?</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943799</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 24 Aug 2010 13:16:42 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 13:30:46 GMT]]></title><description><![CDATA[<p><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="🙂"
    /> Das hört sich ja toll an <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>malloc gibt ja den Typen void * zurück.<br />
Genau in in diesem typen speichere ich auch die Pointer.</p>
<p>Zerstört ein Delete nun den Bereich<br />
sizeof(void <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 />
oder den gesamten Speicherbereich ??</p>
<p>Wiso soll das eigentlich ne Schnaps Idee sein ??<br />
Ich finde das garnicht so schlecht.</p>
<p>Gruß Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943808</guid><dc:creator><![CDATA[AlexanderKiebler]]></dc:creator><pubDate>Tue, 24 Aug 2010 13:30:46 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 13:32:37 GMT]]></title><description><![CDATA[<p>AlexanderKiebler schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>Ich muß einen Garbage Collector schreiben.<br />
Wenn man von dieser Klasse ableitet,<br />
dann sollen durch einen funktionfaufruf alle mit new erzeugten Klassen zerstört werden, welche zuvor nich mit delete zerstört worden sind.<br />
Dies geschieht dadurch , dass ich in der Garbage Collector Klasse die operatoren new new[] delete delete[] überschreibe, und die<br />
so erhaltenen Pointer zwischenspeichere, oder bei einem Delete wieder aus der Liste nehme.</p>
</blockquote>
<p>Das ist eine nette Idee, aber kein Garbage Collector. Erinnert mich an die AutoReleasePools (oder so ähnlich) von Objective-C.</p>
<p>Der wichtigste Unterschied zum Garbage Collector: Ein GC behält alle Objekte, die noch erreichbar sind. Du musst deinen &quot;GC&quot; triggern, wenn du selbst der Meinung bist, dass <strong>alle</strong> verwalteten Objekte nicht mehr erreichbar sind.</p>
<blockquote>
<p>Ich frag mich nun, woher kennt free die größe des frei zu gebenden Speichers ???</p>
</blockquote>
<p>Es speichert sich das intern irgendwie. Oder auch nicht. Das ist plattform- und compilerabhängig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943810</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 24 Aug 2010 13:32:37 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 13:46:54 GMT]]></title><description><![CDATA[<p>Hmm Okay.....<br />
Also einen vollständigen Garbage collector brauche ich dann nicht.<br />
Es soll so ablaufen:<br />
-Speichere alle mit new erzeugeten Pointer in ner Liste<br />
-Lösche alle mit delete zerstörten Objekte wieder aus der liste,<br />
-Sollten &quot;zum Schluss&quot;-&gt;single tone klasse zerstören, noch pointer in der Liste sein, derztöre die Objekte.</p>
<p>Leider habe ich die Befürchtung, dass mir Delete nur<br />
den Speicherbereich der Größe sizeof( void <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="😉"
    /> frei gibt, und nicht den der gesamten klasse.</p>
<p>Ich könnte ja mal nach schauen, aber wenns tatächlich compiler abhängig ist, hab ich schon en Problem...</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943820</guid><dc:creator><![CDATA[AlexanderKiebler]]></dc:creator><pubDate>Tue, 24 Aug 2010 13:46:54 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 13:59:37 GMT]]></title><description><![CDATA[<p>AlexanderKiebler schrieb:</p>
<blockquote>
<p>Leider habe ich die Befürchtung, dass mir Delete nur<br />
den Speicherbereich der Größe sizeof( void <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="😉"
    /> frei gibt, und nicht den der gesamten klasse.</p>
</blockquote>
<p>free gibt schon den ganzen Speicher frei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943830</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 24 Aug 2010 13:59:37 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 14:29:43 GMT]]></title><description><![CDATA[<p>AlexanderKiebler schrieb:</p>
<blockquote>
<p>Es soll so ablaufen:<br />
-Speichere alle mit new erzeugeten Pointer in ner Liste<br />
-Lösche alle mit delete zerstörten Objekte wieder aus der liste,<br />
-Sollten &quot;zum Schluss&quot;-&gt;single tone klasse zerstören, noch pointer in der Liste sein, derztöre die Objekte.</p>
</blockquote>
<p>Das läuft allen etablierten C++-Praktiken entgegen. Warum musst du das machen? Soll das einen praktischen Nutzen haben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943831</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Tue, 24 Aug 2010 14:29:43 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 14:01:15 GMT]]></title><description><![CDATA[<p>Nukularfüsiker schrieb:</p>
<blockquote>
<p>AlexanderKiebler schrieb:</p>
<blockquote>
<p>Es soll so ablaufen:<br />
-Speichere alle mit new erzeugeten Pointer in ner Liste<br />
-Lösche alle mit delete zerstörten Objekte wieder aus der liste,<br />
-Sollten &quot;zum Schluss&quot;-&gt;single tone klasse zerstören, noch pointer in der Liste sein, derztöre die Objekte.</p>
</blockquote>
<p>Das läuft allen etablierten C++-Praktiken entgegen. Warum musst du das machen? Soll das einen praktischen Nutzen haben? Ist der Auftraggeber ein Idiot?</p>
</blockquote>
<p>Vielleicht will der Herr Auftraggeber nur, dass sich die Herrn Lernenden mit dem Thema beschäftigen und den Hintergrund verstehen?</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943832</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Tue, 24 Aug 2010 14:01:15 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 14:04:08 GMT]]></title><description><![CDATA[<p>SideWinder schrieb:</p>
<blockquote>
<p>Vielleicht will der Herr Auftraggeber nur, dass sich die Herrn Lernenden mit dem Thema beschäftigen und den Hintergrund verstehen?</p>
</blockquote>
<p>So entstehen schlechte C++-Programmierer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943834</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Tue, 24 Aug 2010 14:04:08 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 14:17:43 GMT]]></title><description><![CDATA[<p>Hi nochmal,</p>
<p>Das Problem ist das Folgende:</p>
<p>-Es gibt ne Single Tone Klasse welche als Zeit Trigger funktioniert.<br />
-Es gibt Eine virtuelle Simulationsklasse, über welche die Zeit Klasse<br />
mit den Simulationsblöcken kommuniziert.<br />
-Dann gibt es eine GUI Bibliothek welche die Einsprungsfunktion (main)<br />
bereitstellt. (wxWidgets)<br />
-Es gibt nun einen Funktionsaufruf void MY_MAIN(void), in dem alle<br />
Simulationsblöcke erzeugt werden sollen.<br />
(Simulationsblöcke geben zum Beispiel ein Sinussignal aus, oder sie lesen daten von einem verbunden block und schreiben in einen verbundenen Block und sie können natürlich in dem Rechenzyklus Daten berechnen. Zum Beispiel eine lineare Differenzialgleichung)<br />
-Wenn ich die Simulationsblöcke nicht als pointer anfordere, werden sie automatisch wieder beim Verlassen von MY_MAIN(void) gelöscht.<br />
-Ich könne jetzt natürlich eine Destruktorähnliche Funktion<br />
MY_MAIN_DESTRUKT(void)<br />
machen, aber die so erzeugten Pointer müßt ich so oder so zwischen speichern.<br />
Und dann jedes mal wieder die objekte zerstören ??? Das kann ich doch gleich automatisch machen lassen und dem Anwender programmierer das ganzeersparen.</p>
<p>Der von mir gewählte Weg funktioniert um ehrlich zu sein super gut, und ich sehe kein Problem mehr, wenn delete immer den gesamten Speicher freigibt.<br />
Also vom Konzept herkann ich eigentlich nciht meckern.</p>
<p>Würd ich allerdings sehr freuen, wenn ich noch den Aufbau von einem C/C++ Pointer irgendwoher bekommen könne.</p>
<p>Also welche Daten werden wo gespeichert ??</p>
<p>Gruß Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943841</guid><dc:creator><![CDATA[AlexanderKiebler]]></dc:creator><pubDate>Tue, 24 Aug 2010 14:17:43 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 14:21:42 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24923">@Nukularfüsiker</a></p>
<p>Wenn du dich mit dem Problem so gut auskennst, hast du dich damit also auch befasst ??<br />
Ergo du bist nach deiner Aussage ein schlechter Programmierer geworden was C++ an geht ??<br />
Wiso sollt ich dann auf dich hören ??</p>
<p>Ode du hast dich noch nicht damit befasst ???<br />
-&gt; Wiso sollt ich dann auf dich hören ???</p>
<p>Ratschläge sind ja gut, aber sie sollten doch eher ohne Wertung auf die Persohn stattfinden.<br />
Es. so entsteht schlechter C++ code, wenn das dine Meinung sit, aber nicht gleich der ganze Programmierer <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>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943844</guid><dc:creator><![CDATA[AlexanderKiebler]]></dc:creator><pubDate>Tue, 24 Aug 2010 14:21:42 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 14:22:36 GMT]]></title><description><![CDATA[<p>AlexanderKiebler schrieb:</p>
<blockquote>
<p>Also welche Daten werden wo gespeichert ??</p>
</blockquote>
<p>Adresse des Speicherbereichs im Pointer. Ende.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943847</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Tue, 24 Aug 2010 14:22:36 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 14:29:06 GMT]]></title><description><![CDATA[<p>AlexanderKiebler schrieb:</p>
<blockquote>
<p>Wenn du dich mit dem Problem so gut auskennst, hast du dich damit also auch befasst ??</p>
</blockquote>
<p>Ja.</p>
<blockquote>
<p>Ergo du bist nach deiner Aussage ein schlechter Programmierer geworden was C++ an geht ??</p>
</blockquote>
<p>Nein. Eher so Mittelmaß. Aber ich habe genug Erfahrung und lange mit &quot;Spezialisten&quot; zusammengearbeit, um Mist zu erkennen.</p>
<blockquote>
<p>Wiso sollt ich dann auf dich hören ??</p>
</blockquote>
<p>Brauchst du doch nicht.</p>
<blockquote>
<p>Ratschläge sind ja gut, aber sie sollten doch eher ohne Wertung auf die Persohn stattfinden.</p>
</blockquote>
<p>Leg dir mal ein dickeres Fell zu. Du hast ein Problem mit C++, du kriegst Antworten darauf. Nicht jede dieser Antworten muss dir gefallen.</p>
<p>Wenn dich das &quot;Idiot&quot; persönlich getroffen hat, entschuldige ich mich für die Bezeichnung und ändere es hiermit in &quot;Ahnungsloser&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943856</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Tue, 24 Aug 2010 14:29:06 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 14:34:07 GMT]]></title><description><![CDATA[<p>Wie würdest du denn das Problem angehen ??<br />
P.s.: Würd mich über ne Antwort ohne Beschimpfung freuen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1943860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943860</guid><dc:creator><![CDATA[AlexanderKiebler]]></dc:creator><pubDate>Tue, 24 Aug 2010 14:34:07 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 14:45:42 GMT]]></title><description><![CDATA[<p>Ich werde aus deiner Beschreibung nicht so recht schlau und bin mir deshalb nicht sicher was genau das Problem ist.</p>
<p>Generell würde ich sagen: Speicherverwaltung in C++ ist einfach, wenn man zwei einfache Grundsätze befolgt:<br />
1. Der Teil des Programms, der den Speicher anfordert, gibt ihn auch wieder frei.<br />
2. <a href="http://de.wikipedia.org/wiki/RAII" rel="nofollow">RAII</a> funktioniert (fast) immer.</p>
<p>Alles was hiervon abweicht, ist erst mal komisch und sollte gut begründet werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943869</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Tue, 24 Aug 2010 14:45:42 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 14:46:26 GMT]]></title><description><![CDATA[<p>AlexanderKiebler schrieb:</p>
<blockquote>
<p>Wie würdest du denn das Problem angehen ??</p>
</blockquote>
<p>Da es eh eine Möglichkeit geben muß, herauszufinden, welche Objekte noch leben, also auf welche Objekte noch Zeiger zeigen, müssen die Zeiger selber smart werden. Ich denke mal, gegen dieses Argument kannste keinen Ausweg finden.<br />
Und dann kannste auch den Großteil der Mitzähl-Und-Aufräum-Logik in die smart pointers legen. Wenn GC-Objekte eh von der Basisklasse GarbageCollect erben müssen, was eine sehr gute Idee ist, brauchste vielleicht gar nicht an new/delete zu fummeln, dann kannste den refcounter oder die Verkettungszeiger vielleicht in der Basisklasse lassen. Draußen wäre vielleicht lecker, um mal eine XOR-Liste auszuprobieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943870</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 24 Aug 2010 14:46:26 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 15:01:41 GMT]]></title><description><![CDATA[<p>Ich verstehe das Problem noch nicht ganz. Während einer Simulation werden also dynamisch Objekte erzeugt, die -- wahrscheinlich -- ein paar Zeitschritte überleben sollen und dann irgendwann wieder zerstört werden sollen. Richtig soweit? Warum siehst Du dich jetzt gezwungen, einen GC nachzubauen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943880</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 24 Aug 2010 15:01:41 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 15:14:38 GMT]]></title><description><![CDATA[<p>Hi Volkard,</p>
<p>Erstmal Danke Für die Antwort. <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="🙂"
    /><br />
Also</p>
<blockquote>
<p>Da es eh eine Möglichkeit geben muß, herauszufinden, welche Objekte noch leben, also auf welche Objekte noch Zeiger zeigen, müssen die Zeiger selber smart werden.</p>
</blockquote>
<p>Ich hab mir das gerade mal durchgeguckt. Also die Smart Pointer von Boost.<br />
Ich persöhnlich halte das ein bischen für &quot;mit Kanonen auf Spatzen geschossen&quot;</p>
<p>Testen auf:<br />
-Gibt es noch einen Pointer auf das Objekt<br />
Zum auslösen von delete ist schon mehr als ich jetzt wollte.</p>
<p>Was ist denn so schlecht daran einfach new und delete zu überladen ??<br />
Ist das geächtet wie goto ??</p>
<p>In der Funktion<br />
MY_MAIN(void)<br />
kann man dann so programmieren wie immer. Nur wenn zufällig ein Pointer nicht aufgeräumt wird, wird das eben automatisch erledigt.</p>
<p>Ich sehe bei meiner vorgehensweise eigentlich kein Problem.</p>
<p>Wobei cih das mit den Smart pointern sehr schlau finde =).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943884</guid><dc:creator><![CDATA[AlexanderKiebler]]></dc:creator><pubDate>Tue, 24 Aug 2010 15:14:38 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 15:23:00 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1616">@krümel</a></p>
<p>Also gezwungen nicht. Aber es wäre eben schön.<br />
Die Simulationsblöcke sollen alle in einer Funktion<br />
MY_MAIN(void)<br />
erzeugt werden.<br />
Damit sie nach dem Verlassen der Funktion noch existiern sollte das Dynamisch geschehen.<br />
Jeder Simulationsblock lebt bis zum Ende der Simulation.<br />
Und dann sollen sie aber zerstört werden.</p>
<p>Ich glaube das Wort Garbage Collector ist etwas hochgegriffen gewesen von meiner Seite.<br />
Der soll ja eigentlich prüfen ob noch ein Pointer auf die Instanz vorhanden ist. Und wennn nein, dann soll er das Objekt zerstören.<br />
Das brauch ich garnicht.<br />
Ich muss einfach alles was in der Funktion<br />
MY_MAIN(void)<br />
dynamisch erzeugt, und nicht mit delete zerstört worden ist dannach aufräume.<br />
Wobei cih davon ausgehen darf, dass in dieser Funktion alle Objekte von<br />
der Simulationsklass und damit von der Garbage Collect klasse erben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943886</guid><dc:creator><![CDATA[AlexanderKiebler]]></dc:creator><pubDate>Tue, 24 Aug 2010 15:23:00 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 15:36:15 GMT]]></title><description><![CDATA[<p>Ein Problem dabei ist, dass C++ dem Programmierer ein bestimmtes Verhalten zusagt. Dazu gehört, dass ein mit new geholter Pointer bis zum delete gültig bleibt. Du greifst mit deinem Konzept in dieses System ein und setzt damit den gesamten C++-Standard außer Kraft. Wenn mal jemand dein System benutzt, der mehr von C++ versteht als du, der wird dich verfluchen.</p>
<p>Außerdem ist es eine üble Sache, Programmierfehler zu verstecken. Du bekämpfst damit Symptome schlampiger Programmierung, statt die Ursache zu beheben. Gib statt dessen eine fette Fehlermeldung aus, das macht es ein klein wenig besser (aber immer noch nicht gut).</p>
<p>Und dann die ganzen Fallen. Es gibt Geschichten wie placement new, die dir hier in die Suppe spucken könnten. Möglicherweise weißt du nicht einmal, was das überhaupt ist - das wäre dann ein sicheres Zeichen für dich, nicht in der Speicherverwaltung rumzupfuschen.<br />
Und natürliche globale Objekte, die im Destruktor selbst ein delete machen, wobei dein Gehacke sofort übelst krachen geht, mit einem Programmabsturz, dessen Ursache kaum zu finden ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943893</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Tue, 24 Aug 2010 15:36:15 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 15:47:04 GMT]]></title><description><![CDATA[<p>Also zunächst bleib ich dem verhalten von C++ treu, soweit es ein GUI programmierer kennt. Das passt eigentlich schon.<br />
Der Programmierer Darf zerstören, muss aber nicht, so wie in den Meißten Bibliotheken.</p>
<p>Ein Placement new würd ich hier jetzt nicht implementieren.<br />
Das wäre eher interessante, wenn ich zeitkritisch was alloziieren möchte,<br />
oder auch für objekte in Shared Memory könnt ich mir das vorstellen.<br />
Placement new wird bei mir nicht vorkommen.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943899</guid><dc:creator><![CDATA[AlexanderKiebler]]></dc:creator><pubDate>Tue, 24 Aug 2010 15:47:04 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 16:09:52 GMT]]></title><description><![CDATA[<p>AlexanderKiebler schrieb:</p>
<blockquote>
<p>Also zunächst bleib ich dem verhalten von C++ treu, soweit es ein GUI programmierer kennt. Das passt eigentlich schon.</p>
</blockquote>
<p>...was soll man auf solche Ignoranz noch antworten? Du bleibst damit dem Verhalten von C++ ungefähr so treu, wie dein Geschreibsel der Deutschen Rechtschreibung treu bleibt. Also quasi überhaupt nicht.</p>
<blockquote>
<p>Der Programmierer Darf zerstören, muss aber nicht, so wie in den Meißten Bibliotheken.</p>
</blockquote>
<p>Doch, der Programmierer muss, weil er korrekt programmieren soll. Und wenn du ihm in die Quere kommst, dann darf er eben nicht mehr. Siehe globale Objekte.</p>
<blockquote>
<p>Ein Placement new würd ich hier jetzt nicht implementieren.</p>
</blockquote>
<p>Ach.</p>
<p>Ich lasse es mal gut sein hier in dem Thread. Vielleicht findet ein anderer bessere Argumente, die du verstehen kannst <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1943913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943913</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Tue, 24 Aug 2010 16:09:52 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 16:24:52 GMT]]></title><description><![CDATA[<p>AlexanderKiebler schrieb:</p>
<blockquote>
<p>Ich hab mir das gerade mal durchgeguckt. Also die Smart Pointer von Boost.<br />
Ich persöhnlich halte das ein bischen für &quot;mit Kanonen auf Spatzen geschossen&quot;</p>
</blockquote>
<p>Du musst bei einem GC ja auch darüber eine Liste führen, wenn der Zeiger noch verwendet wird, und dies geht nur mittels Mechanismen wie Referenzzählung. Zudem ist der shared_ptr, obwohl ein Schwergewicht (Den ich nur bei geteilten Ressourcen verwenden würde), auch in der Lage gegenseitige Objektverweise aufzulösen (Stichwort: weak_ptr). Mal sehen wie du das ohne den Aufwand nachbasteln willst.</p>
<p>GC und C++ vertragen sich wirklich nicht, zumindest nicht, wenn nicht Auflagen zur Verwendung oder noch besser der Compiler eine Lösung unter der Haube einbaut (Ist ja durchaus &quot;optional&quot; in Überlegung für einen späteren Technical Report).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943922</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 24 Aug 2010 16:24:52 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 16:27:49 GMT]]></title><description><![CDATA[<p>Also ich habe mal ein Testprogramm geschrieben wo zeigt, wie cih das meine.<br />
Es müßten noch die Operatoren new[] und delete[] überschreben werden, welche aber eine neue statische liste bekommen würden. Und die richtige Ausnahme schmeißen...<br />
Hier die main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

#include &quot;TestClass.h&quot;

int main(void)
{

    TestClass* a=new TestClass;
    a=new TestClass;
    a=new TestClass;
    a=new TestClass;
    delete a;
    a=new TestClass;
    a=new TestClass;

    a-&gt;remove_all_instances();

    return 0;
}
</code></pre>
<p>Dann die klasse zum testen welche von GaCo abgeleitet wurde.</p>
<pre><code class="language-cpp">#ifndef TEST_CLASS_H
#define TEST_CLASS_H

#include &quot;GaCo.h&quot;

class TestClass: public GaCo
{
    public:
        TestClass(){std::cout &lt;&lt;&quot;\n Construkt TestClass&quot;;};

};

#endif
</code></pre>
<p>Und zuletzt der GaCo =):</p>
<pre><code class="language-cpp">#ifndef GA_CO_H
#define GA_CO_H

#include &lt;iostream&gt;

#include &lt;set&gt;

class GaCo
{
    public:
        /// Zerstört alle noch vorhandenen Objekte
        void remove_all_instances(void);
        ///Operatoren
        void * operator new (size_t s)throw();
        void operator delete (void * ptr);

    private:
        static std::set&lt;void *&gt; instances;
        static std::set&lt;void *&gt;::iterator instances_it;

};

#endif
</code></pre>
<p>und</p>
<pre><code class="language-cpp">#ifndef GA_CO_CPP
#define GA_CO_CPP

#include &quot;GaCo.h&quot;
#include &lt;cstdlib&gt;

std::set&lt;void *&gt; GaCo::instances;
std::set&lt;void *&gt;::iterator GaCo::instances_it;

void GaCo::remove_all_instances(void)
{

    instances_it=instances.begin();
    while(instances_it!=instances.end())
    {
        std::cout &lt;&lt;&quot;\n ptr \t&quot; &lt;&lt;*instances_it;
        free(*instances_it);
        instances_it++;
    }
    instances.clear();
    std::cout &lt;&lt;&quot;\n instances.size()\t&quot; &lt;&lt;instances.size();
}

 void * GaCo::operator new(size_t s)throw()
 {
    std::cout &lt;&lt;&quot;\n\noperator GaCo::new call&quot;;
    void* ptr=std::malloc(s);
    if(ptr)
        instances.insert(ptr);
    else
    {
        ///Schmeißen
    }
    std::cout &lt;&lt;&quot;\n instances.size()\t&quot; &lt;&lt;instances.size();
    std::cout &lt;&lt;&quot;\n ptr \t&quot; &lt;&lt;ptr;
    return ptr;
 }

 void GaCo::operator delete(void *ptr)
 {
     std::cout &lt;&lt;&quot;\n\noperator GaCo::delete call&quot;;
    instances_it=instances.find(ptr);
    if(instances_it!=instances.end())
        instances.erase(instances_it);
    free(ptr);

    std::cout &lt;&lt;&quot;\n instances.size()\t&quot; &lt;&lt;instances.size();
    std::cout &lt;&lt;&quot;\n ptr \t&quot; &lt;&lt;ptr;
 }

#endif
</code></pre>
<p>Läuft einwandfrei muss ich sagen.<br />
Für Rechtschreibung, sorry, ich achte nicht gerade drauf. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1943925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943925</guid><dc:creator><![CDATA[AlexanderKiebler]]></dc:creator><pubDate>Tue, 24 Aug 2010 16:27:49 GMT</pubDate></item><item><title><![CDATA[Reply to Garbage Collector on Tue, 24 Aug 2010 16:32:20 GMT]]></title><description><![CDATA[<p>AlexanderKiebler schrieb:</p>
<blockquote>
<p>Also ich habe mal ein Testprogramm geschrieben wo zeigt, wie cih das meine.</p>
</blockquote>
<p>Also unter einem GC verstehe zumindest ich eindeutig etwas anderes: Zum Beispiel löscht ein GC nur Objekte die nicht mehr verwendet werden. Davon abgesehen das ich Iteratoren nur lokal anlegen würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943928</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 24 Aug 2010 16:32:20 GMT</pubDate></item></channel></rss>