<?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[Array.Copy]]></title><description><![CDATA[<p>Hi, ich experimentiere gerade ein wenig mit C++ und habe mir folgende Copy-Funktion geschrieben:</p>
<pre><code>void Array::Copy(const void* sourceArray, void* destinationArray, int length)
{
	char* dest = static_cast&lt;char*&gt;(destinationArray);
	const char* src = static_cast&lt;const char*&gt;(sourceArray);
	while (length--)
	{
		*dest++ = *src++;
	}
}
</code></pre>
<p>Nun verwende ich diese in meiner List-Klasse folgendermaßen:</p>
<pre><code>template &lt;class T&gt;
List&lt;T&gt;::List(const List&amp; list) :
	capacity(list.capacity),
	items(new T[list.capacity]),
	size(list.size)
{
	Array::Copy(list.items, items, capacity * (sizeof(items) / sizeof(items[0])));
}
</code></pre>
<p>Ist der Aufruf von Array::Copy so nun richtig? Bei der sizeof Geschichte bin ich mir unsicher.</p>
<p>Und wäre ein Aufruf von</p>
<pre><code>Array::Copy(list.items, items, size * (sizeof(items) / sizeof(items[0])));
</code></pre>
<p>auch legitim? Die reservierten Stellen mitzukopieren ist ja nicht gerade sinnvoll.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/316865/array-copy</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Jul 2026 19:12:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/316865.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 19 May 2013 14:14:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 14:14:05 GMT]]></title><description><![CDATA[<p>Hi, ich experimentiere gerade ein wenig mit C++ und habe mir folgende Copy-Funktion geschrieben:</p>
<pre><code>void Array::Copy(const void* sourceArray, void* destinationArray, int length)
{
	char* dest = static_cast&lt;char*&gt;(destinationArray);
	const char* src = static_cast&lt;const char*&gt;(sourceArray);
	while (length--)
	{
		*dest++ = *src++;
	}
}
</code></pre>
<p>Nun verwende ich diese in meiner List-Klasse folgendermaßen:</p>
<pre><code>template &lt;class T&gt;
List&lt;T&gt;::List(const List&amp; list) :
	capacity(list.capacity),
	items(new T[list.capacity]),
	size(list.size)
{
	Array::Copy(list.items, items, capacity * (sizeof(items) / sizeof(items[0])));
}
</code></pre>
<p>Ist der Aufruf von Array::Copy so nun richtig? Bei der sizeof Geschichte bin ich mir unsicher.</p>
<p>Und wäre ein Aufruf von</p>
<pre><code>Array::Copy(list.items, items, size * (sizeof(items) / sizeof(items[0])));
</code></pre>
<p>auch legitim? Die reservierten Stellen mitzukopieren ist ja nicht gerade sinnvoll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324444</guid><dc:creator><![CDATA[Enumerator]]></dc:creator><pubDate>Sun, 19 May 2013 14:14:05 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 14:18:47 GMT]]></title><description><![CDATA[<p>Was soll das? Wieso experimentierst du nicht gleich mit echtem C++ und verwendest die bereits vorhandenen Mittel? Was du machst, ist C#/Java in C++, das will niemand.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324445</guid><dc:creator><![CDATA[experimentator]]></dc:creator><pubDate>Sun, 19 May 2013 14:18:47 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 15:05:16 GMT]]></title><description><![CDATA[<p>experimentator schrieb:</p>
<blockquote>
<p>Was soll das? Wieso experimentierst du nicht gleich mit echtem C++ und verwendest die bereits vorhandenen Mittel?</p>
</blockquote>
<p>Aus Lernzwecken.</p>
<blockquote>
<p>Die reservierten Stellen mitzukopieren ist ja nicht gerade sinnvoll.</p>
</blockquote>
<p>Nein, absolut nicht.</p>
<blockquote>
<pre><code>Array::Copy(list.items, items, size * (sizeof(items) / sizeof(items[0])));
</code></pre>
</blockquote>
<p>Ich nehme mal an, <code>items</code> ist ein Zeiger.<br />
Dann einfach</p>
<pre><code>Array::Copy(list.items, items, size * sizeof(*items));
</code></pre>
<p>Das Äquivalent zu deiner Copy-Funktion wäre übrigens<a href="http://www.cplusplus.com/reference/cstring/memcpy/" rel="nofollow"> <code>std::memcpy</code> </a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324457</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 19 May 2013 15:05:16 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 15:09:53 GMT]]></title><description><![CDATA[<p>Die Notation:<br />
<code>sizeof(items) / sizeof(items[0])</code></p>
<p>Wird nur für echte Arrays verwendet.<br />
Der Trick ist einfach:</p>
<blockquote>
<p>When applied to an array, the result is the total number of bytes in the array.<br />
This implies that the size of an array of n elements is n times the size of an element.</p>
</blockquote>
<p>Dividiert man also das Ergebnis mit der Größe eines Array-Elements, hat man die Länge.<br />
Das Funktioniert aber nur, falls, in diesem Beispiel <code>items</code> , auch wirklich als ein Array deklariert wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324458</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 19 May 2013 15:09:53 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 15:48:33 GMT]]></title><description><![CDATA[<p>experimentator schrieb:</p>
<blockquote>
<p>Was soll das? Wieso experimentierst du nicht gleich mit echtem C++ und verwendest die bereits vorhandenen Mittel? Was du machst, ist C#/Java in C++, das will niemand.</p>
</blockquote>
<p>Was erinnert dich hier bitte an C#/Java?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324463</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sun, 19 May 2013 15:48:33 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 15:50:46 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Was erinnert dich hier bitte an C#/Java?</p>
</blockquote>
<p>Die <code>Array</code> -Klasse, um array-basierte Funktionen zu gruppieren.<br />
Der Name <code>List</code> , um dynamische Arrays kennzuzeichnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324464</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 19 May 2013 15:50:46 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 15:56:33 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Ich nehme mal an, <code>items</code> ist ein Zeiger.<br />
Dann einfach</p>
<pre><code>Array::Copy(list.items, items, size * sizeof(*items));
</code></pre>
</blockquote>
<p>Jupp, ist ein Zeiger. Das hatte ich ursprünglich so verwendet aber sporadisch Programmabstürze mit dieser Funktion. Nehme ich stattdessen</p>
<pre><code>for (int i = 0; i &lt; size; ++i)
{
	items[i] = list.items[i];
}
</code></pre>
<p>im Copy-Constructor funktioniert alles prima. Sehr merkwürdig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324466</guid><dc:creator><![CDATA[Enumerator]]></dc:creator><pubDate>Sun, 19 May 2013 15:56:33 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 15:56:58 GMT]]></title><description><![CDATA[<p>Der äußere Schein trügt <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="😉"
    /> Mich erinnert das ganze viel eher an schlechtes C.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324467</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Sun, 19 May 2013 15:56:58 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 15:58:41 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ethon schrieb:</p>
<blockquote>
<p>Was erinnert dich hier bitte an C#/Java?</p>
</blockquote>
<p>Die <code>Array</code> -Klasse, um array-basierte Funktionen zu gruppieren.<br />
Der Name <code>List</code> , um dynamische Arrays kennzuzeichnen.</p>
</blockquote>
<p>Und deswegen ist es kein C++ oder was ;). Sorry aber der Styling-Code der Standard-Library ist ein absolutes Grauen, weshalb ich mich gerne an C# halte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324468</guid><dc:creator><![CDATA[Enumerator]]></dc:creator><pubDate>Sun, 19 May 2013 15:58:41 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 15:59:10 GMT]]></title><description><![CDATA[<p>Nicht alle Typen sind einfach mit memcpy (oder Äquivalenten) kopierbar. Wenn jetzt jemand List<a href="std::string" rel="nofollow">std::string</a> benutzt, fliegt dir das im hohen Bogen auseinander. Die Zuweisungsschleife benutzt ggf. den Zuweisungsoperator, der das richtige machen sollte. (Wenn er es nicht tut, ist das ein Fehler im Werttyp, nicht in der Liste)</p>
<p>So oder so solltest du dir aber mal std::vector anschauen. Den scheinst du da gerade nachbauen zu versuchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324469</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 19 May 2013 15:59:10 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 16:00:36 GMT]]></title><description><![CDATA[<p>Mechanics schrieb:</p>
<blockquote>
<p>Der äußere Schein trügt <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="😉"
    /> Mich erinnert das ganze viel eher an schlechtes C.</p>
</blockquote>
<p>Ach bitte dann schau dir mal die Implementiering von std::vector an. Das funktioniert unter der Haupe genau so. Weis gar nicht was ihr Standard-Library Fanatiker euch immer einbildet. Die Standard-Library kann - jetzt bitte nicht traurig sein - leider auch nicht zaubern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324470</guid><dc:creator><![CDATA[Enumerator]]></dc:creator><pubDate>Sun, 19 May 2013 16:00:36 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 16:03:12 GMT]]></title><description><![CDATA[<p>Enumerator schrieb:</p>
<blockquote>
<p>Sorry aber der Styling-Code der Standard-Library ist ein absolutes Grauen, weshalb ich mich gerne an C# halte.</p>
</blockquote>
<p>Wenn du versuchst, C#s Standardbibliothek in C++ nachzubauen, wirst du dich auf große Schmerzen einstellen müssen. Eine ganze Reihe Dinge funktionieren in C++ ganz anders -- wenn du von einer gemanagten Sprache kommst, wird dir insbesondere die Umstellung auf Wertesemantik Probleme bereiten, was sich schon an der Zeile</p>
<pre><code class="language-cpp">items(new T[list.capacity]),
</code></pre>
<p>in der ctor-init-list deines Kopierkonstruktors deutlich zeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324471</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 19 May 2013 16:03:12 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 16:03:55 GMT]]></title><description><![CDATA[<p>Enumerator schrieb:</p>
<blockquote>
<p>Ach bitte dann schau dir mal die Implementiering von std::vector an. Das funktioniert unter der Haupe genau so.</p>
</blockquote>
<p>Nope, hast du dir sie einmal angesehen? Bei denen ist copy ein Template und nicht einfach ein memcopy.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324473</guid><dc:creator><![CDATA[Standard-Library Fanatike]]></dc:creator><pubDate>Sun, 19 May 2013 16:03:55 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 16:04:41 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Nicht alle Typen sind einfach mit memcpy (oder Äquivalenten) kopierbar. Wenn jetzt jemand List<a href="std::string" rel="nofollow">std::string</a> benutzt, fliegt dir das im hohen Bogen auseinander. Die Zuweisungsschleife benutzt ggf. den Zuweisungsoperator, der das richtige machen sollte. (Wenn er es nicht tut, ist das ein Fehler im Werttyp, nicht in der Liste)</p>
<p>So oder so solltest du dir aber mal std::vector anschauen. Den scheinst du da gerade nachbauen zu versuchen.</p>
</blockquote>
<p>Warum fliegt das auseinander? Kannst du das ein wenig genauer erklären?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324475</guid><dc:creator><![CDATA[Enumerator]]></dc:creator><pubDate>Sun, 19 May 2013 16:04:41 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 16:05:51 GMT]]></title><description><![CDATA[<p>Überlege mal, was passiert, wenn du folgende Klasse Byte für Byte kopierst:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class autp_ptr {
  T *p;
public:
  auto_ptr(T *p) : p(p) {}
  auto_ptr(auto_ptr&amp; o) : p(o.p) { o.p = 0; }
 ~auto_ptr() { delete p; }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2324476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324476</guid><dc:creator><![CDATA[experimentator]]></dc:creator><pubDate>Sun, 19 May 2013 16:05:51 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 16:12:30 GMT]]></title><description><![CDATA[<p>Kurze, korrekte, aber wenig hilfreiche Antwort: Das Kopieren von Nicht-POD-Typen erzeugt undefiniertes Verhalten. Der Compiler darf dann Code erzeugen, der deinen Computer explodieren lässt.</p>
<p>Längere Antwort: Wenn Objekte deiner Klasse Verweise enthalten (Zeiger oder Referenzen), dann wird bei einer flachen Kopie mit memcpy der Verweis einfach mitkopiert, nicht aber das, worauf er verweist. Dadurch geht das, worauf das überschriebene Objekt verweist, verloren, und zwei Objekte verweisen nachher auf das selbe. Das hat dann (üblicherweise; garantiert ist so was dann nicht mehr) zur Folge, dass (jetzt im Fall zweier std::strings) Änderungen am Inhalt des einen Strings auch den anderen betreffen (können), dass Änderungen am einen String, die diesen dazu veranlassen, seinen Inhalt im Speicher zu verlegen, den anderen ins Nirvana zeigen lassen, und dass bei der Zerstörung mindestens eines der beiden Objekte der Heap zerschossen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324478</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 19 May 2013 16:12:30 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 16:21:21 GMT]]></title><description><![CDATA[<p>Hui, ich hab' auf weiteres nicht geachtet! Wusst' nicht, dass er ein Template hat, hab ich glatt übersehen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Natürlich ist das Doofsinn, was da passiert.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /></p>
<pre><code>std::copy( list.items, list.items + size, items );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2324479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324479</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 19 May 2013 16:21:21 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 16:35:19 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Kurze, korrekte, aber wenig hilfreiche Antwort: Das Kopieren von Nicht-POD-Typen erzeugt undefiniertes Verhalten.</p>
</blockquote>
<p>TriviallyCopyable ist das Wort, das du suchst. Man darf auch manche Nicht-PODs mit memcpy kopieren.</p>
<p>Sone schrieb:</p>
<blockquote>
<p>Hui, ich hab' auf weiteres nicht geachtet! Wusst' nicht, dass er ein Template hat, hab ich glatt übersehen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Natürlich ist das Doofsinn, was da passiert.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /></p>
<pre><code>std::copy( list.items, list.items + size, items );
</code></pre>
</blockquote>
<p>Inwiefern ist das weniger Doofsinn? Damit hast du knallhart ein Memory-Leak in die Liste von Enumerator eingebaut.<br />
Werkzeug der Wahl wäre Speicher allozieren ohne initialisieren und dann mit uninitialized_copy drüberrauschen.<br />
Die Standardbibliothek kann zwar nicht zaubern, aber ein korrektes uninitialized_copy nicht TriviallyImplementable.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324481</guid><dc:creator><![CDATA[experimentator]]></dc:creator><pubDate>Sun, 19 May 2013 16:35:19 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 16:37:09 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Kurze, korrekte, aber wenig hilfreiche Antwort: Das Kopieren von Nicht-POD-Typen erzeugt undefiniertes Verhalten. Der Compiler darf dann Code erzeugen, der deinen Computer explodieren lässt.</p>
</blockquote>
<p>Etwas korrekter: das Kopieren (per memcpy &amp; co.) an sich ist unproblematisch, erzeugt aber keine Objekte des Ursprungstyps. Ein Zugriff auf diese Kopien mit dem Ursprungstyp wird also für gewöhnlich die Aliasingregeln (3.10/10) oder die Regeln für den Umgang mit nicht initialisiertem Speicher (3.8) verletzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324483</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 19 May 2013 16:37:09 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 17:04:32 GMT]]></title><description><![CDATA[<p>experimentator schrieb:</p>
<blockquote>
<p>seldon schrieb:</p>
<blockquote>
<p>Kurze, korrekte, aber wenig hilfreiche Antwort: Das Kopieren von Nicht-POD-Typen erzeugt undefiniertes Verhalten.</p>
</blockquote>
<p>TriviallyCopyable ist das Wort, das du suchst. Man darf auch manche Nicht-PODs mit memcpy kopieren.</p>
<p>Sone schrieb:</p>
<blockquote>
<p>Hui, ich hab' auf weiteres nicht geachtet! Wusst' nicht, dass er ein Template hat, hab ich glatt übersehen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Natürlich ist das Doofsinn, was da passiert.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /></p>
<pre><code>std::copy( list.items, list.items + size, items );
</code></pre>
</blockquote>
<p>Inwiefern ist das weniger Doofsinn? Damit hast du knallhart ein Memory-Leak in die Liste von Enumerator eingebaut.</p>
</blockquote>
<p>Ähm, nein? Wie zum Teufel kommst du darauf?</p>
<pre><code>template &lt;class T&gt; 
List&lt;T&gt;::List(const List&amp; list) : 
    capacity(list.capacity), 
    items(new T[list.capacity]), 
    size(list.size) 
{
     std::copy( list.items, list.items + size, items ); 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2324492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324492</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 19 May 2013 17:04:32 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 17:05:03 GMT]]></title><description><![CDATA[<p>Achso, darauf hätte ich auch selber kommen können. Danke euch für die Antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324495</guid><dc:creator><![CDATA[Enumerator]]></dc:creator><pubDate>Sun, 19 May 2013 17:05:03 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 17:24:34 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>experimentator schrieb:</p>
<blockquote>
<p>seldon schrieb:</p>
<blockquote>
<p>Kurze, korrekte, aber wenig hilfreiche Antwort: Das Kopieren von Nicht-POD-Typen erzeugt undefiniertes Verhalten.</p>
</blockquote>
<p>TriviallyCopyable ist das Wort, das du suchst. Man darf auch manche Nicht-PODs mit memcpy kopieren.</p>
<p>Sone schrieb:</p>
<blockquote>
<p>Hui, ich hab' auf weiteres nicht geachtet! Wusst' nicht, dass er ein Template hat, hab ich glatt übersehen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Natürlich ist das Doofsinn, was da passiert.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /></p>
<pre><code>std::copy( list.items, list.items + size, items );
</code></pre>
</blockquote>
<p>Inwiefern ist das weniger Doofsinn? Damit hast du knallhart ein Memory-Leak in die Liste von Enumerator eingebaut.</p>
</blockquote>
<p>Ähm, nein? Wie zum Teufel kommst du darauf?</p>
<pre><code>template &lt;class T&gt; 
List&lt;T&gt;::List(const List&amp; list) : 
    capacity(list.capacity), 
    items(new T[list.capacity]), 
    size(list.size) 
{
     std::copy( list.items, list.items + size, items ); 
}
</code></pre>
</blockquote>
<p>Dann erkläre mir doch bitte was mit</p>
<pre><code class="language-cpp">int instances;
struct doofsinn {
  doofsinn() { ++instances; }
 ~doofsinn() { --instances; }
  doofsinn&amp; operator=(doofsinn const&amp;) {
    static int doofsinn_counter = 0;
    if (++doofsinn_counter % 5 == 0)
      throw &quot;Sone&quot;;
  }
};
</code></pre>
<p>passiert (<a href="http://ideone.com/Y5C1KA" rel="nofollow">http://ideone.com/Y5C1KA</a>).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324505</guid><dc:creator><![CDATA[experimentator]]></dc:creator><pubDate>Sun, 19 May 2013 17:24:34 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 17:59:15 GMT]]></title><description><![CDATA[<p>Ich wollte doch nicht gleich zu exception-safety übergehen. Aber damit du zufrieden bist:<br />
<a href="http://ideone.com/dWDpzF" rel="nofollow">http://ideone.com/dWDpzF</a></p>
<pre><code>template &lt;class T&gt; 
List&lt;T&gt;::List(const List&amp; list) : 
    capacity(list.capacity), 
    items(new T[list.capacity]), 
    size(list.size)
{ 
    try
    {
        std::copy( list.items, list.items + size, items ); 
    }
    catch(...)
    {
        delete [] items;
        throw;
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2324513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324513</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 19 May 2013 17:59:15 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 18:35:48 GMT]]></title><description><![CDATA[<p>Enumerator schrieb:</p>
<blockquote>
<p>Sorry aber der Styling-Code der Standard-Library ist ein absolutes Grauen, weshalb ich mich gerne an C# halte.</p>
</blockquote>
<p>So eine Aussage kommt meist von Leuten, die sich noch nicht genauer damit befasst haben <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>Schau dir die STL mal im Detail an. Durch die Trennung von Containern, Algorithmen und Iteratoren ist enorme Flexibilität möglich. Zum Beispiel basiert alles auf Templates und hat dadurch nicht die Nachteile tiefer Vererbungshierarchien. Wenn dich das interessiert, könntest du auch mal einen Blick auf &quot;Notes on Programming&quot; von Alexander Stepanov werfen -- das ist die Person, welche die STL entworfen hat -- wohl bis heute einer der bedeutendsten Beiträge zu C++.</p>
<p>Davon abgesehen ist es unsinnig, für produktive Programmierung das Rad neu zu erfinden. Du wirst niemals an die Qualität heutiger STL-Implementierung herankommen. Das betrifft Kriterien wie Performance, Fehlerfreiheit, Debug-Unterstützung, API-Design, Integration in den Rest der Standardbibliothek. Als Übung kann man sich sowas antun, aber sobald du dies später wirklich brauchst, benutze bitte existierende Mittel. Und löse dich von C#, C++ ist eine komplett andere Sprache mit anderen Paradigmen, in der Probleme anders angegangen werden.</p>
<p>Es gibt nichts Schlimmeres als wenn Leute dauernd Standardmechanismen selbst schreiben, &quot;weil ihre Implementierung ja so viel schneller und besser ist&quot;. Diese Unsitte sieht man in vielen in die Jahre gekommenen C++-Biblitoheken. Die Konsequenz ist, dass man bei deren Benutzung ständig Inkompatibilitäten hat und gezwungen ist, selbst ihre Datenstrukturen zu verwenden, die meist schlechter entwickelt sind als Standardmechanismen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324519</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 19 May 2013 18:35:48 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 19:28:35 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Diese Unsitte sieht man in vielen in die Jahre gekommenen C++-Biblitoheken.</p>
</blockquote>
<p>Gehört Qt dazu? Ich meine, ok, die haben schon das ein oder andere angepasst, aber QList, QString, QMap, QSet...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324525</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 19 May 2013 19:28:35 GMT</pubDate></item><item><title><![CDATA[Reply to Array.Copy on Sun, 19 May 2013 19:31:19 GMT]]></title><description><![CDATA[<p>Nö. Qt ist eine in die Jahre gekommene Bibliothek einer C++-ähnlichen Sprache. :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2324526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2324526</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 19 May 2013 19:31:19 GMT</pubDate></item></channel></rss>