<?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[wie weiss delete[] array die Array Grösse]]></title><description><![CDATA[<p>Hallo,</p>
<p>Eine Frage zu dynamischen Arrays:</p>
<pre><code>int*array = new int[20];
delete[] array;
</code></pre>
<p>bracht delete[] array nicht die Informationen zur Größe von array um diese freigeben zu können?<br />
wenn ja, wo und wie ist die Größe verfügbar?<br />
sollte es dazu nicht eine Standardfunktion geben, memSizeInBytes(array) oder so?</p>
<p>Vielen Dank im Voraus für jede hilfreiche Information!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/338819/wie-weiss-delete-array-die-array-grösse</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Apr 2026 02:52:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/338819.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 13 Jul 2016 05:58:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 05:58:53 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Eine Frage zu dynamischen Arrays:</p>
<pre><code>int*array = new int[20];
delete[] array;
</code></pre>
<p>bracht delete[] array nicht die Informationen zur Größe von array um diese freigeben zu können?<br />
wenn ja, wo und wie ist die Größe verfügbar?<br />
sollte es dazu nicht eine Standardfunktion geben, memSizeInBytes(array) oder so?</p>
<p>Vielen Dank im Voraus für jede hilfreiche Information!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502104</guid><dc:creator><![CDATA[kurze_frage]]></dc:creator><pubDate>Wed, 13 Jul 2016 05:58:53 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 06:29:45 GMT]]></title><description><![CDATA[<p>Wird sich irgendwo von der Speicherverwaltung gemerkt. Kommt man mit Standardmitteln nicht dran. Das <em>kann</em> zum Beispiel einfach in den Bytes vor dem Speicherbereich stehen, bei vielen Implementierungen aber auch ganz woanders.</p>
<p>Statt new benutze vector oder ähnliches. Die merken sich ihre Größe und man kann zudem nichts mehr falsch machen bei der Speicherverwaltung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502105</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 13 Jul 2016 06:29:45 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 07:22:00 GMT]]></title><description><![CDATA[<p>ja, das ist ein fehler im design von C++.<br />
dem new sagt man die größe, also sollte man dem delete auch die größe sagen (müssen). das ist allerdings viel schlimmer, wenn man einmal sich um allocatoren selbst kümmern will/muss.<br />
das ist auch einer der gründe, warum man new und delete nicht manuell verwenden sollte, wenn man nicht gerade low-level arbeit macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502111</guid><dc:creator><![CDATA[dove]]></dc:creator><pubDate>Wed, 13 Jul 2016 07:22:00 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 08:31:47 GMT]]></title><description><![CDATA[<p>dove schrieb:</p>
<blockquote>
<p>ja, das ist ein fehler im design von C++.<br />
dem new sagt man die größe, also sollte man dem delete auch die größe sagen (müssen).</p>
</blockquote>
<p>Soll das ein Scherz sein? Es hätte keinen Vorteil, beim Löschen eine Größe angeben zu müssen und wäre bloß eine weitere mögliche Fehlerursache (von denen es bei C++ schon mehr als genug gibt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502120</guid><dc:creator><![CDATA[Andromeda]]></dc:creator><pubDate>Wed, 13 Jul 2016 08:31:47 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 09:13:38 GMT]]></title><description><![CDATA[<p>Andromeda schrieb:</p>
<blockquote>
<p>Soll das ein Scherz sein? Es hätte keinen Vorteil, beim Löschen eine Größe angeben zu müssen und wäre bloß eine weitere mögliche Fehlerursache (von denen es bei C++ schon mehr als genug gibt).</p>
</blockquote>
<p>Du müsstest die Größe ja nicht mit angeben, dass kann der compiler machen, den der kennt bei einem delete die Größe des Objekts. Mit der Information kann man einen allocator effektiver implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502123</guid><dc:creator><![CDATA[Torsten Robitzki]]></dc:creator><pubDate>Wed, 13 Jul 2016 09:13:38 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 09:17:29 GMT]]></title><description><![CDATA[<pre><code>int elemente;
cout&lt;&lt;&quot;Wie viele Elemente moechten Sie anlegen?&quot;&lt;&lt;endl;
cin&gt;&gt;elemente;

int array[]=new int[elemente];
</code></pre>
<p>wo weiß der compiler das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502124</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Wed, 13 Jul 2016 09:17:29 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 09:28:31 GMT]]></title><description><![CDATA[<p>An der Stelle, wird er, bevor er die deallocation function aufruft, die Menge der Element da nachschlagen, wo er sie vorher abgelegt hat. Ok, dass ist an der Stelle jetzt nicht mehr der Compiler, sonder die Runtime. Worum geht es Dir bei Deiner Frage?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502125</guid><dc:creator><![CDATA[Torsten Robitzki]]></dc:creator><pubDate>Wed, 13 Jul 2016 09:28:31 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 09:27:25 GMT]]></title><description><![CDATA[<p>dove schrieb:</p>
<blockquote>
<p>ja, das ist ein fehler im design von C++.</p>
</blockquote>
<p>&lt; C++14</p>
<p><a href="http://http" rel="nofollow">http://http</a>://en.cppreference.com/w/cpp/memory/new/operator_delete</p>
<blockquote>
<p>void operator delete ( void* ptr, std::size_t sz ); (5) (since C++14)<br />
void operator delete[]( void* ptr, std::size_t sz ); (6) (since C++14)</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2502126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502126</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 13 Jul 2016 09:27:25 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 09:33:06 GMT]]></title><description><![CDATA[<p>Es ist mehr noch ein Fehler von C gewesen, wie Alexandrescu angemerkt hat:</p>
<pre><code class="language-cpp">struct Blk {
    void* ptr;
    size_t size;
}

Blk malloc(int);
void free(Blk);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2502127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502127</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Wed, 13 Jul 2016 09:33:06 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 09:41:19 GMT]]></title><description><![CDATA[<p>ja, an alexandrescu habe ich auch gedacht. v.a. sein vortrag darüber, wie er (heutzutage) allokatoren designen würde. tja, und dann schaut man in die standard-pläne und findet so etwas wie polymorphic_allocator. zu wenig, zu langsam, zu umständlich...</p>
<p>danke manni66 für den hinweis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502130</guid><dc:creator><![CDATA[dove]]></dc:creator><pubDate>Wed, 13 Jul 2016 09:41:19 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 13:58:45 GMT]]></title><description><![CDATA[<p>Torsten Robitzki schrieb:</p>
<blockquote>
<p>Du müsstest die Größe ja nicht mit angeben, dass kann der compiler machen, den der kennt bei einem delete die Größe des Objekts. Mit der Information kann man einen allocator effektiver implementieren.</p>
</blockquote>
<p>Wie wird das begründet? Was ist der Nachteil dabei, die Länge des allozierten Speicherblocks in ptr[-irgendwas] unterzubringen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502162</guid><dc:creator><![CDATA[Andromeda]]></dc:creator><pubDate>Wed, 13 Jul 2016 13:58:45 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 14:10:27 GMT]]></title><description><![CDATA[<p>Andromeda schrieb:</p>
<blockquote>
<p>Torsten Robitzki schrieb:</p>
<blockquote>
<p>Du müsstest die Größe ja nicht mit angeben, dass kann der compiler machen, den der kennt bei einem delete die Größe des Objekts. Mit der Information kann man einen allocator effektiver implementieren.</p>
</blockquote>
<p>Wie wird das begründet? Was ist der Nachteil dabei, die Länge des allozierten Speicherblocks in ptr[-irgendwas] unterzubringen?</p>
</blockquote>
<p>Du must zur Laufzeit etwas ablegen, was in der Regel zur compiler-zeit bekannt ist. Und Du must etwas mehr Speicher aufwenden, als nötig ist, um die Information abzulegen.</p>
<p>Meist sind Allokatoren so aufgebaut, dass sie für kleinere, Speichergrößen einen eigenen Allocator haben. Aus einem `delete t` könnte also bei zur compilezeit bekanntem sizeof(*t) das direkte Einhängen des Zeigers in eine freelist für diese Länge werden. Das wären dann zwei Zuweisungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502164</guid><dc:creator><![CDATA[Torsten Robitzki]]></dc:creator><pubDate>Wed, 13 Jul 2016 14:10:27 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 14:20:24 GMT]]></title><description><![CDATA[<p>Der genannte Vortrag ist dieser hier:<br />
<a href="https://www.youtube.com/watch?v=LIb3L4vKZ7U" rel="nofollow">https://www.youtube.com/watch?v=LIb3L4vKZ7U</a></p>
<p>Ist zu empfehlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502169</guid><dc:creator><![CDATA[wob]]></dc:creator><pubDate>Wed, 13 Jul 2016 14:20:24 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 14:33:27 GMT]]></title><description><![CDATA[<p>Torsten Robitzki schrieb:</p>
<blockquote>
<p>Andromeda schrieb:</p>
<blockquote>
<p>Torsten Robitzki schrieb:</p>
<blockquote>
<p>Du müsstest die Größe ja nicht mit angeben, dass kann der compiler machen, den der kennt bei einem delete die Größe des Objekts. Mit der Information kann man einen allocator effektiver implementieren.</p>
</blockquote>
<p>Wie wird das begründet? Was ist der Nachteil dabei, die Länge des allozierten Speicherblocks in ptr[-irgendwas] unterzubringen?</p>
</blockquote>
<p>Du must zur Laufzeit etwas ablegen, was in der Regel zur compiler-zeit bekannt ist. Und Du must etwas mehr Speicher aufwenden, als nötig ist, um die Information abzulegen.</p>
</blockquote>
<p>Okay, aber die Längeninformation zu sparen, halte ich für Mikrooptimierung. Meiner Meinung nach, ist das in den meisten Fällen total sinnfrei. Na ja, aber wer es braucht ...</p>
<p>Torsten Robitzki schrieb:</p>
<blockquote>
<p>Meist sind Allokatoren so aufgebaut, dass sie für kleinere, Speichergrößen einen eigenen Allocator haben. Aus einem `delete t` könnte also bei zur compilezeit bekanntem sizeof(*t) das direkte Einhängen des Zeigers in eine freelist für diese Länge werden. Das wären dann zwei Zuweisungen.</p>
</blockquote>
<p>Ich sehe es schon kommen: irgendwann hat C++ auch einen schicken, standardmäßigen Garbage Collector. <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/2502170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502170</guid><dc:creator><![CDATA[Andromeda]]></dc:creator><pubDate>Wed, 13 Jul 2016 14:33:27 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 14:45:37 GMT]]></title><description><![CDATA[<p>Andromeda schrieb:</p>
<blockquote>
<p>Okay, aber die Längeninformation zu sparen, halte ich für Mikrooptimierung. Meiner Meinung nach, ist das in den meisten Fällen total sinnfrei. Na ja, aber wer es braucht ...</p>
</blockquote>
<p>Naja, wenn Du sehr viele kleine Objekte hast, deren dynamisch alloziierter Speicher nicht viel größer als sizeof(void*) ist, dann fällt das schon ins Gewicht. Entscheidend ist aber, dass wenn die Größe zur Compiler-Zeit bekannt ist, ich evtl. schon einige Schritte bei der Speicherverwaltung sparen kann. Und C++ ist halt um &quot;You pay only for what you use...&quot; (oder so ähnlich) gebaut <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/2502175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502175</guid><dc:creator><![CDATA[Torsten Robitzki]]></dc:creator><pubDate>Wed, 13 Jul 2016 14:45:37 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 14:55:33 GMT]]></title><description><![CDATA[<p>Torsten Robitzki schrieb:</p>
<blockquote>
<p>Naja, wenn Du sehr viele kleine Objekte hast, deren dynamisch alloziierter Speicher nicht viel größer als sizeof(void*) ist, dann fällt das schon ins Gewicht.</p>
</blockquote>
<p>Ja, durchaus.</p>
<p>Torsten Robitzki schrieb:</p>
<blockquote>
<p>Entscheidend ist aber, dass wenn die Größe zur Compiler-Zeit bekannt ist, ich evtl. schon einige Schritte bei der Speicherverwaltung sparen kann.</p>
</blockquote>
<p>Da kann ich dir jetzt nicht ganz folgen. Dass der Allokator die Größe nur intern kennt und man sie nicht abfragen kann, halte ich auch für eine Design Schwäche. Mit dem Vorschlag von Alexandrescu kann ich auch durchaus was anfangen. Da wird die Größe aber auch zur Laufzeit mitverwaltet. Aber wie willst du das einsparen und nur vom Compiler erledigen lassen, wenn du im Programm Zeiger rumreichst, die nicht die Größeninformationen mitschleppen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502177</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Wed, 13 Jul 2016 14:55:33 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 15:10:36 GMT]]></title><description><![CDATA[<p>Mechanics schrieb:</p>
<blockquote>
<p>Aber wie willst du das einsparen und nur vom Compiler erledigen lassen, wenn du im Programm Zeiger rumreichst, die nicht die Größeninformationen mitschleppen?</p>
</blockquote>
<p>Wenn wir vom nicht array-Fall ausgehen, dann steckt die Größeninformation im Typen für den Fall dass der statische Typ dem dynamischen Typ entspricht (also kein delete über einen Zeiger auf eine Basis mit virtuellem Destruktor).</p>
<p>Für arrays muss die Größe des Arrays zur Laufzeit mit abgelegt werden, weil sich die nicht aus dem Typen ableiten lässt.</p>
<p>Da haben wir wohl etwas aneinander vorbei geredet, sorry.</p>
<p>Typen wie std::vector&lt;&gt;, die wahrscheinlich die Hauptnutzer von dynamisch alloziierten arrays sind, kennen die Größe des alloziierten Speichers sogar nochmal explizit, sodass der allocator die Information an der Stelle auch nicht mehr braucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502180</guid><dc:creator><![CDATA[Torsten Robitzki]]></dc:creator><pubDate>Wed, 13 Jul 2016 15:10:36 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 15:10:00 GMT]]></title><description><![CDATA[<p>Torsten Robitzki schrieb:</p>
<blockquote>
<p>Naja, wenn Du sehr viele kleine Objekte hast, deren dynamisch alloziierter Speicher nicht viel größer als sizeof(void*) ist, dann fällt das schon ins Gewicht.</p>
</blockquote>
<p>Sicherlich; je höher die Frequenz von new/delete, desto störender macht sich jeder einzelne Taktzyklus dieser Funktionen bemerkbar. Wer aber auf solche Probleme stößt, der sollte vielleicht bessser mal seinen Programmierstil überprüfen, als auf die Heap-Verwaltung zu schimpfen.</p>
<p>Torsten Robitzki schrieb:</p>
<blockquote>
<p>Entscheidend ist aber, dass wenn die Größe zur Compiler-Zeit bekannt ist, ich evtl. schon einige Schritte bei der Speicherverwaltung sparen kann.</p>
</blockquote>
<p>Ja, klar. Ein schlauer Compiler wird womöglich für sowas gar nicht erst den Heap benutzen, sondern solche kurzlebigen Miniobjekte im Stackframe speichern, falls sie funktionslokal bleiben, oder gar eine eigene Speicherverwaltung dafür mitbringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502182</guid><dc:creator><![CDATA[Andromeda]]></dc:creator><pubDate>Wed, 13 Jul 2016 15:10:00 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 15:20:29 GMT]]></title><description><![CDATA[<p>dove schrieb:</p>
<blockquote>
<p>ja, das ist ein fehler im design von C++.<br />
dem new sagt man die größe, also sollte man dem delete auch die größe sagen (müssen).</p>
</blockquote>
<p>Was ist dein Argument dafür? Symmetrie? Kann ich nicht durchgehen lassen, ist beim Programmieren oft einfach keine gute Idee alles auf Teufel-komm-raus symmetrischen machen zu wollen.<br />
Mal ganz davon abgesehen dass oft nicht klar ist was &quot;symmetrisch&quot; überhaupt bedeuten soll.</p>
<p>Man könnte genau so sagen symmetrisch wäre es, wenn man bei new die Grösse angibt und nen Zeiger zurückbekommt, und bei delete den Zeiger angibt und die Grösse zurück bekommt. Wäre aber genau so beknackt (noch beknackter).</p>
<p>Und...<br />
Wenn es deiner Meinung gut/korrekt/... wäre dass man bei delete die Grösse mitgeben muss...<br />
Was ist dann mit fclose()? Sollte man da den Filenamen nochmal angeben müssen? -&gt; Blödsinn.<br />
Bzw. mit jedem Destruktor eines Objekts dessen Konstruktor man mit bestimmten Parametern aufgerufen hat?</p>
<p>Nene.<br />
Der Designfehler ist höchstens dass man die Grösse nicht abfragen kann. Weil die Implementierung sich die Grösse sowieso merken muss (zumindest bei Arrays aus Objekten mit nicht-trivialem Dtor).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502185</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 13 Jul 2016 15:20:29 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 15:36:00 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Nene.<br />
Der Designfehler ist höchstens dass man die Grösse nicht abfragen kann.</p>
</blockquote>
<p>Das kannst du doch spielend leicht umgehen, indem du sie selber speicherst.<br />
Jetzt wird es aber albern. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2502186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502186</guid><dc:creator><![CDATA[Andromeda]]></dc:creator><pubDate>Wed, 13 Jul 2016 15:36:00 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 16:18:43 GMT]]></title><description><![CDATA[<p>Jodocus hat es gleich erwähnt. Richtig designt wäre es so:</p>
<p>Jodocus schrieb:</p>
<blockquote>
<p>Es ist mehr noch ein Fehler von C gewesen, wie Alexandrescu angemerkt hat:</p>
<pre><code class="language-cpp">struct Blk {
    void* ptr;
    size_t size;
}

Blk malloc(int);
void free(Blk);
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2502193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502193</guid><dc:creator><![CDATA[dove]]></dc:creator><pubDate>Wed, 13 Jul 2016 16:18:43 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 17:36:13 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/14196">@Andromeda</a><br />
Natürlich kann man es leicht umgehen. Aber es verschwendet Speicher. Unnötiger Overhead der gerade bei vielen kleinen Allokationen leicht relevante Dimensionen annehmen kann.</p>
<p>Machst du eigentlich noch was anderes als mit <em>aus Prinzip</em> zu &quot;kritisieren&quot;, egal wie sinnvoll oder sinnlos die &quot;Kritik&quot; fachlich ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502211</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 13 Jul 2016 17:36:13 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 18:14:05 GMT]]></title><description><![CDATA[<p>Aber ist es nicht so dass die tatsächlich allozierte Größe eh Implmentierungsabhängig ist (also dass auch <em>mehr</em> Speicher reserviert werden kann als angefordert)?</p>
<p>Dann wäre es wieder relativ sinnlos auf die Größe zugreifen zu können, weil man sich ja nicht darauf verlassen kann dass diese auch der Größe des arrays entspricht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502224</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Wed, 13 Jul 2016 18:14:05 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 18:54:28 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Aber ist es nicht so dass die tatsächlich allozierte Größe eh Implmentierungsabhängig ist (also dass auch <em>mehr</em> Speicher reserviert werden kann als angefordert)?</p>
</blockquote>
<p>Ja, klar. Üblicherweise ist der zurückgebene Pointer Teil eines ListElements des Allokators und außerdem kann es durchaus sein, dass deine angefordete Speichergröße aufgerundet wird, weil der Allokator eine bestimmte Granularität voraussetzt, um Fragmentierung zu minimieren.</p>
<p>happystudent schrieb:</p>
<blockquote>
<p>Dann wäre es wieder relativ sinnlos auf die Größe zugreifen zu können, weil man sich ja nicht darauf verlassen kann dass diese auch der Größe des arrays entspricht.</p>
</blockquote>
<p>Nicht zwangsläufig, weil der Allokator das ja verrechnen kann. Zugegeben: das ist wieder ein Sonderfall, wie das vielzitierte hochfrequente allozieren und freigeben kleiner Objekte. Aber manche lieben sowas ja. <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/2502228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502228</guid><dc:creator><![CDATA[Andromeda]]></dc:creator><pubDate>Wed, 13 Jul 2016 18:54:28 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 19:06:20 GMT]]></title><description><![CDATA[<p>Andromeda schrieb:</p>
<blockquote>
<p>Aber manche lieben sowas ja. <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>
</blockquote>
<p>Das glaube ich nicht. Es gibt welche, die haben keine Ahnung von sowas und deswegen ist es denen egal (aber sie bevorzugen dann diesen Stil, ja). Aber es gibt auch viele Fälle, da kommst nicht drumherum. Allein schon type erasure wie bei std::function oder tausende andere Fälle, wo man das einfach braucht oder die Alternativen andere Nachteile haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502231</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Wed, 13 Jul 2016 19:06:20 GMT</pubDate></item><item><title><![CDATA[Reply to wie weiss delete[] array die Array Grösse on Wed, 13 Jul 2016 19:32:44 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/30076">@happystudent</a><br />
Wenn das Array aus Elementen besteht deren Destruktor nicht trivial ist, dann muss die exakte Grösse irgendwo gespeichert sein. Sonst wüsste die Implementierung ja nicht wie viele Objekte bei <code>delete[]</code> zerstört werden müssen bevor der Speicher freigegeben werden kann.<br />
Man könnte den Support für &quot;Grösse Abfragen&quot; auch einfach auf solche Arrays beschränken.</p>
<p>ps: Es gibt nämlich Allokatoren die Pools für kleine Allokationen verwenden, wo mehr als nur ein wenig aufgerundet werden muss. Also angenommen 160 Byte werden für 10 Objekte a 16 Byte angefordert, aber der kleinste passende Pool verwaltet 180 Byte Blöcke. Das wären dann 11 Objekte wenn man zurückrechnet. Bei Arrays aus Objekten mit trivialem Destruktor wäre das egal, es muss ja nur der Speicher freigegeben werden. Und das kann der Allokator, ohne dass er sich irgendwo pro Block merkt wie gross dieser war, so lange der Block aus einem seiner fixgrösse Pools stammt. (Man kann das so implementieren dass man anhand der Adresse feststellen kann aus welchem Pool ein Block kommt. Und damit kennt man dann die Grösse des Pool-Blocks, also die 180 Byte. Nicht aber die 160.)</p>
<p>Wenn der Destruktor aber aufgerufen werden muss, dann muss die Implementierung halt doch wissen dass es bloss 10 Objekte sind.<br />
D.h. wenn die Implementierung nicht an einen Allokator gebunden ist (=mit beliebigen Allokatoren klar kommen will/muss), dann muss sie - egal was der Allokator macht - die Grösse in diesem non-trivial-dtor Fall selbst nochmal irgendwo abspeichern.</p>
<p>Im Worst Case wären wird dann bei drei Kopien der Grösse:<br />
1x im bzw. für den Allokator selbst<br />
1x irgendwo für die C++ Implementierung<br />
1x im eigenen Programm</p>
<p>Sogesehen halte ich es schon für eine &quot;ungünstige&quot; Entscheidung dass man die Array-Grösse grundsätzlich nicht abfragen kann. Grundsätzlich immer wäre vermutlich auch verkehrt, weil man dadurch bei Allokatoren wie oben beschrieben und trivial-dtor Objekten wieder eine u.U. unnötige Kopie der Grösse erzwingen würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502232</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502232</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 13 Jul 2016 19:32:44 GMT</pubDate></item></channel></rss>