<?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[Erzeugung bei Array sichergestellt?]]></title><description><![CDATA[<p>Abend!</p>
<p>wenn ich ein Array von Objekten anlege:</p>
<pre><code class="language-cpp">Foo* f = new Foo[100];
</code></pre>
<p>Ist dann garantiert, dass die Konstruktoren der Reihenfolge nach aufgerufen werden? Sprich wird IMMER das Objekt f[0] erzeugt, dann f[1], dann f[2] etc.?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/292186/erzeugung-bei-array-sichergestellt</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 02:57:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/292186.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 04 Sep 2011 19:02:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Erzeugung bei Array sichergestellt? on Sun, 04 Sep 2011 19:02:20 GMT]]></title><description><![CDATA[<p>Abend!</p>
<p>wenn ich ein Array von Objekten anlege:</p>
<pre><code class="language-cpp">Foo* f = new Foo[100];
</code></pre>
<p>Ist dann garantiert, dass die Konstruktoren der Reihenfolge nach aufgerufen werden? Sprich wird IMMER das Objekt f[0] erzeugt, dann f[1], dann f[2] etc.?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2114852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2114852</guid><dc:creator><![CDATA[Matir]]></dc:creator><pubDate>Sun, 04 Sep 2011 19:02:20 GMT</pubDate></item><item><title><![CDATA[Reply to Erzeugung bei Array sichergestellt? on Sun, 04 Sep 2011 21:59:08 GMT]]></title><description><![CDATA[<p>Davon kannst du, soweit ich weiß, nicht ausgehen. Zumindest ist mir nichts im Standard bekannt das dir diese Reihenfolge wirklich garantiert.</p>
<p>Du kannst aber new für deine Anforderung überschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2114972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2114972</guid><dc:creator><![CDATA[hmpf]]></dc:creator><pubDate>Sun, 04 Sep 2011 21:59:08 GMT</pubDate></item><item><title><![CDATA[Reply to Erzeugung bei Array sichergestellt? on Sun, 04 Sep 2011 22:50:59 GMT]]></title><description><![CDATA[<p>Matir schrieb:</p>
<blockquote>
<p>wenn ich ein Array von Objekten anlege:</p>
<pre><code class="language-cpp">Foo* f = new Foo[100];
</code></pre>
<p>Ist dann garantiert, dass die Konstruktoren der Reihenfolge nach aufgerufen werden? Sprich wird IMMER das Objekt f[0] erzeugt, dann f[1], dann f[2] etc.?</p>
</blockquote>
<p>ja, das gilt im Übrigen für jedes Array, nicht nur für solche, die mit new erzeugt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2114981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2114981</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 04 Sep 2011 22:50:59 GMT</pubDate></item><item><title><![CDATA[Reply to Erzeugung bei Array sichergestellt? on Sun, 04 Sep 2011 22:56:41 GMT]]></title><description><![CDATA[<p>Ich denke nicht, dass man davon ausgehen kann. Unter der Annahme, dass Foo non-POD ist (sonst stellt sich die Frage gar nicht), gilt nach 5.3.4 (15):</p>
<p>ISO/IEC 14882:2003 5.3.4 (15) schrieb:</p>
<blockquote>
<p>A new-expression that creates an object of type T initializes that object as follows:<br />
— If the new-initializer is omitted:<br />
— <strong>If T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is default-initialized (8.5).</strong> If T is a const-qualified type, the underlying class type shall have a user-declared default constructor.</p>
</blockquote>
<p>Und default-initialized ist nach 8.5 (5) wie folgt zu verstehen:</p>
<p>ISO/IEC 14882:2004 8.5 (5) schrieb:</p>
<blockquote>
<p>To default-initialize an object of type T means:<br />
— if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);<br />
— <strong>if T is an array type, each element is default-initialized;</strong><br />
— otherwise, the object is zero-initialized.</p>
</blockquote>
<p>...und das ist auch alles, was ich im Standard dazu finde. Über die Reihenfolge steht nirgends ein Wort geschrieben - es scheint fast so, als bliebe das <em>undefiniert</em>.</p>
<p>operator new zu überladen dürfte hier auch nicht helfen, da der ja nur für die Speicherbesorgung zuständig ist. Man könnte wohl mit placement-new entsprechendes Verhalten erzwingen:</p>
<pre><code class="language-cpp">char *ptr = new char[sizeof(Foo) * 100];

for(std::size_t i = 0; i &lt; 100; ++i) {
  new(ptr + i * sizeof(Foo)) Foo();
}

Foo *f = reinterpret_cast&lt;Foo*&gt;(ptr);
</code></pre>
<p>aber das ist natürlich alles andere als hübsch. Mit std::vector könnte man den Speicher vorher reservieren und 100 mal ein default-initialisiertes Objekt push_backen; das würde ich ggf. allerdings durch einen Profiler jagen, um zu sehen, ob Performance-Einbußen entstehen.</p>
<p>Wieso ist das überhaupt von Bedeutung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2114983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2114983</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 04 Sep 2011 22:56:41 GMT</pubDate></item><item><title><![CDATA[Reply to Erzeugung bei Array sichergestellt? on Sun, 04 Sep 2011 23:33:25 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>ja, das gilt im Übrigen für jedes Array, nicht nur für solche, die mit new erzeugt werden.</p>
</blockquote>
<p>Bin natürlich geneigt dem sofort zu glauben, weil es aus deinem Munde kommt. Könntest du trotzdem noch die Erklärung, den Paragrafen hinzuliefern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2114987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2114987</guid><dc:creator><![CDATA[hmpf]]></dc:creator><pubDate>Sun, 04 Sep 2011 23:33:25 GMT</pubDate></item><item><title><![CDATA[Reply to Erzeugung bei Array sichergestellt? on Mon, 05 Sep 2011 08:27:11 GMT]]></title><description><![CDATA[<blockquote>
<p>When an array of class objects is initialized (either explicitly or implicitly), the constructor shall be called<br />
for each element of the array, following the subscript order; see 8.3.4. [Note: destructors for the array elements<br />
are called in reverse order of their construction. ]</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2115056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115056</guid><dc:creator><![CDATA[12.6]]></dc:creator><pubDate>Mon, 05 Sep 2011 08:27:11 GMT</pubDate></item><item><title><![CDATA[Reply to Erzeugung bei Array sichergestellt? on Mon, 05 Sep 2011 12:59:51 GMT]]></title><description><![CDATA[<p>Das wäre dann §12.6(3).</p>
<p>Danke dir 12.6! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115241</guid><dc:creator><![CDATA[hmpf]]></dc:creator><pubDate>Mon, 05 Sep 2011 12:59:51 GMT</pubDate></item></channel></rss>