<?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[Konstruktor im Konstruktor aufrufen und Frage zu placement new]]></title><description><![CDATA[<p>Problem Nummer 1: Warum gibt Visual C++ 2008 hier diesen Fehler aus? Kann man sowas nicht machen?</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class vector
{
public:

	vector(const T *arr, size_t count)
	//...
	{
	//...
	}

	vector(const vector &amp;other)
		: vector(other.data(), other.size()) //C2614: Unzulässige Elementinitialisierung: 'vector&lt;int&gt;' ist weder Basis noch Element
	{
	}
};
</code></pre>
<p>Die zweite Sache:<br />
Darf man das machen? Oder ist das bloß schlechter Stil? Oder etwa ganz normal?</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void function()
{
	char *mem = new char[sizeof(T)];
	new (mem) T();
	char *mem_two = new char[sizeof(T)];
	memcpy(mem_two, mem, sizeof(T)); //bezogen auf diese Zeile
	T &amp;object = *reinterpret_cast&lt;T*&gt;(mem_two):
	object.~T();
	delete[] mem;
	delete[] mem_two;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/254702/konstruktor-im-konstruktor-aufrufen-und-frage-zu-placement-new</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 16:45:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/254702.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 19 Nov 2009 20:42:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstruktor im Konstruktor aufrufen und Frage zu placement new on Thu, 19 Nov 2009 20:42:52 GMT]]></title><description><![CDATA[<p>Problem Nummer 1: Warum gibt Visual C++ 2008 hier diesen Fehler aus? Kann man sowas nicht machen?</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class vector
{
public:

	vector(const T *arr, size_t count)
	//...
	{
	//...
	}

	vector(const vector &amp;other)
		: vector(other.data(), other.size()) //C2614: Unzulässige Elementinitialisierung: 'vector&lt;int&gt;' ist weder Basis noch Element
	{
	}
};
</code></pre>
<p>Die zweite Sache:<br />
Darf man das machen? Oder ist das bloß schlechter Stil? Oder etwa ganz normal?</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void function()
{
	char *mem = new char[sizeof(T)];
	new (mem) T();
	char *mem_two = new char[sizeof(T)];
	memcpy(mem_two, mem, sizeof(T)); //bezogen auf diese Zeile
	T &amp;object = *reinterpret_cast&lt;T*&gt;(mem_two):
	object.~T();
	delete[] mem;
	delete[] mem_two;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1810678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810678</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Thu, 19 Nov 2009 20:42:52 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor im Konstruktor aufrufen und Frage zu placement new on Thu, 19 Nov 2009 20:48:27 GMT]]></title><description><![CDATA[<p>1. nein, das wird erst mit dem nächsten standard gehen, das ein construktor einen anderen aufruft.</p>
<p>üblicherweise gibts für das problem aber eh assign:</p>
<pre><code class="language-cpp">vector(const vector&amp; rhs)
{
  assign(rhs.begin(), rhs.end());
}
</code></pre>
<p><code>memcpy(mem_two, mem, sizeof(T)); //bezogen auf diese Zeile</code><br />
Nö. memcpy darf man nur auf PODs anwenden...<br />
Also so bald T kein POD ist, hast du undefiniertes Verhalten...</p>
<p>dafür gibt es <code>std::uninitialized_fill</code> oder so was in der Richtung <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 />
der rest ist ok - aber so was solltest du nur mit gutem grund verzapfen <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>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810681</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 19 Nov 2009 20:48:27 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor im Konstruktor aufrufen und Frage zu placement new on Thu, 19 Nov 2009 20:57:12 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p><code>memcpy(mem_two, mem, sizeof(T)); //bezogen auf diese Zeile</code><br />
Nö. memcpy darf man nur auf PODs anwenden...<br />
Also so bald T kein POD ist, hast du undefiniertes Verhalten...</p>
<p>dafür gibt es <code>std::uninitialized_fill</code> oder so was in der Richtung <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 />
der rest ist ok - aber so was solltest du nur mit gutem grund verzapfen <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>
</blockquote>
<p>Aber wenn T keine abstrusen Nebeneffekte hat (wie zum Beispiel seine eigene Adresse merken) dürfte das keine Probleme verursachen.<br />
Der Grund dafür ist übrigens eine eigene Version von std::vector, die möglichst schnell sein soll und deshalb solche Sachen macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810684</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Thu, 19 Nov 2009 20:57:12 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor im Konstruktor aufrufen und Frage zu placement new on Thu, 19 Nov 2009 20:59:50 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Problem Nummer 1: Warum gibt Visual C++ 2008 hier diesen Fehler aus? Kann man sowas nicht machen?</p>
</blockquote>
<p>Nein -- noch nicht. Das nennt sich glaub'ich Konstruktor-Delegation und wird erst mit C++0x unterstützt.</p>
<p>TyRoXx schrieb:</p>
<blockquote>
<p>Die zweite Sache:<br />
Darf man das machen? Oder ist das bloß schlechter Stil? Oder etwa ganz normal?</p>
</blockquote>
<p>Nein. Ja. Nein. Diese Byte-Schiebereien darfst Du nur bei PODs (Plain Old Data structure) machen. int ist ein POD, ein struct ohne benutzerdefinierte konstruktoren, destruktoren, zuweisungsoperatoren und keine Referenz-Elemente ist auch ein POD. std::string ist kein POD. Da function bei Dir ein Template ist und für T alles mögliche zugelassen wird (zB auch std::string) ist das eine ganz schlechte Idee. PODs haben auch keine Destruktoren -- zumindest nicht welche, die man aufrufen müsste.</p>
<p>Prinzipiell muss man die Finger von den Bits und Bytes von nicht-PODs lassen. Man kann sie zwar irgendwo in einen Puffer konstruieren, muss sie dann aber auch schön wieder Zerstören. Bitfriemeleien nicht erlaubt.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810687</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Thu, 19 Nov 2009 20:59:50 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor im Konstruktor aufrufen und Frage zu placement new on Thu, 19 Nov 2009 21:03:29 GMT]]></title><description><![CDATA[<p>und weil du es &quot;so schnell wie möglich&quot; haben möchtest, dachtest du dir, du machst es erst mal so, dass es später irgendwann kracht - aber das zumindest schnell? uninitialized_fill ist def. nicht spürbar langsamer.<br />
bei PODs wird es vermutlich mind. genau so schnell wie memcpy sein und bei nicht pods wird es so schnell sein, dass du es nicht schneller hinbekommst...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810691</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 19 Nov 2009 21:03:29 GMT</pubDate></item></channel></rss>