<?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 operatoren]]></title><description><![CDATA[<p>Ich habe eine gewisse Klassenhierarchie und möchte für eine Kindklasse Speicher reservieren ohne dabei den Konstruktor aufzurufen.<br />
Dann will ich mir die Adresse für die Basisklasse merken<br />
und schliesslich den Konstruktor für meine Kindklasse aufrufen.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class A
{
  public:
    A() : x( 1 ){
      cout &lt;&lt; &quot;class A created&quot; &lt;&lt; endl;
    }
    ~A(){
      cout &lt;&lt; &quot;class A deleted&quot; &lt;&lt; endl;
    }
    int x;
};

class B : virtual public A
{
  public:
    B(){
      cout &lt;&lt; &quot;class B created&quot; &lt;&lt; endl;
    }
    ~B(){
      cout &lt;&lt; &quot;class B deleted&quot; &lt;&lt; endl;
    }
    int y;
};

int main( int c, char** v )
{
  // Speicher fuer B anlegen
  long s = sizeof( B );
  A* a = (A*)operator new ( s );
  cout &lt;&lt; &quot;addr a: &quot; &lt;&lt; a &lt;&lt; endl;
  cout &lt;&lt; &quot;x: &quot; &lt;&lt; a-&gt;x &lt;&lt; endl;
  // Konstruktor fuer B aufrufen
  B* b = new (a) B;
  cout &lt;&lt; &quot;addr a: &quot; &lt;&lt; a &lt;&lt; endl;
  cout &lt;&lt; &quot;addr b: &quot; &lt;&lt; b &lt;&lt; endl;
  cout &lt;&lt; &quot;x of a: &quot; &lt;&lt; a-&gt;x &lt;&lt; endl;
  cout &lt;&lt; &quot;x of b: &quot; &lt;&lt; b-&gt;x &lt;&lt; endl;
}
</code></pre>
<p>Ausgabe</p>
<pre><code>addr a: 0x8a9e008
x: 0
class A created
class B created
addr a: 0x8a9e008
addr b: 0x8a9e008
x of a: 134515940
x of b: 1
</code></pre>
<p>Warum ist x of a nicht auch 1?<br />
Das muss irgendwas mit dem virtual zu tun haben... aber was?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/289290/new-operatoren</link><generator>RSS for Node</generator><lastBuildDate>Wed, 19 Aug 2026 05:44:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289290.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 Jul 2011 20:24:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to new operatoren on Fri, 01 Jul 2011 20:24:59 GMT]]></title><description><![CDATA[<p>Ich habe eine gewisse Klassenhierarchie und möchte für eine Kindklasse Speicher reservieren ohne dabei den Konstruktor aufzurufen.<br />
Dann will ich mir die Adresse für die Basisklasse merken<br />
und schliesslich den Konstruktor für meine Kindklasse aufrufen.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class A
{
  public:
    A() : x( 1 ){
      cout &lt;&lt; &quot;class A created&quot; &lt;&lt; endl;
    }
    ~A(){
      cout &lt;&lt; &quot;class A deleted&quot; &lt;&lt; endl;
    }
    int x;
};

class B : virtual public A
{
  public:
    B(){
      cout &lt;&lt; &quot;class B created&quot; &lt;&lt; endl;
    }
    ~B(){
      cout &lt;&lt; &quot;class B deleted&quot; &lt;&lt; endl;
    }
    int y;
};

int main( int c, char** v )
{
  // Speicher fuer B anlegen
  long s = sizeof( B );
  A* a = (A*)operator new ( s );
  cout &lt;&lt; &quot;addr a: &quot; &lt;&lt; a &lt;&lt; endl;
  cout &lt;&lt; &quot;x: &quot; &lt;&lt; a-&gt;x &lt;&lt; endl;
  // Konstruktor fuer B aufrufen
  B* b = new (a) B;
  cout &lt;&lt; &quot;addr a: &quot; &lt;&lt; a &lt;&lt; endl;
  cout &lt;&lt; &quot;addr b: &quot; &lt;&lt; b &lt;&lt; endl;
  cout &lt;&lt; &quot;x of a: &quot; &lt;&lt; a-&gt;x &lt;&lt; endl;
  cout &lt;&lt; &quot;x of b: &quot; &lt;&lt; b-&gt;x &lt;&lt; endl;
}
</code></pre>
<p>Ausgabe</p>
<pre><code>addr a: 0x8a9e008
x: 0
class A created
class B created
addr a: 0x8a9e008
addr b: 0x8a9e008
x of a: 134515940
x of b: 1
</code></pre>
<p>Warum ist x of a nicht auch 1?<br />
Das muss irgendwas mit dem virtual zu tun haben... aber was?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087442</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087442</guid><dc:creator><![CDATA[matti83]]></dc:creator><pubDate>Fri, 01 Jul 2011 20:24:59 GMT</pubDate></item><item><title><![CDATA[Reply to new operatoren on Fri, 01 Jul 2011 20:31:45 GMT]]></title><description><![CDATA[<p>Nach der Konstruktion von B steht keinesfalls fest, dass dein Zeiger a auf das A-Subobjekt zeigt, im Falle von virtueller Vererbung wie hier ist das nicht einmal wahrscheinlich.<br />
Gib doch mal</p>
<pre><code class="language-cpp">cout &lt;&lt; &quot;addr (A*)b: &quot; &lt;&lt; (A*)b &lt;&lt; endl;
</code></pre>
<p>aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087447</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 01 Jul 2011 20:31:45 GMT</pubDate></item><item><title><![CDATA[Reply to new operatoren on Fri, 01 Jul 2011 20:37:21 GMT]]></title><description><![CDATA[<p>Erstens: Der Unterschied liegt vermutlich an internen Verwaltungsdaten für die virtuelle Vererbung. Wenn du dir die Adresse des A-Anteils in b <a href="http://ideone.com/QAcWi" rel="nofollow">auch noch ausgeben lässt</a>, erkennst du den Unterschied.<br />
Zweitens: Was soll dieses Gebastel überhaupt erreichen? Wie du siehst, werden die Konstruktoren trotzdem beide aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087449</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 01 Jul 2011 20:37:21 GMT</pubDate></item><item><title><![CDATA[Reply to new operatoren on Fri, 01 Jul 2011 20:50:06 GMT]]></title><description><![CDATA[<p>Was passiert, wenn bei der Konstruktion eines Objekts mit new im Konstruktor eine Exception geworfen wird?</p>
<p>Ist der Speicher dann noch da, oder wird der automatisch aufgeräumt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087460</guid><dc:creator><![CDATA[matti83]]></dc:creator><pubDate>Fri, 01 Jul 2011 20:50:06 GMT</pubDate></item><item><title><![CDATA[Reply to new operatoren on Fri, 01 Jul 2011 20:55:00 GMT]]></title><description><![CDATA[<p>new räumt hinter sich auf, wenn bei der Konstruktion des Objekts etwas schiefgegangen ist. (afaik schließt das auch ein, daß fertig konstrierte Teil-Objekte wieder sauber zerstört werden)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087462</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 01 Jul 2011 20:55:00 GMT</pubDate></item><item><title><![CDATA[Reply to new operatoren on Fri, 01 Jul 2011 21:04:18 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>(afaik schließt das auch ein, daß fertig konstrierte Teil-Objekte wieder sauber zerstört werden)</p>
</blockquote>
<p>Jap, das ist immer garantiert, nicht nur wenn das Objekt mit new erzeugt wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087466</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 01 Jul 2011 21:04:18 GMT</pubDate></item><item><title><![CDATA[Reply to new operatoren on Fri, 01 Jul 2011 21:04:28 GMT]]></title><description><![CDATA[<p>matti83 schrieb:</p>
<blockquote>
<p>Was passiert, wenn bei der Konstruktion eines Objekts mit new im Konstruktor eine Exception geworfen wird?</p>
<p>Ist der Speicher dann noch da, oder wird der automatisch aufgeräumt?</p>
</blockquote>
<p>Wenn ein new-Ausdruck wegen einer Exception, die in einem Konstruktor geworfen wird, fehlschlägt, geschehen 2 Dinge:<br />
1. Zuerst werden im Falle eines Array-new alle zuvor erfolgreich konstruierten Elemente in umgekehrter Reihenfolge zerstört.<br />
2. Danach wird die zur jeweiligen Allokationsfunktion zugehörige Deallokationsfunktion aufgerufen. Abgesehen vom expliziten Aufruf dieser Funktionen ist das überhaupt der einzige Fall, in dem placement-delete-Funktionen ausgeführt werden, ein normales delete ruft ja immer die Standardform<br />
void operator delete(void*) bzw. void operator delete[](void*) auf (welche Funktion genau hängt bei klassenbezogener Überladung allerdings ggf. vom dynamischen Typ des Objektes ab). Die Standardform der placement-delete-Funktion tut nichts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087467</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 01 Jul 2011 21:04:28 GMT</pubDate></item><item><title><![CDATA[Reply to new operatoren on Fri, 01 Jul 2011 21:13:49 GMT]]></title><description><![CDATA[<p>Okay. Danke... dann kann ich erstmal weiter testen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2087472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087472</guid><dc:creator><![CDATA[matti83]]></dc:creator><pubDate>Fri, 01 Jul 2011 21:13:49 GMT</pubDate></item></channel></rss>