<?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[Placement delete, sowie weitere Fragen]]></title><description><![CDATA[<p>Servus,</p>
<p>ich hätte da mal ein paar Fragen und hoffe, dass sie wer beantwortet <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>1, Wird beim Standard &quot;delete&quot; der Konstruktor automatisch aufgerufen, oder muss ich bei einer neuen Implementation diesen aufrufen?</p>
<pre><code class="language-cpp">void operator delete(void* p) {
  // ist p ein Zeiger auf ein intaktes Objekt
  // oder auf einen leeren Speicherbereich?

  // Falls das Objekt noch intakt. Wie rufe ich den
  // Konstruktor auf, wenn (void*) nicht von einem
  // Objekt abstammt?
  p-&gt;???

  // (void*) stammt von einem Objekt ab
  ((MeinBasisObject*)p)-&gt;~MeinBasisObject()
  free(p);
}
</code></pre>
<p>2, Was und wie viel Speicher muss ich für Arrays reservieren?</p>
<pre><code class="language-cpp">// in irgend einer Method
Abc[] obj = new Abc[10];
obj[0] = new Abc();

int[] ia1 = new int[8] { 1, 2, 4 }; // ist das überhaupt möglich :-:
int[] ia2 = new int[8] { 
  new int(1), new int(2), new int(4)
 }; // ist das überhaupt möglich :-:

// ...
void* operator new[](size_t t) {
  // was beinhaltet t?
  // - Anzahl der Bytes für ein Objekt
  // - Anzahl der Bytes für n-Objekte; n&gt;0
  return malloc(t*sizeof(t));
  // oder
  return malloc(t);
}
</code></pre>
<p>3, Placement delete/new: Wo hinterlege ich Informationen über die vergebenen Zeiger?<br />
- in einem Suchbaum<br />
- Map &lt;Key = Zeigeradresse, Value = Informationen über Größe &amp; Co.&gt;<br />
- ...</p>
<p>Wann ist der Aufwand für einen Baum gerechtfertigt bzw. ab wie vielen Elemente wird die Map zu langsam?<br />
Ich überlege gerade, den Speicherpool in Blöcken und diese wieder in Teilstücken aufzuteilen. Der Pool fordert immer einen ganzen Block mit malloc an und unterteilt diesen. Für jedes dieser Teilstücke würde ich entweder einen Baum oder eine Map verwenden. Mal sehen <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ß,<br />
Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/242267/placement-delete-sowie-weitere-fragen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 01:04:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/242267.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 01 Jun 2009 19:42:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Placement delete, sowie weitere Fragen on Mon, 01 Jun 2009 19:42:09 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>ich hätte da mal ein paar Fragen und hoffe, dass sie wer beantwortet <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>1, Wird beim Standard &quot;delete&quot; der Konstruktor automatisch aufgerufen, oder muss ich bei einer neuen Implementation diesen aufrufen?</p>
<pre><code class="language-cpp">void operator delete(void* p) {
  // ist p ein Zeiger auf ein intaktes Objekt
  // oder auf einen leeren Speicherbereich?

  // Falls das Objekt noch intakt. Wie rufe ich den
  // Konstruktor auf, wenn (void*) nicht von einem
  // Objekt abstammt?
  p-&gt;???

  // (void*) stammt von einem Objekt ab
  ((MeinBasisObject*)p)-&gt;~MeinBasisObject()
  free(p);
}
</code></pre>
<p>2, Was und wie viel Speicher muss ich für Arrays reservieren?</p>
<pre><code class="language-cpp">// in irgend einer Method
Abc[] obj = new Abc[10];
obj[0] = new Abc();

int[] ia1 = new int[8] { 1, 2, 4 }; // ist das überhaupt möglich :-:
int[] ia2 = new int[8] { 
  new int(1), new int(2), new int(4)
 }; // ist das überhaupt möglich :-:

// ...
void* operator new[](size_t t) {
  // was beinhaltet t?
  // - Anzahl der Bytes für ein Objekt
  // - Anzahl der Bytes für n-Objekte; n&gt;0
  return malloc(t*sizeof(t));
  // oder
  return malloc(t);
}
</code></pre>
<p>3, Placement delete/new: Wo hinterlege ich Informationen über die vergebenen Zeiger?<br />
- in einem Suchbaum<br />
- Map &lt;Key = Zeigeradresse, Value = Informationen über Größe &amp; Co.&gt;<br />
- ...</p>
<p>Wann ist der Aufwand für einen Baum gerechtfertigt bzw. ab wie vielen Elemente wird die Map zu langsam?<br />
Ich überlege gerade, den Speicherpool in Blöcken und diese wieder in Teilstücken aufzuteilen. Der Pool fordert immer einen ganzen Block mit malloc an und unterteilt diesen. Für jedes dieser Teilstücke würde ich entweder einen Baum oder eine Map verwenden. Mal sehen <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ß,<br />
Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719287</guid><dc:creator><![CDATA[Siassei]]></dc:creator><pubDate>Mon, 01 Jun 2009 19:42:09 GMT</pubDate></item><item><title><![CDATA[Reply to Placement delete, sowie weitere Fragen on Mon, 01 Jun 2009 20:19:21 GMT]]></title><description><![CDATA[<p><strong>1.1</strong> Es gibt kein Placement Delete.<br />
<strong>1.2</strong> <code>delete</code> ruft grundsätzlich nie einen Konstruktor auf (von Code in den Destruktoren mal abgesehen).<br />
<strong>1.3</strong> Nein, <code>operator delete</code> ruft auch keinen Destruktor auf, sondern gibt nur Speicher, der mit <code>operator new</code> angefordert wurde, frei.<br />
<strong>1.4</strong> Da der <code>operator delete</code> keinen typisierten Zeiger als Parameter nimmt, kannst du auch in eigenen Implementierungen keinen Destruktor aufrufen. Das ist aber auch nicht Aufgabe dieser Funktion.</p>
<p><strong>2.1</strong> Die Syntax deiner Array-Deklarationen erinnert an Java. Schau dir vielleicht ein Grundlagenbuch an, dort sollten Zeiger und Arrays von der Syntax her erklärt werden.<br />
<strong>2.2</strong> Nein, entsprechend ist das nicht möglich. Du musst deine Elemente einzeln zuweisen, kopieren, oder eine fertige Funktion zum Füllen verwenden.<br />
<strong>2.3</strong> Der an <code>operator new</code> übergebene Parameter enthält die Anzahl Bytes, die angefordert werden sollen. Wieso liest du das nicht irgendwo nach?<br />
<strong>2.4</strong> Auch hier gilt, dass du keine Typinformationen hast, entsprechend kannst du <code>sizeof</code> vergesssen.</p>
<p><strong>3.1</strong> Placement Delete gibt es wie gesagt nicht.<br />
<strong>3.2</strong> Ich hab das Gefühl, auch unter Placement New verstehst du was falsches. Das braucht man nämlich, um auf rohem Speicher ein Objekt zu konstruieren.<br />
<strong>3.3</strong> Wieso willst du die Zeiger speichern?</p>
<p>Mal ehrlich: Glaubst du, du hast genügend Erfahrung, eine eigene Speicherverwaltung zu schreiben? Es gibt normalerweise auch keinen Anlass dazu, die vorgegebenen <code>new</code> - und <code>delete</code> -Operatoren decken sehr viele Fälle ab. Die Thematik ist auch nicht gerade trivial, und es ist unwahrscheinlich, dass du damit wirklich effizienter bist als die Standardbibliothek.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719306</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 01 Jun 2009 20:19:21 GMT</pubDate></item><item><title><![CDATA[Reply to Placement delete, sowie weitere Fragen on Mon, 01 Jun 2009 20:57:16 GMT]]></title><description><![CDATA[<p>Servus Nexus,</p>
<p>wenn delete nur den Speicher frei gibt, wer ruft den Destruktor auf?</p>
<p>Entschuldige für diese Fragen, aber mein Buch ist 250km von mir entfernt.</p>
<p>Kein Placement-Delete? Was ist im folgenden Codestück deklariert?</p>
<pre><code class="language-cpp">public:
    void *operator new(unsigned int class_size, My_Pool *pool);
    void *operator new(unsigned int class_size, My_Pool &amp;pool);

    void operator delete(void*)
    {
    }

    void operator delete(void*, My_Pool*)
    {
    }

    void operator delete(void*, My_Pool&amp;)
    {
    }

private:
    void *operator new(unsigned int)
    {}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1719321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719321</guid><dc:creator><![CDATA[Siassei]]></dc:creator><pubDate>Mon, 01 Jun 2009 20:57:16 GMT</pubDate></item><item><title><![CDATA[Reply to Placement delete, sowie weitere Fragen on Mon, 01 Jun 2009 21:06:55 GMT]]></title><description><![CDATA[<p>Siassei schrieb:</p>
<blockquote>
<p>wenn delete nur den Speicher frei gibt, wer ruft den Destruktor auf?</p>
</blockquote>
<p>Du musst unterscheiden zwischen <code>delete</code> und <code>operator delete</code> .</p>
<pre><code class="language-cpp">// operator delete gibt nur Speicher frei - analog zu operator new.
void* mem = operator new(231);
operator delete(mem);

// delete ruft den Destruktor auf und gibt den Speicher frei - analog zu new.
T* ptr = new T;
delete ptr;

// schrittweise kannst du dir delete so vorstellen:
ptr-&gt;~T();             // Destruktor aufrufen
operator delete(ptr);  // Speicher freigeben
</code></pre>
<p>Siassei schrieb:</p>
<blockquote>
<p>Kein Placement-Delete? Was ist im folgenden Codestück deklariert?</p>
</blockquote>
<p>Überladene <code>new</code> - und <code>delete</code> -Operatoren. Wie gesagt, Placement New wird benötigt, um an einer rohen Speicherstelle den Konstruktor eines Objekts aufzurufen.</p>
<pre><code class="language-cpp">// Statt 
T* ptr = new T;

// kannst du schrittweise folgendes tun:
T* ptr = static_cast&lt;T*&gt;(operator new(sizeof(T))); // Speicher anfordern
new (ptr) T();                                     // Objekt dort konstruieren
</code></pre>
<p>Übrigens hat der <code>operator new</code> als ersten Parameter <code>std::size_t</code> - das muss nicht zwangsläufig das Gleiche sein wie <code>unsigned int</code> . Aber ich frage dich nochmals, wieso willst du eine eigene Speicherverwaltung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719325</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 01 Jun 2009 21:06:55 GMT</pubDate></item><item><title><![CDATA[Reply to Placement delete, sowie weitere Fragen on Tue, 02 Jun 2009 10:31:22 GMT]]></title><description><![CDATA[<p>Sorry, für die Angaben des ersten Beitrags. Ich meinte natürlich den Destruktor in Verbindung mit delete. Es war schon etwas spät und vielleicht hatte ich auch schon ein paar Maß zu viel. Ein Bierzelt ist was schönes <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>
<blockquote>
<p>Aber ich frage dich nochmals, wieso willst du eine eigene Speicherverwaltung?</p>
</blockquote>
<p>Nennen wir es jucks und tollerei. Oder eher Interesse an C++, Programmierung, Zeitvertreib, ... <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>Dass size_t nicht unbedingt unsigned int ist, weiß ich auch. Frage, darf size_t auch ein negatives Vorzeichen tragen oder ist das vom Standard ausgeschlossen? Grund der Frage. Ich hab mir eine Implemtierung angeschaut und da haben die Tatsächlich geprüft ob der Parameter vom Operator new negativ ist.</p>
<p>Als ersten Anhaltspunkt habe ich mir die Source von <a href="http://www.pjsip.org/pjlib/docs/html/group__PJ__POOL__GROUP.htm" rel="nofollow">PJLIB</a> besorgt, woraus auch der Fetzen stammt. Vom Design bin ich nicht gerade begeistert, da diese Implemtierung doch sehr speziell ist und auf Objective-C beruht.</p>
<p>Das Speichern der vergebenen Zeigern + Informationen über die Größe, vieleicht auch Typ (wenn ich herausfinde wie ich das Hinbekomme), soll als Informationsquelle für die spätere Bereinigung und analyse Quelle dienen. Ich weiß, dass das alles schon gibt. Ich möchte mir damit auch nur Wissen aneignen, dass ich sonst niemals bekähme <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>Ein Frage hätte ich noch. Ich überschreibe den &quot;normalen&quot; Operator delete (global oder für eine Klasse). Muss ich den Destruktor manuell im Code aufrufen oder erledigt sich das beim bereinigen mit z.B. free().</p>
<pre><code class="language-cpp">// z.B eigener operator new/delete (global)
static MyPool* pool;
void* temp = malloc(sizeof(MyPool));
pool = new (temp) MyPool();

void *operator new(std::size_t size)
{
  return pool.malloc(size);
}

void operator delete(void* mem)
{
  pool.push_back(mem);
  // Oder
  // pool.free(mem);
}

// So
Abc *a = new Abc();
a-&gt;~Abc();
delete a;

// oder
Abc *a = new Abc();
delete a;
// Wird der Destruktor hier automatisch
// aufgerufen oder nicht?
</code></pre>
<p>Falls ich den Destruktor manuell Aurfufen muss, sehe ich da nur den Weg einer Basisklasse. Von dieser müssten alle verwaltbare Klassen abgeleitet werden. Das kommt mir doch bekannt vor <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="🙂"
    /> und gefällt mir nicht. Kann ich irgendwie die Typinformationen speichern, damit ich folgendes machen kann</p>
<pre><code class="language-cpp">map&lt;void*, myTypeInfoStruct&gt; &amp;info;
void* p;

//..
map&lt;void*, myTypeInfoStruct&gt;::iterator it = info.find(p);

if(it != info.end()) {
  myTypeInfoStruct i = it-&gt;second;
  (dynamic_cast&lt;i.zeigerAufKlasse()&gt; (p))-&gt;i.adresseDesDestruktors();
}

free(p)
</code></pre>
<p>Wie sieht es eigentlich bei Stukturen aus? Wenn ich mich nicht recht erinnere, gibt es zwei Sorten. C konforme und nicht C konforme Strukturen. Ersteres müsste ich doch mich free() einfach freigeben können, oder?</p>
<p>Mit was könnte ich das Überprüfen? In &lt;type_traits&gt; konnte ich nichts finden.</p>
<p>Fragen, über Fragen und ich finde keine Anworten <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/1719510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719510</guid><dc:creator><![CDATA[Siassei]]></dc:creator><pubDate>Tue, 02 Jun 2009 10:31:22 GMT</pubDate></item><item><title><![CDATA[Reply to Placement delete, sowie weitere Fragen on Tue, 02 Jun 2009 10:56:51 GMT]]></title><description><![CDATA[<p>Wenn es nur zum Herumexperimentieren ist, ist es ganz okay. Nur würde ich aufpassen, bevor ich sowas produktiv einsetze... <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>Siassei schrieb:</p>
<blockquote>
<p>Dass size_t nicht unbedingt unsigned int ist, weiß ich auch. Frage, darf size_t auch ein negatives Vorzeichen tragen oder ist das vom Standard ausgeschlossen? Grund der Frage. Ich hab mir eine Implemtierung angeschaut und da haben die Tatsächlich geprüft ob der Parameter vom Operator new negativ ist.</p>
</blockquote>
<p><code>std::size_t</code> ist ein <code>unsigned</code> -Typ, muss also positives Vorzeichen haben. Eine Prüfung auf negative Werte ist Schwachsinn, oder sogar gefährlich, da diese implizit zu <code>unsigend</code> gecastet werden.<br />
Betrachte folgendes Beispiel:</p>
<pre><code class="language-cpp">std::size_t size;
if (size &lt;= -1) throw bla; // oh oh...
</code></pre>
<p>Siassei schrieb:</p>
<blockquote>
<p>Ein Frage hätte ich noch. Ich überschreibe den &quot;normalen&quot; Operator delete (global oder für eine Klasse). Muss ich den Destruktor manuell im Code aufrufen oder erledigt sich das beim bereinigen mit z.B. free().</p>
</blockquote>
<p>Du musst den Destruktor selbst aufrufen, auch <code>free()</code> gibt nur Speicher frei. Pass auf, dass du die C-Speicherverwaltung nicht mit der von C++ vermischst, also z.B. mit <code>new</code> anforderst und mit <code>free()</code> freigibst.</p>
<p>Mit Templates kannst du dir aber eine Funktion schreiben:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void delete_obj(const T* ptr)
{
    ptr-&gt;~T();
    operator delete(ptr);
}
</code></pre>
<p>Siassei schrieb:</p>
<blockquote>
<p>Kann ich irgendwie die Typinformationen speichern, damit ich folgendes machen kann</p>
</blockquote>
<p>Nein, nicht wirklich. Du müsstest schon jeden Typen einzeln behandeln. Mit Templates liesse sich das vielleicht ein wenig komfortabler gestalten, aber schlussendlich musst du trotzdem schauen, dass jeder Typ richtig zerstört wird. Du solltest aber von solchen Ideen wegkommen, wenn du C++ programmierst. Hier ist der Objektersteller dafür verantwortlich, dass die Objekte korrekt zerstört werden. Genauso muss er sicherstellen, dass er Speicher wieder freigibt. Versuche, GarbageCollector-ähnliche Konstrukte nachzubauen, die ja so viel benutzerfreundlicher sind, haben selten etwas gebracht. Im Gegenteil, man nimmt dem Anwender die Kontrolle weg, schränkt ihn ein und sorgt für unangenehme Überraschungen.</p>
<p>Siassei schrieb:</p>
<blockquote>
<p>Wie sieht es eigentlich bei Stukturen aus? Wenn ich mich nicht recht erinnere, gibt es zwei Sorten. C konforme und nicht C konforme Strukturen. Ersteres müsste ich doch mich free() einfach freigeben können, oder?</p>
<p>Mit was könnte ich das Überprüfen? In &lt;type_traits&gt; konnte ich nichts finden.</p>
</blockquote>
<p>Das wäre <code>boost::is_pod</code> . Aber das brauchst du nicht. Wenn du generisch (siehe oberes Beispiel) den Destruktor aufrufst, wird automatisch geschaut, ob der entsprechende Typ einen hat oder nicht. Auch bei <code>int</code> zum Beispiel wird der Aufruf einfach ignoriert.</p>
<p>Siassei schrieb:</p>
<blockquote>
<p>Fragen, über Fragen und ich finde keine Anworten <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>
</blockquote>
<p>So, ich hoffe, ich konnte dir einigermassen helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719516</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 02 Jun 2009 10:56:51 GMT</pubDate></item><item><title><![CDATA[Reply to Placement delete, sowie weitere Fragen on Tue, 02 Jun 2009 14:28:42 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>danke für deine Antworten und ich hab nun einen Ansatz, denn ich weiter verfolge. Danke <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>
<blockquote>
<p>Hier ist der Objektersteller dafür verantwortlich, dass die Objekte korrekt zerstört werden. Genauso muss er sicherstellen, dass er Speicher wieder freigibt. Versuche, GarbageCollector-ähnliche Konstrukte nachzubauen, die ja so viel benutzerfreundlicher sind, haben selten etwas gebracht. Im Gegenteil, man nimmt dem Anwender die Kontrolle weg, schränkt ihn ein und sorgt für unangenehme Überraschungen.</p>
</blockquote>
<p>Das sehe ich etwas anders. Ein großer Nachteil der vorhandenen Lösungen ist die fehlende Fragmentierung des Speicherbereiches. Oder habe ich da was überlesen? Zudem verbraucht der delete-Operator auch ein paar Resourcen und das kann sich bei kritischen Prozessen negativ auswirken.<br />
Eine gute Vorbereitung vor intensiven Aufgaben und das spätere Zusammenräumen liefert mit Sicherheit ein gutes Verhalten. Da nur das Ergebnis zählt und aufräumen kann man danach auch noch. Zumindestens solange genügend Platz da ist <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>Ich freue mich schon auf meine ersten Ergebnissen <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 />
Achja, das ganze ist ein Hobby und wird mit Sicherheit nicht produktiv von mir eingesetzt.</p>
<p>Gruß<br />
Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719715</guid><dc:creator><![CDATA[Siassei]]></dc:creator><pubDate>Tue, 02 Jun 2009 14:28:42 GMT</pubDate></item><item><title><![CDATA[Reply to Placement delete, sowie weitere Fragen on Tue, 02 Jun 2009 15:49:01 GMT]]></title><description><![CDATA[<p>Siassei schrieb:</p>
<blockquote>
<p>Das sehe ich etwas anders. Ein großer Nachteil der vorhandenen Lösungen ist die fehlende Fragmentierung des Speicherbereiches.</p>
</blockquote>
<p>Kapier ich nicht. Fragmentierung ist schlecht, wieso sollte das fehlen von ihr ein Nachteil sein? Und welche Lösungen meinst du denn?</p>
<blockquote>
<p>Zudem verbraucht der delete-Operator auch ein paar Resourcen und das kann sich bei kritischen Prozessen negativ auswirken.</p>
</blockquote>
<p>das delete musst du so oder so machen. da kommst du auch mit einem GC nicht drum herum.</p>
<blockquote>
<p>Eine gute Vorbereitung vor intensiven Aufgaben und das spätere Zusammenräumen liefert mit Sicherheit ein gutes Verhalten. Da nur das Ergebnis zählt und aufräumen kann man danach auch noch. Zumindestens solange genügend Platz da ist <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>
</blockquote>
<p>sowas ist mit GC aber nicht möglich.</p>
<p>Im Zweifelsfall weiss der Programmierer bescheid wann allokation und deallokation am sinnvollsten ist. Warum ihm diese Möglichkeit wegnehmen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719778</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 02 Jun 2009 15:49:01 GMT</pubDate></item><item><title><![CDATA[Reply to Placement delete, sowie weitere Fragen on Tue, 02 Jun 2009 15:50:10 GMT]]></title><description><![CDATA[<p>Siassei schrieb:</p>
<blockquote>
<p>Eine gute Vorbereitung vor intensiven Aufgaben und das spätere Zusammenräumen liefert mit Sicherheit ein gutes Verhalten.</p>
</blockquote>
<p>Das kann schon sein, aber das ist kein Garbage Collector. Wenn du dir einen Allokator schreibst, der viel Speicher auf einmal anfordert und dann die einzelnen Blöcke verteilt, ist das okay. Ob man dadurch einen Vorteil hat, hängt vom Anwendungsgebiet ab.</p>
<p>Ich meinte eher Konstrukte, die z.B. bei einem <code>new</code> kein <code>delete</code> mehr nötig machen (nein, nicht Smart-Pointer) und dann irgendwann das <code>delete</code> selbst durchführen, womöglich noch mit Konzepten wie Referenzzählung. Dadurch ist man zum Beispiel auch gezwungen, Objekte auf dem Heap anzulegen, und hat eine Reihe anderer Einschränkungen, auf die man achten muss. Also der Versuch, C++ durch einen GC-Nachbau bequem zu machen, ist böse. Dann sollte man Java nehmen. Aber auch in C++ ist es möglich, auf höherer Abstraktionsebene zu programmieren, sodass man sich nicht ständig um Freigeben und Byte-Schiebereien kümmern muss. Containerklassen verfolgen diesen Ansatz, oder zum Beispiel eben Smart Pointers und das Konzept des RAII.</p>
<p>Für deine Allokatorklasse kannst zum Beispiel Funktionen schreiben, die dir Speicher aus dem Pool beschaffen. Intern hast du Datenstrukturen, die die Adressen und Grössen von zuvor angefordertem Speicher beinhalten. Wenn du jetzt anforderst und nicht mehr genügend Speicher vorhanden ist, wird automatisch mehr allokiert. Zusätzlich könntest du Methoden anbieten, die viel Speicher aufs Mal anfordern, um nachher effizient zu sein. Oder Methoden, die allen unbenutzten Speicher freigeben. Und so weiter...</p>
<p>Dass die Allokatorklasse aber auch die Zerstörung und Konstruktion der Objekte selber nach Ermessen durchführt, scheint mir jedoch keine gute Lösung zu sein. Du könntest das vielleicht bei den Schnittstellenfunktionen implementieren, sodass beim Aufruf zuerst Speicher angefordert und dann konstruiert wird. Aber auf diese Weise kann man sich auch sicher sein, dass man beim Aufruf der Lösch-Methode den Destruktor aufruft - das ist teilweise wichtig für die Programmsemantik. Damit hast du auch das Problem nicht, Typen dynamisch zu speichern - <code>void*</code> reicht schliesslich für rohen Speicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719780</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 02 Jun 2009 15:50:10 GMT</pubDate></item><item><title><![CDATA[Reply to Placement delete, sowie weitere Fragen on Tue, 02 Jun 2009 21:24:02 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p><strong>1.1</strong> Es gibt kein Placement Delete.</p>
<p><strong>3.1</strong> Placement Delete gibt es wie gesagt nicht.</p>
</blockquote>
<p>Natürlich gibt es placement delete.</p>
<p>Placement delete wird dann aufgerufen, wenn du versuchst ein Objekt mittels placement new anzulegen, und der ctor mit einer Exception beendet wird.</p>
<p>Dann hätte man nämlich keine Möglichkeit, den Speicher korrekt zurückzugeben, da man delete an der Stelle eben nicht selbst aufrufen kann.</p>
<p>Ich hoffe ich habe das soweit richtig in Erinnerung.</p>
<p>Muss die Stelle im Standard suchen, bin mir aber 99% sicher dass placement delete im 03er Standard definiert ist. Implementiert ist es auf jeden Fall in einigen Compilern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719995</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 02 Jun 2009 21:24:02 GMT</pubDate></item><item><title><![CDATA[Reply to Placement delete, sowie weitere Fragen on Tue, 02 Jun 2009 21:47:30 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p><strong>1.1</strong> Es gibt kein Placement Delete.</p>
<p><strong>3.1</strong> Placement Delete gibt es wie gesagt nicht.</p>
</blockquote>
<p>Natürlich gibt es placement delete.</p>
<p>Placement delete wird dann aufgerufen, wenn du versuchst ein Objekt mittels placement new anzulegen, und der ctor mit einer Exception beendet wird.</p>
<p>Dann hätte man nämlich keine Möglichkeit, den Speicher korrekt zurückzugeben, da man delete an der Stelle eben nicht selbst aufrufen kann.</p>
<p>Ich hoffe ich habe das soweit richtig in Erinnerung.</p>
<p>Muss die Stelle im Standard suchen, bin mir aber 99% sicher dass placement delete im 03er Standard definiert ist. Implementiert ist es auf jeden Fall in einigen Compilern.</p>
</blockquote>
<p>Ähm und was soll placement delete machen? Placement new legt ein Objekt in rohem Speicher an, der schon vorher auf irgendeine Art besorgt wurde. Wenn der Ctor beim placement new eine Exception wirft, bleibt der rohe Speicher eben roher Speicher - und wenn die Exception nicht gefangen wird oder der Speicher per RAII freigegeben wird, dann ists ein Speicherleck. Die freigabe des rohen Speichers passiert mit dem Gegenstück zu der Funktion, die den rohen Speicher angefordert hat. Also z.B. free(), expliziter Aufruf <code>operator delete</code> (nicht <code>delete</code> !), allocator::deallocate() oder was auch immer.<br />
Das läuft genau wie bei jeder anderen Exception auch, sprich es passiert das gleiche wie wenn man an der Stelle des placement new ein &quot;throw XYException&quot; geschrieben hätte.<br />
Das Gegenstück zum placement new (Zerstörung des Objekts ohne Speicherfreigabe) ist der explizite Dtor-Aufruf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1720009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720009</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 02 Jun 2009 21:47:30 GMT</pubDate></item><item><title><![CDATA[Reply to Placement delete, sowie weitere Fragen on Tue, 02 Jun 2009 22:00:28 GMT]]></title><description><![CDATA[<p>Zudem muss es nicht sein, dass der Speicher, in dem das Objekt über Placement New konstruiert wird, mit <code>operator new</code> angefordert wurde, nur Platz für 1 Objekt bietet und gerade am Anfang dieses Objekts beginnt. Das &quot;Placement Delete&quot; wüsste also gar nicht <em>wie</em> und <em>was</em> freigeben - mal abgesehen davon, dass Freigeben nicht die Aufgabe ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1720017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720017</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 02 Jun 2009 22:00:28 GMT</pubDate></item><item><title><![CDATA[Reply to Placement delete, sowie weitere Fragen on Tue, 02 Jun 2009 22:18:21 GMT]]></title><description><![CDATA[<p>placement new beschränkt sich ja nicht auf die &quot;void *&quot; Variante. Ich kann ja eine eigene &quot;placement new&quot; Funktion definieren, die z.B. einen Zeiger auf einen Pool nimmt. Ala</p>
<pre><code class="language-cpp">void* operator new(size_t n, Pool* pool)
{
    return pool-&gt;alloc(n);
}
</code></pre>
<p>Wenn ich damit jetzt ein Objekt anlege:</p>
<pre><code class="language-cpp">void foo()
{
    Pool p;
    Foo* f = new (&amp;p) Foo();
}
</code></pre>
<p>Und angenommen der ctor von Foo wirft mir ne Exception. Wie soll ich dann jemals an den Wert kommen, den mein eigener placement new Operator zurückgegeben hat? Kann ich nicht, daher muss ich hier eine eigene placement delete Funktion definieren:</p>
<pre><code class="language-cpp">void operator delete(void* p, Pool* pool)
{
    pool-&gt;release(p);
}
</code></pre>
<p>Der Compiler ist dann so nett, falls Foo::Foo() eine Exception werfen sollte, mir den zu meinem operator new passenden operator delete aufzurufen, so dass ich den Speicher wieder freigeben kann.</p>
<p>Die &quot;vordefinierten&quot; placement new und placement delete Funktionen sehen einfach so aus:</p>
<pre><code class="language-cpp">void* operator new (size_t n, void* p)
{
    return p;
}

void operator delete(void*, void*)
{
}
</code></pre>
<p>In Wirklichkeit gibt's mehr vordefinierte Varianten, aber das steht alles im Wikipedia Artikel, den man ruhig mal lesen sollte:</p>
<p><a href="http://en.wikipedia.org/wiki/Placement_syntax" rel="nofollow">http://en.wikipedia.org/wiki/Placement_syntax</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1720021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720021</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 02 Jun 2009 22:18:21 GMT</pubDate></item><item><title><![CDATA[Reply to Placement delete, sowie weitere Fragen on Tue, 02 Jun 2009 22:22:42 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Natürlich gibt es placement delete.<br />
Placement delete wird dann aufgerufen, wenn du versuchst ein Objekt mittels placement new anzulegen, und der ctor mit einer Exception beendet wird.<br />
Dann hätte man nämlich keine Möglichkeit, den Speicher korrekt zurückzugeben, da man delete an der Stelle eben nicht selbst aufrufen kann.<br />
Ich hoffe ich habe das soweit richtig in Erinnerung.</p>
</blockquote>
<p>Das ist völlig korrekt.</p>
<p>Ich mag das zum Beispiel benutzen, wenn ich direkt in Container reinkonstruieren will.</p>
<pre><code class="language-cpp">void* operator new(size_t size,Stack&lt;Foo&gt;&amp; s){
  assert(size==8);
  s.alloc();
  return s.top();
}
void operator delete&lt;void* p,Stack&lt;Foo&gt;&amp; s){
  assert(p==s.top());
  s.free();
}
</code></pre>
<p>hier wird das placement delete aufgerufen, wenn der ctor von foo eine exception wirft. irgendwas sinnvolles muß ja geschehen, um das s.alloc() wieder rückgängig zu machen, ein speicherloch hängenzulassen wäre nicht ok. une keiner sagt, daß man den speicher mit dem normalen delete löschen dürfte.<br />
in der main mache ich nur</p>
<pre><code class="language-cpp">Stack&lt;Foo&gt; s;
new(s) Foo(konstrukltorArgumente);
</code></pre>
<p>das kann in vielerlei hinsicht ein netter trick sein. ich benutze es gelegentlich, um sachen wie streams in container zu stopfen oder auch mal, um kopierungen zu sparen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1720024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720024</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 02 Jun 2009 22:22:42 GMT</pubDate></item><item><title><![CDATA[Reply to Placement delete, sowie weitere Fragen on Tue, 02 Jun 2009 23:15:13 GMT]]></title><description><![CDATA[<p>Huch, schon wieder was gelernt. Das Konzept mit dem zugehörigen <code>operator delete</code> war mir eigentlich bekannt (ich hab die Operatoren schon mit <code>__FILE__</code> und <code>__LINE__</code> als zusätzliche Argumente benutzt). Bisher dachte ich jedoch, Placement New würde nur die <code>new</code> -Version bezeichnen, die ein Objekt an eine rohe Speicherstelle konstruiert. Auch vom Namen her schien mir das noch sinnvoll (Objekt in Speicher platzieren)... <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>Auf jeden Fall danke für die Aufklärung! <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/1720043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720043</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 02 Jun 2009 23:15:13 GMT</pubDate></item><item><title><![CDATA[Reply to Placement delete, sowie weitere Fragen on Wed, 03 Jun 2009 05:45:07 GMT]]></title><description><![CDATA[<p>Ist mir auch sehr neu dass man die anderen operator new und operator delete auch als &quot;palcement&quot; bezeichnet - mir sind bisher nur die Bezeichnungen &quot;user defined new/delete&quot; und &quot;non-standard new/delete&quot; untergekommen. Wieder was gelernt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1720077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720077</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 03 Jun 2009 05:45:07 GMT</pubDate></item></channel></rss>