<?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[placement new]]></title><description><![CDATA[<p>Hi Com,</p>
<p>Als Übung wollte ich den Operator new Überladen, um so Heapspeicher umzuallokieren, statt neuen Speicher anzufrordern und umzukopieren,<br />
aber leider ist mir aufgefallen, dass das bei meinem VC++ 8 Compiler einen Fehler macht...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void *operator new[](size_t, void*);

int main(int args, char *arg[])
{
	int *a = new int[3];
	*a = 123;
	a = new(a) int[40];
	a[26] = 4;
}

void *operator new[](size_t size, void* oldPtr)
{
	void* newPtr;
	return ( newPtr = realloc(oldPtr, size) ) ? newPtr : NULL;
}
</code></pre>
<p>weil es ja einen placement new Operator gibt, der von der Argumentenliste mit meinem new übereinstimmt und weil der inline ist, ist der Code auch direkt in der Library eingebunden, weshalb das so nicht geht (ich glaube beim g++ ist das genau so)</p>
<p>Daher hab ich nur 3 fragen:</p>
<p>1. Wie kann ich meinen Operator new nun doch nutzen?<br />
2. Wieso gibt es den placement new überhaupt?<br />
(ich mein so, als ob man ihn nicht nachprogrammieren könnte, ist es ja nicht...)<br />
3. wieso muss der inline sein? ich glaube kaum das man das Ding sehr oft benutzt</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/208809/placement-new</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 04:06:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/208809.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 22 Mar 2008 23:14:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to placement new on Sat, 22 Mar 2008 23:14:09 GMT]]></title><description><![CDATA[<p>Hi Com,</p>
<p>Als Übung wollte ich den Operator new Überladen, um so Heapspeicher umzuallokieren, statt neuen Speicher anzufrordern und umzukopieren,<br />
aber leider ist mir aufgefallen, dass das bei meinem VC++ 8 Compiler einen Fehler macht...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void *operator new[](size_t, void*);

int main(int args, char *arg[])
{
	int *a = new int[3];
	*a = 123;
	a = new(a) int[40];
	a[26] = 4;
}

void *operator new[](size_t size, void* oldPtr)
{
	void* newPtr;
	return ( newPtr = realloc(oldPtr, size) ) ? newPtr : NULL;
}
</code></pre>
<p>weil es ja einen placement new Operator gibt, der von der Argumentenliste mit meinem new übereinstimmt und weil der inline ist, ist der Code auch direkt in der Library eingebunden, weshalb das so nicht geht (ich glaube beim g++ ist das genau so)</p>
<p>Daher hab ich nur 3 fragen:</p>
<p>1. Wie kann ich meinen Operator new nun doch nutzen?<br />
2. Wieso gibt es den placement new überhaupt?<br />
(ich mein so, als ob man ihn nicht nachprogrammieren könnte, ist es ja nicht...)<br />
3. wieso muss der inline sein? ich glaube kaum das man das Ding sehr oft benutzt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1478965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1478965</guid><dc:creator><![CDATA[Temeshwarrior]]></dc:creator><pubDate>Sat, 22 Mar 2008 23:14:09 GMT</pubDate></item><item><title><![CDATA[Reply to placement new on Sun, 23 Mar 2008 00:10:28 GMT]]></title><description><![CDATA[<p>Temeshwarrior schrieb:</p>
<blockquote>
<p>2. Wieso gibt es den placement new überhaupt?</p>
</blockquote>
<p>Nunja, der &quot;originale&quot; new-Operator macht im Prinzip zwei Dinge: Speicher allokieren und Konstruktor(en) aufrufen. Der Placement-new-Operator ruft halt nur den/die Konstruktor(en) auf dem entsprechenden Speicherstück auf. Das kann man nämlich sonst nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1478978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1478978</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 23 Mar 2008 00:10:28 GMT</pubDate></item><item><title><![CDATA[Reply to placement new on Sun, 23 Mar 2008 00:36:24 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13210">@Badestrand</a></p>
<blockquote>
<p>Nunja, der &quot;originale&quot; new-Operator macht im Prinzip zwei Dinge: Speicher allokieren und Konstruktor(en) aufrufen. Der Placement-new-Operator ruft halt nur den/die Konstruktor(en) auf dem entsprechenden Speicherstück auf.</p>
</blockquote>
<p>Thx jetz wirds mir klar, auch wenn ich vieleicht als halber Neuling noch nicht begreife, wieso man nur einen Konstruktor aufrufen will.</p>
<blockquote>
<p>Das kann man nämlich sonst nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Doch und zwar so:</p>
<pre><code class="language-cpp">void *operator new(size_t, void*);

int main(int args, char *arg[])
{
	class A {public: A(){};};
	A* a = new A;
	a = new(a) A;
}

/* inline */ void *operator new(size_t size, void* p){ return p; }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1478979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1478979</guid><dc:creator><![CDATA[Temeshwarrior]]></dc:creator><pubDate>Sun, 23 Mar 2008 00:36:24 GMT</pubDate></item><item><title><![CDATA[Reply to placement new on Sun, 23 Mar 2008 01:01:11 GMT]]></title><description><![CDATA[<p>Temeshwarrior schrieb:</p>
<blockquote>
<p>weil es ja einen placement new Operator gibt, der von der Argumentenliste mit meinem new übereinstimmt und weil der inline ist, ist der Code auch direkt in der Library eingebunden, weshalb das so nicht geht (ich glaube beim g++ ist das genau so)</p>
</blockquote>
<p>Der placement-operator new der Standardbibliothek darf nicht redeklariert (und -definiert) werden, in jedem Falle muss aber auch &lt;new&gt; eingebunden werden, bevor operator new in irgendeiner Form global überladen oder ersetzt wird. Den Default-placement-Operator kann man also nicht ersetzen, es ist aber möglich, placement-operatoren mit anderer Signatur bereitzustellen. Das kann sogar ein template sein, z.B.</p>
<pre><code class="language-cpp">#include &lt;new&gt;

template&lt;typename T&gt;
void* operator new[](size_t, T*);
</code></pre>
<p>Der Defaultplacement-Operator benutzt void* - falls du irgendwann mal über einen placement-Aufruf der Standardbibliothek gestolpert bist, wirst du wahrscheinlich einen Cast gesehen haben, damit eben sicher genau dieser Default-Operator aufgerufen wird.</p>
<blockquote>
<p>3. wieso muss der inline sein?</p>
</blockquote>
<p>So eine Bedingung existiert nicht.</p>
<p>Grundsätzlich wird das, was du hier versuchst, wahrscheinlich trotzdem nicht funktionen, jedenfalls bewegst du dich hier in einer ziemlichen dunklen Ecke der Sprache.<br />
Ohne Angabe eines Initialisierers haben PODs einen unbestimmten Anfangswert, bevor ihnen etwas anderes zugewiesen wird (5.3.4/15, siehe auch 8.5/9). Das heißt gerade nicht - oder jedenfalls kenne ich keine Stelle des Standards, die das suggerieren würde - dass dieser unbestimmte Wert etwas mit dem Inhalt des Speichers an dieser Stelle <em>vor</em> dem Aufruf von new zu tun hat. Zur Illustration:</p>
<pre><code class="language-cpp">T x,y; // irgendein POD
memcpy(&amp;y,&amp;x,sizeof y);
new(&amp;x) T;
assert(memcmp(&amp;x,&amp;y,sizeof x)==0); // könnte fehlschlagen
</code></pre>
<p>Das könnte zum Beispiel in Debug-Situationen von Nutzen sein. Ein anderer Grund dürfte in 3.10/15 zu finden sein, andernfalls wäre placement-new die ideale Methode um den berüchtigten union-cast doch noch legal durchführen zu können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1478980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1478980</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 23 Mar 2008 01:01:11 GMT</pubDate></item><item><title><![CDATA[Reply to placement new on Sun, 23 Mar 2008 09:22:04 GMT]]></title><description><![CDATA[<p>placement new ist ne wunderbare geschichte, um z.b. einen OO wrapper um eine hardware schnittstelle zu legen. du bekommst ein objekt, setzt ein feld auf irgendeinen wert und dank placement new werden die bits direkt an die serielle schnittstelle durchgetreten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1479027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1479027</guid><dc:creator><![CDATA[wurstbrot]]></dc:creator><pubDate>Sun, 23 Mar 2008 09:22:04 GMT</pubDate></item><item><title><![CDATA[Reply to placement new on Sun, 23 Mar 2008 11:17:00 GMT]]></title><description><![CDATA[<p>Zunächt einmahl thx @all ich war schon eher der Meinung, der pleacment Operator sei Sinnlos.</p>
<p>Ich hab aber auch noch einen anderen Weg gefunden placement new zu &quot;redeklariert&quot;.</p>
<pre><code class="language-cpp">#define __PLACEMENT_VEC_NEW_INLINE //deaktiviert inline operator new[](size_t, coid*)
#include &lt;iostream&gt;

void* operator new[](size_t, void*);

int main(int args, char *arg[])
{
        int *a = new int;
	*a = 22;
	a = new(a) int[44];
	a[42] = 123;
	std::cout &lt;&lt; *a;
	std::cin.get();
}

void* operator new[](size_t size, void* oldPtr)
{
	void* newPtr;

	return ( newPtr = realloc(oldPtr, size) ) ? newPtr : NULL;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1479055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1479055</guid><dc:creator><![CDATA[Temeshwarrior]]></dc:creator><pubDate>Sun, 23 Mar 2008 11:17:00 GMT</pubDate></item><item><title><![CDATA[Reply to placement new on Sun, 23 Mar 2008 19:58:25 GMT]]></title><description><![CDATA[<p>Dazu sagt mein Compiler nur:</p>
<blockquote>
<p>new.cpp: In function ‘void* operator new [](size_t, void*)’:<br />
new.cpp:16: error: redefinition of ‘void* operator new [](size_t, void*)’<br />
/usr/include/c++/4.2/new:106: error: ‘void* operator new [](size_t, void*)’ previously defined here</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1479314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1479314</guid><dc:creator><![CDATA[moagnus]]></dc:creator><pubDate>Sun, 23 Mar 2008 19:58:25 GMT</pubDate></item><item><title><![CDATA[Reply to placement new on Mon, 24 Mar 2008 12:19:44 GMT]]></title><description><![CDATA[<p>Ja stimmt bei meinem Borland Compiler geht das auch nicht mehr.</p>
<p>Klapt wohl nur bei VC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1479533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1479533</guid><dc:creator><![CDATA[Temeshwarrior]]></dc:creator><pubDate>Mon, 24 Mar 2008 12:19:44 GMT</pubDate></item><item><title><![CDATA[Reply to placement new on Mon, 24 Mar 2008 12:50:11 GMT]]></title><description><![CDATA[<p>Temeshwarrior schrieb:</p>
<blockquote>
<p>Zunächt einmahl thx @all ich war schon eher der Meinung, der pleacment Operator sei Sinnlos.</p>
</blockquote>
<p>Von sinnlos kann keine Rede sein, ich brauche es z.B. gerade. Aber für Deinen Fall ist es wahrscheinlich einfach ungeeignet.</p>
<blockquote>
<pre><code class="language-cpp">void* operator new[](size_t size, void* oldPtr)
{
	void* newPtr;

	return ( newPtr = realloc(oldPtr, size) ) ? newPtr : NULL;
}
</code></pre>
</blockquote>
<p>Was soll eigentlich dieser Code? Der ist ziemlich konfus. Folgender Code ist doch inhaltlich absolut identisch:</p>
<pre><code class="language-cpp">void* operator new [](size_t size, void* old) {
    return realloc(old, size);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1479544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1479544</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Mon, 24 Mar 2008 12:50:11 GMT</pubDate></item></channel></rss>