<?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[[gelöst]Operator new: Aufruf über Funktionssyntax]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>weiß jemand ob, und falls ja wie, es möglich ist den Konstruktor einer Klasse bei einem new Aufruf über die Funktionssyntax aufzurufen.</p>
<p>Also sowas in der Art wie</p>
<pre><code class="language-cpp">Test* foo = static_cast&lt;Test*&gt;(::operator new(sizeof(Test))) Test();
</code></pre>
<p>Hier bekomme ich folgenden Fehler mit MSVC10</p>
<pre><code>error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'Test'
</code></pre>
<p>Danke für die Hilfe<br />
Tobi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/290567/gelöst-operator-new-aufruf-über-funktionssyntax</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 10:16:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/290567.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 29 Jul 2011 07:44:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst]Operator new: Aufruf über Funktionssyntax on Fri, 29 Jul 2011 08:50:34 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>weiß jemand ob, und falls ja wie, es möglich ist den Konstruktor einer Klasse bei einem new Aufruf über die Funktionssyntax aufzurufen.</p>
<p>Also sowas in der Art wie</p>
<pre><code class="language-cpp">Test* foo = static_cast&lt;Test*&gt;(::operator new(sizeof(Test))) Test();
</code></pre>
<p>Hier bekomme ich folgenden Fehler mit MSVC10</p>
<pre><code>error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'Test'
</code></pre>
<p>Danke für die Hilfe<br />
Tobi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099297</guid><dc:creator><![CDATA[Tobias Gerg]]></dc:creator><pubDate>Fri, 29 Jul 2011 08:50:34 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Operator new: Aufruf über Funktionssyntax on Fri, 29 Jul 2011 07:55:40 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Test* foo = static_cast&lt;Test*&gt;(::operator new(sizeof(Test)));
</code></pre>
<p>wäre korrekt. <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/2099302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099302</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 29 Jul 2011 07:55:40 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Operator new: Aufruf über Funktionssyntax on Fri, 29 Jul 2011 08:09:30 GMT]]></title><description><![CDATA[<p>Hi Pi,</p>
<p>danke für die Antwort.</p>
<p>Leider wird hier aber nur Speicher reserviert. Mir geht es aber auch um den Konstruktoraufruf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099305</guid><dc:creator><![CDATA[Tobias Gerg]]></dc:creator><pubDate>Fri, 29 Jul 2011 08:09:30 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Operator new: Aufruf über Funktionssyntax on Fri, 29 Jul 2011 08:14:30 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">//Speicher besorgen:
Test* foo = static_cast&lt;Test*&gt;(::operator new(sizeof(Test)));
//Konstruktor aufrufen:
foo = new(foo) Test(some_ctor_args);

//freigeben umgekehrt, erst Dtor aufrufen:
foo-&gt;~Test();
//speicher freigeben:
::operator delete(foo);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2099306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099306</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 29 Jul 2011 08:14:30 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Operator new: Aufruf über Funktionssyntax on Fri, 29 Jul 2011 08:15:34 GMT]]></title><description><![CDATA[<p>pumuckl sagts schon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099307</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Fri, 29 Jul 2011 08:15:34 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Operator new: Aufruf über Funktionssyntax on Fri, 29 Jul 2011 08:22:36 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<pre><code class="language-cpp">//Speicher besorgen:
Test* foo = static_cast&lt;Test*&gt;(::operator new(sizeof(Test)));
//Konstruktor aufrufen:
foo = new(foo) Test(some_ctor_args);

//freigeben umgekehrt, erst Dtor aufrufen:
foo-&gt;~Test();
//speicher freigeben:
::operator delete(foo);
</code></pre>
</blockquote>
<p>Hallo pumuckl,</p>
<p>danke für die Antwort. Dass heißt ich muss also Placement new aufrufen und kann dass nicht mit dem Funktionsaufruf von new miterledigen?</p>
<p>Weißt du wie dass der Operator new normalerweise macht wenn man Ihn über die Operator Syntax aufruft?</p>
<p>Ich hab mein Effective C++ leider momentan nicht verfügbar.</p>
<pre><code class="language-cpp">Test* foo = new Test();
</code></pre>
<p>Dieser Aufruf verheiratet ja auch beides irgendwie. Und bisher dachte ich immer dass die operator syntax nur syntaktischer Zucker ist und der Funktionsaufruf equivalent ist... <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>
<p>Grüße<br />
Tobi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099312</guid><dc:creator><![CDATA[Tobias Gerg]]></dc:creator><pubDate>Fri, 29 Jul 2011 08:22:36 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Operator new: Aufruf über Funktionssyntax on Fri, 29 Jul 2011 08:24:49 GMT]]></title><description><![CDATA[<p>Statt</p>
<pre><code class="language-cpp">new T();
</code></pre>
<p>geht auch</p>
<pre><code class="language-cpp">new T;
</code></pre>
<p><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>
<p>Ist mir auch persönlich lieber, da nicht so Java-like.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099314</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 29 Jul 2011 08:24:49 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Operator new: Aufruf über Funktionssyntax on Fri, 29 Jul 2011 08:45:42 GMT]]></title><description><![CDATA[<p>Benutzerdefinierte <code>new</code> - und <code>delete</code> -Operatoren:</p>
<pre><code class="language-cpp">void* operator new(std::size_t bytes, X customParam);
void  operator delete(void* memory, X customParam);
</code></pre>
<p>Der <code>delete</code> -Operator wird aufgerufen, falls die Konstruktion des Objekts fehlschlägt. Direkt aufrufen kannst du den <code>delete</code> -Operator nicht, du musst ihn in Destruktion und Speicherfreigabe aufteilen.</p>
<pre><code class="language-cpp">X customArg;
MyClass* m = new (customArg) MyClass;

m-&gt;~MyClass();
operator delete(m, customArg);
</code></pre>
<p>Aber du kannst das natürlich kapseln:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void delete_object(T* memory, X customParam)
{
	memory-&gt;~T();
	operator delete(memory, customParam);
}
</code></pre>
<p>Bei <code>new</code> ist die Kapselung ohne Perfect Forwarding schwierig, falls <code>T</code> beliebige Konstruktorparameter nehmen können soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099318</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 29 Jul 2011 08:45:42 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Operator new: Aufruf über Funktionssyntax on Fri, 29 Jul 2011 08:48:11 GMT]]></title><description><![CDATA[<p>Ok, ich glaub ich bin dahinter gestiegen. new ist ja nicht nur ein operator sondern auch ein keyword.</p>
<p>Von daher ist es scheinbar nur mit pumuckls variante möglich (placement new) den Konstruktor nach dem Aufruf der Funktion new aufzurufen. <a href="https://duckduckgo.com/?q=isbn+0201834545&amp;cppnetbooks" rel="nofollow">Inside the C++ Object Model | ISBN: 0201834545</a> scheint dass auf Seite 215 zu bestätigen.</p>
<p>Außerdem hab ich auch <a href="http://www.cprogramming.com/tutorial/operator_new.html" rel="nofollow">eine Seite</a> gefunden, die diese Theroie verfestigt.</p>
<p>Danke an alle für die Infos</p>
<p>Grüße<br />
Tobi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099319</guid><dc:creator><![CDATA[Tobias Gerg]]></dc:creator><pubDate>Fri, 29 Jul 2011 08:48:11 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Operator new: Aufruf über Funktionssyntax on Fri, 29 Jul 2011 08:51:23 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Benutzerdefinierte <code>new</code> - und <code>delete</code> -Operatoren:</p>
<pre><code class="language-cpp">void* operator new(std::size_t bytes, X customParam);
void  operator delete(void* memory, X customParam);
</code></pre>
<p>Der <code>delete</code> -Operator wird aufgerufen, falls die Konstruktion des Objekts fehlschlägt. Direkt aufrufen kannst du den <code>delete</code> -Operator nicht, du musst ihn in Destruktion und Speicherfreigabe aufteilen.</p>
<pre><code class="language-cpp">X customArg;
MyClass* m = new (customArg) MyClass;

m-&gt;~MyClass();
operator delete(m, customArg);
</code></pre>
<p>Aber du kannst das natürlich kapseln:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void delete_object(T* memory, X customParam)
{
	memory-&gt;~T();
	operator delete(memory, customParam);
}
</code></pre>
<p>Bei <code>new</code> ist die Kapselung ohne Perfect Forwarding schwierig, falls <code>T</code> beliebige Konstruktorparameter nehmen können soll.</p>
</blockquote>
<p>Danke Nexus,</p>
<p>wenn ich dich richtig verstehe festigt auch dass meine Theorie aus dem lezten Post von mir.</p>
<p>Grüße<br />
Tobi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099321</guid><dc:creator><![CDATA[Tobias Gerg]]></dc:creator><pubDate>Fri, 29 Jul 2011 08:51:23 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Operator new: Aufruf über Funktionssyntax on Fri, 29 Jul 2011 09:02:15 GMT]]></title><description><![CDATA[<p>Tobias Gerg schrieb:</p>
<blockquote>
<p>Dieser Aufruf verheiratet ja auch beides irgendwie. Und bisher dachte ich immer dass die operator syntax nur syntaktischer Zucker ist und der Funktionsaufruf equivalent ist... <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>
</blockquote>
<p>Man muss zwischen zwei Dingen unterscheiden: einmal dem Operator [c]new[/c], was im Grunde das Token/reservierte Schlüsselwort im Quelltext samt seiner Semantik ist. Zum Anderen die Funktion <code>operator new</code> , was eben die Funktion ist, die der Compiler aufruft, wenn er den Operator im Quelltext findet. Ist im Grunde das gleiche wie der Unterschied zwischen dem Operator <code>+</code> , der im Quelltext steht (z.B. im Ausdruck &quot;a+b&quot;), und der Funktion <code>operator+</code> , die aufgerufen wird, wennd er Compiler den Operator liest.<br />
Der Unterschied zwischen &quot;new&quot; und &quot;+&quot; ist der, dass der Ausdruck &quot;a+b&quot; einfach übersetzt wird in &quot;operator+(a,b)&quot;, also einen Funktoinsaufruf darstellt.<br />
der Ausdruck &quot;new T(args)&quot; bzw. &quot;new(newargs) T(args)&quot; hingegen sorgt dafür, dass einmal der passende <code>operator new(sizeof(T))</code> , bzw. <code>operator new(sizeof(T), newargs)</code> aufgerufen wird und dann danach der Konstruktor von T auf dem Speicherbereich ausgeführt wird, den der <code>operator new</code> zurückgegeben hat.</p>
<p>Der Compiler macht also quasi folgendes daraus:</p>
<pre><code class="language-cpp">//Bsp1: Aufruf &quot;T* pt = new T(25);&quot;
T* pTemp = (T*)operator new(sizeof(T)); //oder T::operator new, was grade passt - besorgt Speicher
pTemp-&gt;T(25); //Expliziter Ctor-Aufruf ist kein gültiges C++, der Compiler darf das natürlich. Soll Konstruktion an der Stelle im Speicher darstellen
T* pt = pTemp;

//Bsp2: Aufruf &quot;pt = new(pt) T(25);&quot;
T* pTemp = (T*)operator new(sizeof(T), pt); //new(size_t, void*) macht nichts! Speicher ist ja schon besorgt
pTemp-&gt;T(25); //Ctor-Aufruf
pt = pTemp;
</code></pre>
<p>Beispiel zwei soll verdeutlichen, dass dieses Placement-new gleichbedeutend mit dem expliziten Ctor-Aufruf ist, weil der zugehörige <code>::operator new</code> nichts tut (es sei denn er ist überladen)</p>
<p>Zusammengefasst: normale Operatoren übersetzt der Compiler mit Aufruf der <code>operator XY</code> -Funktion.<br />
Den Operator new übersetzt der Compiler durch den Aufruf von <code>operator new</code> plus Konstruktion des Objektes.<br />
Den Operator delete übersetzt der Compiler durch den Aufruf des Destruktors plus Aufruf von <code>operator delete</code></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099327</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 29 Jul 2011 09:02:15 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Operator new: Aufruf über Funktionssyntax on Fri, 29 Jul 2011 10:11:10 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Hallo pumuckl,</p>
<p>danke für die ausführlichen Erklärungen. Damit sehe ich das von mir recherchierte als verifiziert an...</p>
<p>Grüße<br />
Tobi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099345</guid><dc:creator><![CDATA[Tobias Gerg]]></dc:creator><pubDate>Fri, 29 Jul 2011 10:11:10 GMT</pubDate></item></channel></rss>