<?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[crash bei Kopierkonstruktior]]></title><description><![CDATA[<p>müsste eine ganz einfache aufgabe sein, ich kriegs trotzdem nicht hin. einen kopierkonstuktor für eine klasse zu schreiben.</p>
<pre><code class="language-cpp">Liste::Liste(const Liste&amp; )
{...}
</code></pre>
<p>was der konstruktor macht müsste keine rolle spielen, er wird nie aufgerufen und es macht keinen unterschied ob er leer ist.</p>
<p>das ist der code in der main methode:</p>
<pre><code class="language-cpp">Liste l1;
	cout&lt;&lt;l1&lt;&lt;endl;
</code></pre>
<p>den operator für die liste hab ich überladen:</p>
<pre><code class="language-cpp">ostream&amp; operator&lt;&lt;(ostream&amp; os, Liste l)
{
		ListEl *el=l.first;	
	if(el!=NULL)
	{
	do
	{
		os&lt;&lt;*el&lt;&lt;endl;	
		os&lt;&lt;&quot;------------------&quot;&lt;&lt;endl;
	}
	while((el=el-&gt;getNext())!=NULL);
	}
	return os;
}
</code></pre>
<p>ohne den kopierkonstruktor wird alles richtig ausgegeben, aber mit dem ding crasht es einfach mit der fehlermeldung:</p>
<pre><code>Unbehandelte Ausnahme bei 0x775115de in Tutorial_01.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x4fdaffde.
</code></pre>
<p>was zum teufel soll ich damit anfangen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/304836/crash-bei-kopierkonstruktior</link><generator>RSS for Node</generator><lastBuildDate>Wed, 24 Jun 2026 03:27:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/304836.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 15 Jun 2012 09:29:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to crash bei Kopierkonstruktior on Fri, 15 Jun 2012 09:29:52 GMT]]></title><description><![CDATA[<p>müsste eine ganz einfache aufgabe sein, ich kriegs trotzdem nicht hin. einen kopierkonstuktor für eine klasse zu schreiben.</p>
<pre><code class="language-cpp">Liste::Liste(const Liste&amp; )
{...}
</code></pre>
<p>was der konstruktor macht müsste keine rolle spielen, er wird nie aufgerufen und es macht keinen unterschied ob er leer ist.</p>
<p>das ist der code in der main methode:</p>
<pre><code class="language-cpp">Liste l1;
	cout&lt;&lt;l1&lt;&lt;endl;
</code></pre>
<p>den operator für die liste hab ich überladen:</p>
<pre><code class="language-cpp">ostream&amp; operator&lt;&lt;(ostream&amp; os, Liste l)
{
		ListEl *el=l.first;	
	if(el!=NULL)
	{
	do
	{
		os&lt;&lt;*el&lt;&lt;endl;	
		os&lt;&lt;&quot;------------------&quot;&lt;&lt;endl;
	}
	while((el=el-&gt;getNext())!=NULL);
	}
	return os;
}
</code></pre>
<p>ohne den kopierkonstruktor wird alles richtig ausgegeben, aber mit dem ding crasht es einfach mit der fehlermeldung:</p>
<pre><code>Unbehandelte Ausnahme bei 0x775115de in Tutorial_01.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x4fdaffde.
</code></pre>
<p>was zum teufel soll ich damit anfangen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223446</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223446</guid><dc:creator><![CDATA[Francis123]]></dc:creator><pubDate>Fri, 15 Jun 2012 09:29:52 GMT</pubDate></item><item><title><![CDATA[Reply to crash bei Kopierkonstruktior on Fri, 15 Jun 2012 09:34:20 GMT]]></title><description><![CDATA[<p>Bist du sicher, das er nie aufgerufen wird? Wenn ja, dann is dein Fehler woanders. Code, der nicht aufgerufen wird, kann keinen Fehler verursachen (zumindest, wenn er fehlerfrei kompiliert werden kann).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223447</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Fri, 15 Jun 2012 09:34:20 GMT</pubDate></item><item><title><![CDATA[Reply to crash bei Kopierkonstruktior on Fri, 15 Jun 2012 09:43:03 GMT]]></title><description><![CDATA[<p>die lösung war dass ich den einzigen beiden variablen =NULL zuweise, keine ahnung wieso.</p>
<p>hab jedenfalls noch ein problem mit dem destruktor: wieso zur hölle wird er immer direkt nach dem cout aufgerufen?<br />
zumindest wird die ausgabe des destruktors immer nach dem cout ausgegeben...es müsste überhaupt nicht ausgegeben werden weil ich manuell keine objekte dieser klasse lösche.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223449</guid><dc:creator><![CDATA[Francis123]]></dc:creator><pubDate>Fri, 15 Jun 2012 09:43:03 GMT</pubDate></item><item><title><![CDATA[Reply to crash bei Kopierkonstruktior on Fri, 15 Jun 2012 09:52:31 GMT]]></title><description><![CDATA[<p>Der Destruktor wird <strong>immer</strong> aufgerufen, wenn ein Objekt zerstört wird. Und meine Glaskugel sagt mir, dass nach dem cout ncihts mehr in deiner main-Funktion steht, also verlässt deine Liste den Scope und wird daher automatisch zerstört.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223454</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Fri, 15 Jun 2012 09:52:31 GMT</pubDate></item><item><title><![CDATA[Reply to crash bei Kopierkonstruktior on Fri, 15 Jun 2012 10:11:25 GMT]]></title><description><![CDATA[<p>Da wird eine Kopie erzeugt:</p>
<pre><code class="language-cpp">ostream&amp; operator&lt;&lt;(ostream&amp; os, Liste l)
</code></pre>
<p>und später natürlich der Destruktor aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223458</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 15 Jun 2012 10:11:25 GMT</pubDate></item><item><title><![CDATA[Reply to crash bei Kopierkonstruktior on Fri, 15 Jun 2012 10:42:52 GMT]]></title><description><![CDATA[<p>Nikolei schrieb:</p>
<blockquote>
<p>müsste eine ganz einfache aufgabe sein, ich kriegs trotzdem nicht hin. einen kopierkonstuktor für eine klasse zu schreiben.</p>
<pre><code class="language-cpp">Liste::Liste(const Liste&amp; )
{...}
</code></pre>
<p>was der konstruktor macht müsste keine rolle spielen, er wird nie aufgerufen ...</p>
</blockquote>
<p>Hallo Nikolei,</p>
<p>Du kannst nur sicher sein, dass er 'nie' aufgerufen wird, wenn Du den Kopierkonstruktor und auch den gleich den Zuweisungsoperator private deklarierst. Also:</p>
<pre><code class="language-cpp">class Liste {
// ..
private:
    Liste( const Liste&amp; ); // stilllegen
    Liste&amp; operator=( const Liste&amp; ); // Bem.: in C++11 ginge auch delete
};
</code></pre>
<p>Wenn Du Liste doch aus Versehen kopierst, so meckert gleich der Compiler; etwa mit einer Fehlermeldung wie</p>
<blockquote>
<p>cannot access private member declared in class 'Liste'</p>
</blockquote>
<p>In Deinem Fall würde sich Dein Code gar nicht übersetzen lassen, wie manni66 bereits bemerkt hat, wird bei der Übergabe an die Streaming-Funktion der Kopierkonstruktor aufgerufen.</p>
<p>Ändere den Aufruf nach</p>
<pre><code class="language-cpp">ostream&amp; operator&lt;&lt;(ostream&amp; os, const Liste&amp; l)
</code></pre>
<p>.. und achte darauf, dass es für die Methode <code>ListEl::getNext</code> auch eine const-Variante gibt.</p>
<p>Nikolei schrieb:</p>
<blockquote>
<p>den operator für die liste hab ich überladen:</p>
<pre><code class="language-cpp">ostream&amp; operator&lt;&lt;(ostream&amp; os, Liste l)
{
		ListEl *el=l.first;	
	if(el!=NULL)
	{
	do
	{
		os&lt;&lt;*el&lt;&lt;endl;	
		os&lt;&lt;&quot;------------------&quot;&lt;&lt;endl;
	}
	while((el=el-&gt;getNext())!=NULL);
	}
	return os;
}
</code></pre>
</blockquote>
<p>Besser:</p>
<pre><code class="language-cpp">ostream&amp; operator&lt;&lt;(ostream&amp; os, const Liste&amp; l)
{
    for( const ListEl* el = l.first; el != 0/*nullptr*/; el = el-&gt;getNext() )
    {
        os&lt;&lt;*el&lt;&lt;endl;	
        os&lt;&lt;&quot;------------------&quot;&lt;&lt;endl;
    }
    return os;
}
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223468</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 15 Jun 2012 10:42:52 GMT</pubDate></item><item><title><![CDATA[Reply to crash bei Kopierkonstruktior on Fri, 15 Jun 2012 10:50:03 GMT]]></title><description><![CDATA[<p>Ich rate mal, dass Du, Nikolei, die Dreierregel verletzt hast.</p>
<p>Wenn du keinen Kopierkonstruktor und keinen Zuweisungsoperator brauchst, ist es ganz einfach, diese zu &quot;deaktivieren&quot;. Wenn dann dein Programm noch fertig kompiliert und erfolgreich gelinkt wird, wird wirklich nirgends versucht, den Kopierkonstruktor zu verwenden. Probiere folgendes:</p>
<pre><code class="language-cpp">class Liste
{
  :::

private:
  Liste(Liste const&amp;);
  Liste&amp; operator=(Liste const&amp;);

  :::
}
</code></pre>
<p>Nur diese Dinger private deklarieren, sie aber undefinieren lassen.</p>
<p>Edit: Da war ich wohl 3 Minuten zu spät. <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>Edit2: Bei einem Compiler, der die C++2011-Regeln richtig befolgt, ist das nicht mehr notwendig. Du hast ja einen eigenen Destruktor (nehme ich mal an) und in dem Falle würde der Compiler Kopierkonstruktor und Zuweisungsoperator nicht mehr selbst definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223469</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 15 Jun 2012 10:50:03 GMT</pubDate></item><item><title><![CDATA[Reply to crash bei Kopierkonstruktior on Fri, 15 Jun 2012 11:26:24 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Edit2: Bei einem Compiler, der die C++2011-Regeln richtig befolgt, ist das nicht mehr notwendig. Du hast ja einen eigenen Destruktor (nehme ich mal an) und in dem Falle würde der Compiler Kopierkonstruktor und Zuweisungsoperator nicht mehr selbst definieren.</p>
</blockquote>
<p>bist du sicher?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223490</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 15 Jun 2012 11:26:24 GMT</pubDate></item><item><title><![CDATA[Reply to crash bei Kopierkonstruktior on Fri, 15 Jun 2012 13:26:37 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>bist du sicher?</p>
</blockquote>
<p>Das ist zumindest &quot;der neue Ansatz&quot;: Deklariert der Nutzer irgtendwas von copy/move ctor/assigment oder dtor, dann bedeutet das, dass die Kopier-Semantik eine &quot;besondere&quot; ist die der Compiler nicht kennen kann. Dementsprechend möchte man nicht, dass er irgendwelche dieser special member functions selbst generiert.</p>
<p>Aus C++98 Kompatibilitätsgründen gibt es jedoch noch eine Ausnahmeregelung, die aber in C++2011 schon den Status <em>deprecated</em> hat. An diese Ausnahmregel dachte ich vorhin nicht mehr. Das heißt, ich würde erwarten, dass ein C++2011 Compiler das Programm</p>
<pre><code class="language-cpp">struct a {
  a() {}
  ~a() {cout&lt;&lt;&quot;x&quot;;}
};

int main() {
  a x;
  a y = x;
}
</code></pre>
<p>&quot;frisst&quot; aber hoffentlich eine Warnung ausgibt à la &quot;implicit generation of copy/move operations in this case is deprecated. If you really need a compiler generated copy/move operation, be explicit and use the =default syntax.&quot; oder so etwas ähnliches. <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>So eine Warnung wird Neulingen sicherlich zu Gute kommen. Dann wissen sie entweder, dass sie einen Fehler gemacht haben oder dass sie das Programm so umbauen müssen:</p>
<pre><code class="language-cpp">struct a {
  a() {}
  ~a() {cout&lt;&lt;&quot;x&quot;;}
  a(a const&amp;) = default;
  a&amp; operator=(a const&amp;) = default;
};

int main() {
  a x;
  a y = x;
}
</code></pre>
<p>damit die Warnung weggeht und der Code auch in Zukunft (C++1Y?) laufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2223546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2223546</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 15 Jun 2012 13:26:37 GMT</pubDate></item></channel></rss>