<?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[new[]-array und konstruktoren]]></title><description><![CDATA[<p>Hi!<br />
Wenn ich mit new[] ein Array angelegt habe, wird dann für jedes Element der Standard-Konstruktor aufgerufen?<br />
Oder muss ich dann für jedes Element einen bestimmten Konstruktor (nochmal mit new()?) aufrufen, wobei ich dann aber schon bei CMyClass** liege, oder?<br />
Wie regel ich das?<br />
danke<br />
Sören</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/190957/new-array-und-konstruktoren</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 22:43:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/190957.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 Aug 2007 16:48:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to new[]-array und konstruktoren on Tue, 28 Aug 2007 16:48:07 GMT]]></title><description><![CDATA[<p>Hi!<br />
Wenn ich mit new[] ein Array angelegt habe, wird dann für jedes Element der Standard-Konstruktor aufgerufen?<br />
Oder muss ich dann für jedes Element einen bestimmten Konstruktor (nochmal mit new()?) aufrufen, wobei ich dann aber schon bei CMyClass** liege, oder?<br />
Wie regel ich das?<br />
danke<br />
Sören</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1353961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1353961</guid><dc:creator><![CDATA[soerenP]]></dc:creator><pubDate>Tue, 28 Aug 2007 16:48:07 GMT</pubDate></item><item><title><![CDATA[Reply to new[]-array und konstruktoren on Tue, 28 Aug 2007 16:55:29 GMT]]></title><description><![CDATA[<p>soerenP schrieb:</p>
<blockquote>
<p>Hi!<br />
Wenn ich mit new[] ein Array angelegt habe, wird dann für jedes Element der Standard-Konstruktor aufgerufen?</p>
</blockquote>
<p>Ohne Klammern (new T[...]): Defaultkonstruktor wird aufgerufen, wenn T kein POD ist.<br />
Mit Klammern ( new T[...]() ): Defaultkonstruktor wird immer aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1353968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1353968</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 28 Aug 2007 16:55:29 GMT</pubDate></item><item><title><![CDATA[Reply to new[]-array und konstruktoren on Tue, 28 Aug 2007 17:45:35 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Ohne Klammern (new T[...]): Defaultkonstruktor wird aufgerufen, wenn T kein POD ist.<br />
Mit Klammern ( new T[...]() ): Defaultkonstruktor wird immer aufgerufen.</p>
</blockquote>
<p>Gibts überhaupt Fälle, wo das einen Unterschied macht? Schließlich werden PODs doch gar nicht initialisiert, oder etwa doch <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/1354001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1354001</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 28 Aug 2007 17:45:35 GMT</pubDate></item><item><title><![CDATA[Reply to new[]-array und konstruktoren on Tue, 28 Aug 2007 18:16:34 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Ohne Klammern (new T[...]): Defaultkonstruktor wird aufgerufen, wenn T kein POD ist.<br />
Mit Klammern ( new T[...]() ): Defaultkonstruktor wird immer aufgerufen.</p>
</blockquote>
<p>Gibts überhaupt Fälle, wo das einen Unterschied macht?</p>
</blockquote>
<p>Immer dann, wenn ich initialisierte PODs haben will? Defaultinitialisierung bei PODs ist Zero-Initialisierung - bei einer POD-Struktur werden also alle Member mit 0(geeignet konvertiert) initialisiert.</p>
<p>wenn ich new char[...] schreibe, erhalte ich einen Block mit unbekanntem Inhalt. bei new char[...]() steht überall 0 drin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1354029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1354029</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 28 Aug 2007 18:16:34 GMT</pubDate></item><item><title><![CDATA[Reply to new[]-array und konstruktoren on Tue, 28 Aug 2007 18:43:26 GMT]]></title><description><![CDATA[<p>Oh, was man noch alles lernen kann <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/1354045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1354045</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 28 Aug 2007 18:43:26 GMT</pubDate></item><item><title><![CDATA[Reply to new[]-array und konstruktoren on Wed, 29 Aug 2007 10:43:52 GMT]]></title><description><![CDATA[<p>und mit new[](bla, bla)<br />
ruf ich andere Konstruktoren auf?<br />
Das geht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Dachte, das würde er nicht wollen.<br />
Probier ich mal aus, vielen Dank!<br />
Sören</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1354422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1354422</guid><dc:creator><![CDATA[soerenP]]></dc:creator><pubDate>Wed, 29 Aug 2007 10:43:52 GMT</pubDate></item><item><title><![CDATA[Reply to new[]-array und konstruktoren on Wed, 29 Aug 2007 10:48:55 GMT]]></title><description><![CDATA[<p>soerenP schrieb:</p>
<blockquote>
<p>und mit new[](bla, bla)<br />
ruf ich andere Konstruktoren auf?</p>
</blockquote>
<p>leider nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1354430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1354430</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 29 Aug 2007 10:48:55 GMT</pubDate></item><item><title><![CDATA[Reply to new[]-array und konstruktoren on Wed, 29 Aug 2007 10:52:45 GMT]]></title><description><![CDATA[<p>Scheint nicht zu gehen <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="😞"
    /><br />
&quot;Angabe der Initialisierung für Felder nicht möglich.&quot;<br />
Führt da kein weg an einer nachfolgenden Schleife mit gnz vielen init(bla, bla) aufrufen vorbei?<br />
Grüße<br />
Sören</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1354437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1354437</guid><dc:creator><![CDATA[soerenP]]></dc:creator><pubDate>Wed, 29 Aug 2007 10:52:45 GMT</pubDate></item><item><title><![CDATA[Reply to new[]-array und konstruktoren on Wed, 29 Aug 2007 10:58:39 GMT]]></title><description><![CDATA[<p>soerenP schrieb:</p>
<blockquote>
<p>Führt da kein weg an einer nachfolgenden Schleife mit gnz vielen init(bla, bla) aufrufen vorbei?</p>
</blockquote>
<p>Klar, verwende einen vernünftigen Container, der seine Elemente gleich initialisieren kann <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>
<pre><code class="language-cpp">//aufwendig und fehleranfällig:
meineKlasse* data = new meineKlasse[100];
for(int i=0;i&lt;100;++i) data[i]=meineKlasse(x,y);

//besser:
std::vector&lt;meineKlasse&gt; data(100,meineKlasse(x,y));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1354445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1354445</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 29 Aug 2007 10:58:39 GMT</pubDate></item><item><title><![CDATA[Reply to new[]-array und konstruktoren on Wed, 29 Aug 2007 11:05:45 GMT]]></title><description><![CDATA[<p>soerenP schrieb:</p>
<blockquote>
<p>Scheint nicht zu gehen <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="😞"
    /><br />
&quot;Angabe der Initialisierung für Felder nicht möglich.&quot;<br />
Führt da kein weg an einer nachfolgenden Schleife mit gnz vielen init(bla, bla) aufrufen vorbei?<br />
Grüße<br />
Sören</p>
</blockquote>
<p>Auf (großen) Umwegen geht vieles, allerdings ist das generisch kaum in den Griff zu kriegen:</p>
<pre><code class="language-cpp">struct T;
extern T proto;
struct T
{
    T(const T&amp; = proto) : /* ... */  {}  // Copy- und Default-ctor
    explicit T(... ) /* ... */
// ...
};

T proto( ... );  // Defaultkonstruktor vermeiden.

// ...

proto=...
new T[...]()  // Alle Elemente werden als Kopie von proto initialisiert
</code></pre>
<p>so oder ähnlich geht das schon, ist aber ziemlich umständlich und hässlich</p>
<p>Der normale Weg ist die manuelle Allokation und dann placement new in einer Schleife. Ob man darauf dann delete[] anwenden darf, ist dabei allerdings etwas problematisch - zumindest in generischem Code sollte man das unterlassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1354452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1354452</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 29 Aug 2007 11:05:45 GMT</pubDate></item><item><title><![CDATA[Reply to new[]-array und konstruktoren on Wed, 29 Aug 2007 11:14:01 GMT]]></title><description><![CDATA[<p>Oha, tief in die Trickkiste gegriffen. Vielen Dank. Ich bekomms auch so hin;)<br />
Tschö<br />
Sören</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1354463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1354463</guid><dc:creator><![CDATA[soerenP]]></dc:creator><pubDate>Wed, 29 Aug 2007 11:14:01 GMT</pubDate></item><item><title><![CDATA[Reply to new[]-array und konstruktoren on Wed, 29 Aug 2007 19:05:27 GMT]]></title><description><![CDATA[<p>ich hab mal ne kleine Templatefunktion geschrieben, die ein new[] mit beliebigem Konstruktoraufruf durchführt (löschen wie gehabt mit delete[]):</p>
<pre><code class="language-cpp">#include &lt;cstddef&gt;
#include &lt;memory&gt;
#include &lt;ostream&gt;
#include &lt;iostream&gt;

template &lt;typename T&gt;
T* call_operator_new_array(std::size_t n, ...)
{
    return static_cast&lt; T* &gt;( ::operator new[]( n ) );
}

template &lt;typename T&gt;
T* call_operator_new_array(std::size_t n, int(*)[sizeof(T::operator new[]( n ))])
{
    return static_cast&lt; T* &gt;( T::operator new[]( n ) );
}

template &lt;typename T&gt;
void call_operator_delete_array(T* p, ...)
{
    ::operator delete[]( p );
}

template &lt;typename T&gt;
void call_operator_delete_array(T* p, int(*)[sizeof(T::operator delete[]( p ),0)])
{
    T::operator delete[]( p );
}

template &lt;typename T&gt;
T* new_array(std::size_t n)
{
    T* p = call_operator_new_array&lt; T &gt;( n, 0 );
    std::size_t i = 0;
    try
    {
        for ( ; i &lt; n; ++i )
            ::new ( p + i ) T();
        return p;
    }
    catch (...)
    {
        for ( ; i; )
            p[ --i ].~T();
        call_operator_delete_array( p, 0 );
        throw;
    }
}

template &lt;typename T, typename U1&gt;
T* new_array(std::size_t n, U1 arg1)
{
    T* p = call_operator_new_array&lt; T &gt;( n, 0 );
    std::size_t i = 0;
    try
    {
        for ( ; i &lt; n; ++i )
            ::new ( p + i ) T( arg1 );
        return p;
    }
    catch (...)
    {
        for ( ; i; )
            p[ --i ].~T();
        call_operator_delete_array( p, 0 );
        throw;
    }
}

template &lt;typename T, typename U1, typename U2&gt;
T* new_array(std::size_t n, U1 arg1, U2 arg2)
{
    T* p = call_operator_new_array&lt; T &gt;( n, 0 );
    std::size_t i = 0;
    try
    {
        for ( ; i &lt; n; ++i )
            ::new ( p + i ) T( arg1, arg2 );
        return p;
    }
    catch (...)
    {
        for ( ; i; )
            p[ --i ].~T();
        call_operator_delete_array( p, 0 );
        throw;
    }
}
// usw.

struct T {};
struct U
{
    static void* operator new[](std::size_t n) { std::cout &lt;&lt; &quot;U::operator new[]&quot; &lt;&lt; std::endl; return ::operator new[]( n ); }
    static void operator delete[](void* p) { std::cout &lt;&lt; &quot;U::operator delete[]&quot; &lt;&lt; std::endl; ::operator delete[]( p ); }
};

int main()
{
    new_array&lt;int&gt;(10);
    new_array&lt;T&gt;(10);
    new_array&lt;U&gt;(10);
}
</code></pre>
<p>dummerweise klappt es nicht mit vc; g++ ist ungetestet, comeau hat keine Probleme. vielleicht hat ja jemand eine Idee, wie man das Ganze mit vc zum laufen kriegt. Allgemein besteht die Problematik darin, abhängig davon, ob ein Ausdruck wohlgeformt ist oder nicht, eine entsprechende Überladung auszuwählen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1354792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1354792</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 29 Aug 2007 19:05:27 GMT</pubDate></item></channel></rss>