<?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[[solved] Initialisierungsreihenfolge in Initialisierungsliste von Konstruktor]]></title><description><![CDATA[<p>Hallo,</p>
<p>hab grad eben so just for fun mal versucht, Arrays in der Initialisierungsliste zu allozieren</p>
<pre><code class="language-cpp">TimeoutHandler() : 
		reactor( NULL ), 
		isStarted( false ), 
		cntr( 0 ), 
		picWidth( 512 ), 
		picHeight( 512 ),
		bufferSize( picWidth * picHeight * 3 ),
		rgbBuffer( new unsigned char[bufferSize] ),
		jpegBuffer( new unsigned char[bufferSize] ),
		compressor( new JPEGCompressor )
		{};
</code></pre>
<p>und wundere mich jetzt doch ein wenig, dass das nicht geht -- und zwar aus einem Grund, den ich nicht erwartet hätte: Zum Zeitpunkt des Aufrufs von operator new[] hat bufferSize irgendeinen abstrusen hohen Wert, also vermutlich Speichermüll, obwohl picWidth und picHeight beide korrekt auf 512 gesetzt sind. Aber die Reihenfolge der Initialisierung ist doch definiert, oder nicht? Ich sehe doch dauernd Initialisierungslisten, in denen die korrekte Initialisierung eines Werts vom vorhergehenden abhängt?</p>
<p>&lt;edit&gt;<br />
achja, picWidth und picHeight sind vom Typ int, bufferSize ist ein size_t, also Überlauf kommt nicht in Frage.<br />
&lt;/edit&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/212416/solved-initialisierungsreihenfolge-in-initialisierungsliste-von-konstruktor</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 20:25:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/212416.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 May 2008 09:18:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [solved] Initialisierungsreihenfolge in Initialisierungsliste von Konstruktor on Tue, 06 May 2008 09:39:58 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>hab grad eben so just for fun mal versucht, Arrays in der Initialisierungsliste zu allozieren</p>
<pre><code class="language-cpp">TimeoutHandler() : 
		reactor( NULL ), 
		isStarted( false ), 
		cntr( 0 ), 
		picWidth( 512 ), 
		picHeight( 512 ),
		bufferSize( picWidth * picHeight * 3 ),
		rgbBuffer( new unsigned char[bufferSize] ),
		jpegBuffer( new unsigned char[bufferSize] ),
		compressor( new JPEGCompressor )
		{};
</code></pre>
<p>und wundere mich jetzt doch ein wenig, dass das nicht geht -- und zwar aus einem Grund, den ich nicht erwartet hätte: Zum Zeitpunkt des Aufrufs von operator new[] hat bufferSize irgendeinen abstrusen hohen Wert, also vermutlich Speichermüll, obwohl picWidth und picHeight beide korrekt auf 512 gesetzt sind. Aber die Reihenfolge der Initialisierung ist doch definiert, oder nicht? Ich sehe doch dauernd Initialisierungslisten, in denen die korrekte Initialisierung eines Werts vom vorhergehenden abhängt?</p>
<p>&lt;edit&gt;<br />
achja, picWidth und picHeight sind vom Typ int, bufferSize ist ein size_t, also Überlauf kommt nicht in Frage.<br />
&lt;/edit&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1504032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1504032</guid><dc:creator><![CDATA[iko79]]></dc:creator><pubDate>Tue, 06 May 2008 09:39:58 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Initialisierungsreihenfolge in Initialisierungsliste von Konstruktor on Tue, 06 May 2008 09:22:23 GMT]]></title><description><![CDATA[<p>Die Reihenfolge der Initialisierung der Variabeln gibt die Deklaration (Header) vor (nicht die Impl.).<br />
Die Objekterzeugung mit new würde ich in den Ctor Body verschieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1504033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1504033</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Tue, 06 May 2008 09:22:23 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Initialisierungsreihenfolge in Initialisierungsliste von Konstruktor on Tue, 06 May 2008 09:27:56 GMT]]></title><description><![CDATA[<p>Autsch. Hab scho sowas in der Art vermutet... Dann ist das ja total explosiv, sowas zu machen, warum tut das dann alle Welt? 0_0</p>
<p>simon.gysi schrieb:</p>
<blockquote>
<p>Die Objekterzeugung mit new würde ich in den Ctor Body verschieben</p>
</blockquote>
<p>Stimmt, find ich auch -- war wie gesagt nur mal ein Versuch um zu sehen ob der Compiler das überhaupt frisst...</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1504039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1504039</guid><dc:creator><![CDATA[iko79]]></dc:creator><pubDate>Tue, 06 May 2008 09:27:56 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Initialisierungsreihenfolge in Initialisierungsliste von Konstruktor on Tue, 06 May 2008 09:32:45 GMT]]></title><description><![CDATA[<p>iko79 schrieb:</p>
<blockquote>
<p>Dann ist das ja total explosiv, sowas zu machen, warum tut das dann alle Welt? 0_0</p>
</blockquote>
<p>Warning Level hochdrehen, dann sollte ein vernünftiger Compiler Dir sagen, dass die Initialisierungsreihenfolge nicht stimmt.</p>
<p>simon.gysi schrieb:</p>
<blockquote>
<p>Die Objekterzeugung mit new würde ich in den Ctor Body verschieben.</p>
</blockquote>
<p>Warum? Ist gerade im Hinblick auf Smartpointer nicht optimal (zuerst wird leer konstruiert, dann ersetzt, zudem ist ein Aufruf einer reset-Methode notwendig).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1504043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1504043</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 06 May 2008 09:32:45 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Initialisierungsreihenfolge in Initialisierungsliste von Konstruktor on Tue, 06 May 2008 09:40:22 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Warum? Ist gerade im Hinblick auf Smartpointer nicht optimal (zuerst wird leer konstruiert, dann ersetzt, zudem ist ein Aufruf einer reset-Methode notwendig).</p>
</blockquote>
<p>Weiß nicht recht, wenn der Konstruktor unter Umständen Ausnahmen auslöst wirds dann kompliziert find ich (auch zu debuggen). In Bezug auf Smartpointer hast schon recht, aber bei nicht performance-kritischem Code (wie in diesem Fall) spar' ich mir die Stolpersteine dann. Ist halt auch Geschmackssache.</p>
<p>LordJaxom schrieb:</p>
<blockquote>
<p>Warning Level hochdrehen, dann sollte ein vernünftiger Compiler Dir sagen, dass die Initialisierungsreihenfolge nicht stimmt.</p>
</blockquote>
<p>Cool, danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1504046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1504046</guid><dc:creator><![CDATA[iko79]]></dc:creator><pubDate>Tue, 06 May 2008 09:40:22 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Initialisierungsreihenfolge in Initialisierungsliste von Konstruktor on Tue, 06 May 2008 09:44:10 GMT]]></title><description><![CDATA[<p>iko79 schrieb:</p>
<blockquote>
<p>Autsch. Hab scho sowas in der Art vermutet... Dann ist das ja total explosiv, sowas zu machen, warum tut das dann alle Welt? 0_0</p>
</blockquote>
<p>Die Initialisierungsliste sollte man immer in der Reihenfolge identisch wie im Header halten. Dann passiert dies auch nicht <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 />
Dafür die Initialisierungsliste zu verteufeln ist auch der falsche Weg - einiges geht schließlich nur und ausschließlich mit dieser. Und in irgendeiner definierten Reihenfolge muss die Initialisierung nunmal vonstatten gehen...</p>
<p>Zu new bin ich auch LordJaxom Meinung. Ein new gehört in die Initialisierungsliste (Thema Smartpointer und Exceptionsicherheit...).</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1504050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1504050</guid><dc:creator><![CDATA[asc@ausgeloggt]]></dc:creator><pubDate>Tue, 06 May 2008 09:44:10 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Initialisierungsreihenfolge in Initialisierungsliste von Konstruktor on Tue, 06 May 2008 09:49:57 GMT]]></title><description><![CDATA[<p>iko79 schrieb:</p>
<blockquote>
<p>LordJaxom schrieb:</p>
<blockquote>
<p>Warum? Ist gerade im Hinblick auf Smartpointer nicht optimal (zuerst wird leer konstruiert, dann ersetzt, zudem ist ein Aufruf einer reset-Methode notwendig).</p>
</blockquote>
<p>Weiß nicht recht, wenn der Konstruktor unter Umständen Ausnahmen auslöst wirds dann kompliziert find ich (auch zu debuggen). In Bezug auf Smartpointer hast schon recht, aber bei nicht performance-kritischem Code (wie in diesem Fall) spar' ich mir die Stolpersteine dann. Ist halt auch Geschmackssache.</p>
</blockquote>
<p>Also ich empfinde es eher als Stolperstein es nicht zu tun...</p>
<pre><code class="language-cpp">class B {}
class A
{
  private:
    boost::scoped_ptr&lt;B&gt; b1;
    boost::scoped_ptr&lt;B&gt; b2;
    boost::scoped_ptr&lt;B&gt; b3;

  public:
    A()
    : b1(new B),
      b2(new B),
      b3(new B)
    {
      // Hier ist keine Sonderbehandlung mehr nötig, da im Ausnahmefall die
      // Smartpointer hinter sich aufräumen. Nehmen wir an das b2 nicht
      // Konstruiert werden kann (new-exception) wird b1 wieder gelöscht.
    }
};
</code></pre>
<p>Und ob ich nun die Exceptionbehandlung im Konstruktor oder über die Smartpointer mache, nicht sich performancetechnisch nicht viel, da im Fehlerfall imho eh der Konstruktor per Exception beendet werden sollte...</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1504053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1504053</guid><dc:creator><![CDATA[asc@ausgeloggt]]></dc:creator><pubDate>Tue, 06 May 2008 09:49:57 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Initialisierungsreihenfolge in Initialisierungsliste von Konstruktor on Tue, 06 May 2008 13:41:18 GMT]]></title><description><![CDATA[<p>Wie gesagt, je nach Anwendungsfall: Unter der Verwendung von Smartpointern machts Sinn. Nachdem in meinem Fall keine verwendet werden würde b1 liegen bleiben wenn b2 nicht konstruiert werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1504229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1504229</guid><dc:creator><![CDATA[iko79]]></dc:creator><pubDate>Tue, 06 May 2008 13:41:18 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Initialisierungsreihenfolge in Initialisierungsliste von Konstruktor on Tue, 06 May 2008 14:32:07 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/14118">@iko79</a>: Auch wenn du das &quot;new&quot; in den ctor body verschiebst bringt dir das noch nix, da der dtor nicht aufgerufen wird wenn der ctor mit einer Exception verlassen wurde. Ergo müsstest du im ctor body ein try-catch reinbasteln, was zumindest ganz furchtbar hässlich ist, im schlimmsten fall noch andere seiteneffekte hat, oder einfach vergessen wird.</p>
<p>Daher: Smart-Pointer oder eigene RAII Klassen verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1504264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1504264</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 06 May 2008 14:32:07 GMT</pubDate></item></channel></rss>