<?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[Speicherleck]]></title><description><![CDATA[<p>Hallo Leute,<br />
ich schreibe grade an einer Klasse, mitder man unendlich lange Zahlen berechnen kann.</p>
<p>Die Klasse ist eine Zahl und besteht aus einer Liste. Jede Ziffer der Zahl ist ein Element der Liste.</p>
<p>Ich habe nun z.b. die Funktion &quot;Add&quot; für die Addition. Diese liefert als Wert halt diese Klasse zurück.</p>
<pre><code>_twTlz twTlzAdd( _twTlz zahl1, _twTlz zahl2 ){

		_twTlz temp;

		zahl1.pos = zahl1.end;
		zahl2.pos = zahl2.end;

		int uebertrag = 0;
		int max = twTlzMax_laenge( &amp;zahl1, &amp;zahl2 );

		/* solange beide zahlen an pos noch eine ziffer haben */
		while(zahl1.pos != NULL &amp;&amp; zahl2.pos != NULL){

			if(zahl1.pos-&gt;ziffer + zahl2.pos-&gt;ziffer + uebertrag &gt;= 10){
				temp.insert_front( (zahl1.pos-&gt;ziffer + zahl2.pos-&gt;ziffer + uebertrag)%10 );
				uebertrag = 1;				
			}else{
				temp.insert_front( zahl1.pos-&gt;ziffer + zahl2.pos-&gt;ziffer + uebertrag );
				uebertrag = 0;
			}

			zahl1.pos = zahl1.pos-&gt;prev;
			zahl2.pos = zahl2.pos-&gt;prev;
		}

		/* solange min eine der zahlen noch eine ziffer an pos hat */
		while( zahl1.pos != NULL || zahl2.pos != NULL ){

			if(zahl1.pos == NULL){
				if(zahl2.pos-&gt;ziffer + uebertrag &gt;= 10){
					temp.insert_front( (zahl2.pos-&gt;ziffer + uebertrag)%10 );
					uebertrag = 1;
				}else{
					temp.insert_front( zahl2.pos-&gt;ziffer + uebertrag );
					uebertrag = 0;
				}
				zahl2.pos = zahl2.pos-&gt;prev;
				continue;
			}

			if(zahl2.pos == NULL){
				if(zahl1.pos-&gt;ziffer + uebertrag &gt;= 10){
					temp.insert_front( (zahl1.pos-&gt;ziffer + uebertrag)%10 );
					uebertrag = 1;				
				}else{
					temp.insert_front( zahl1.pos-&gt;ziffer + uebertrag );
					uebertrag = 0;
				}			
				zahl1.pos = zahl1.pos-&gt;prev;
				continue;
			}

		}
		/* pruefen ob am ende uebertrag existiert */
		if(zahl1.pos == NULL &amp;&amp; zahl2.pos == NULL){
			if(uebertrag == 0) return temp;
			else {
				temp.insert_front( 1 );
				return temp;
			}
		}

		return temp;

	}
</code></pre>
<p>In der main addiere ich testweise auf eine x-Beliebige Zahl eine x-beliebige andere Zahl z.b. 1000000 auf.</p>
<pre><code>for(int i=1;i!=1000000;i++) zahl1 = twTlzAdd(zahl1, zahl2);
</code></pre>
<p>Mein Physikalischer Speicher geht auf 100% voll. Wenn ich das z.b. mit 10000000<br />
mache, stürtzt mein PC ab.</p>
<p>Eigentlich sollten nach jeder Addition alle Temporären Daten gelöscht sein und nur zahl1 überschrieben sein, was dann eigentlich keinen zursätzlichen Speicheraufwand haben sollte. Irgendwas jedoch wird aufjedenfall nicht gelöscht und ich weiß nicht was und warum.</p>
<p>Ich habe Testweise zwei Statics mitlaufen lassen für erstellte Objekte und gelöschte. Die Zahl der gelöschten Objekte ist immer um x4 größer als die Erstellten. Das kann doch auch nicht stimmen. Den Inkrementierer habe ich btw in Konstruktor und Destruktor gepackt.</p>
<p>mfg Jan</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/317903/speicherleck</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Jul 2026 21:39:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/317903.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 24 Jun 2013 11:42:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherleck on Mon, 24 Jun 2013 11:43:40 GMT]]></title><description><![CDATA[<p>Hallo Leute,<br />
ich schreibe grade an einer Klasse, mitder man unendlich lange Zahlen berechnen kann.</p>
<p>Die Klasse ist eine Zahl und besteht aus einer Liste. Jede Ziffer der Zahl ist ein Element der Liste.</p>
<p>Ich habe nun z.b. die Funktion &quot;Add&quot; für die Addition. Diese liefert als Wert halt diese Klasse zurück.</p>
<pre><code>_twTlz twTlzAdd( _twTlz zahl1, _twTlz zahl2 ){

		_twTlz temp;

		zahl1.pos = zahl1.end;
		zahl2.pos = zahl2.end;

		int uebertrag = 0;
		int max = twTlzMax_laenge( &amp;zahl1, &amp;zahl2 );

		/* solange beide zahlen an pos noch eine ziffer haben */
		while(zahl1.pos != NULL &amp;&amp; zahl2.pos != NULL){

			if(zahl1.pos-&gt;ziffer + zahl2.pos-&gt;ziffer + uebertrag &gt;= 10){
				temp.insert_front( (zahl1.pos-&gt;ziffer + zahl2.pos-&gt;ziffer + uebertrag)%10 );
				uebertrag = 1;				
			}else{
				temp.insert_front( zahl1.pos-&gt;ziffer + zahl2.pos-&gt;ziffer + uebertrag );
				uebertrag = 0;
			}

			zahl1.pos = zahl1.pos-&gt;prev;
			zahl2.pos = zahl2.pos-&gt;prev;
		}

		/* solange min eine der zahlen noch eine ziffer an pos hat */
		while( zahl1.pos != NULL || zahl2.pos != NULL ){

			if(zahl1.pos == NULL){
				if(zahl2.pos-&gt;ziffer + uebertrag &gt;= 10){
					temp.insert_front( (zahl2.pos-&gt;ziffer + uebertrag)%10 );
					uebertrag = 1;
				}else{
					temp.insert_front( zahl2.pos-&gt;ziffer + uebertrag );
					uebertrag = 0;
				}
				zahl2.pos = zahl2.pos-&gt;prev;
				continue;
			}

			if(zahl2.pos == NULL){
				if(zahl1.pos-&gt;ziffer + uebertrag &gt;= 10){
					temp.insert_front( (zahl1.pos-&gt;ziffer + uebertrag)%10 );
					uebertrag = 1;				
				}else{
					temp.insert_front( zahl1.pos-&gt;ziffer + uebertrag );
					uebertrag = 0;
				}			
				zahl1.pos = zahl1.pos-&gt;prev;
				continue;
			}

		}
		/* pruefen ob am ende uebertrag existiert */
		if(zahl1.pos == NULL &amp;&amp; zahl2.pos == NULL){
			if(uebertrag == 0) return temp;
			else {
				temp.insert_front( 1 );
				return temp;
			}
		}

		return temp;

	}
</code></pre>
<p>In der main addiere ich testweise auf eine x-Beliebige Zahl eine x-beliebige andere Zahl z.b. 1000000 auf.</p>
<pre><code>for(int i=1;i!=1000000;i++) zahl1 = twTlzAdd(zahl1, zahl2);
</code></pre>
<p>Mein Physikalischer Speicher geht auf 100% voll. Wenn ich das z.b. mit 10000000<br />
mache, stürtzt mein PC ab.</p>
<p>Eigentlich sollten nach jeder Addition alle Temporären Daten gelöscht sein und nur zahl1 überschrieben sein, was dann eigentlich keinen zursätzlichen Speicheraufwand haben sollte. Irgendwas jedoch wird aufjedenfall nicht gelöscht und ich weiß nicht was und warum.</p>
<p>Ich habe Testweise zwei Statics mitlaufen lassen für erstellte Objekte und gelöschte. Die Zahl der gelöschten Objekte ist immer um x4 größer als die Erstellten. Das kann doch auch nicht stimmen. Den Inkrementierer habe ich btw in Konstruktor und Destruktor gepackt.</p>
<p>mfg Jan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333804</guid><dc:creator><![CDATA[Obstsalat]]></dc:creator><pubDate>Mon, 24 Jun 2013 11:43:40 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Mon, 24 Jun 2013 11:49:07 GMT]]></title><description><![CDATA[<p>Um das alles zu verstehen werden Datypen benoetigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333807</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 24 Jun 2013 11:49:07 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Mon, 24 Jun 2013 11:57:34 GMT]]></title><description><![CDATA[<pre><code>struct twTlz{

		short int ziffer;
		twTlz *next;
		twTlz *prev;
	};

	class _twTlz{
	public:
		short int laenge;

		static int a;
		static int b;

		twTlz *anf;
		twTlz *pos;
		twTlz *end;
		twTlz *prev;

		/* Konstruktor */
		_twTlz(){
			laenge = 0;
			a++;
			anf = NULL;
			pos = NULL;
			end = NULL;
			prev = NULL;

		}
		/***************/
</code></pre>
<p>Falls die Klassen Methoden auch benötigt werden:</p>
<pre><code>/* Metoden */

		int insert_front( int new_ziffer ){

			twTlz *newItem = (twTlz*) malloc(sizeof(twTlz));
			if(newItem==NULL) return 0;							/* ERROR */

			if(anf==NULL){

				anf=newItem;
				end=newItem;
				pos=newItem;
				newItem-&gt;prev = NULL;
				newItem-&gt;next = NULL;
			}else{

				newItem-&gt;prev = NULL;
				newItem-&gt;next = anf;
				anf-&gt;prev = newItem;
				anf=newItem;		
			}
			newItem-&gt;ziffer = new_ziffer;		
			laenge++;

			return 1;
		}

		int insert_back( int new_ziffer ){

			twTlz *newItem = (twTlz*) malloc(sizeof(twTlz));
			if(newItem==NULL) return 0;							/* ERROR */

			if(anf==NULL){

				anf=newItem;
				end=newItem;
				pos=newItem;
				newItem-&gt;prev=NULL;
			}else{

				newItem-&gt;prev = anf;
				end-&gt;next = newItem;
				end = newItem;		
			}
			newItem-&gt;next = NULL;
			newItem-&gt;ziffer = new_ziffer;		
			laenge++;

			return 1;
		}

		int ausgeben(){
			pos=anf;
			while(true){
				if(pos==NULL){
					pos = end;
					return 1;
				}

				std::cout &lt;&lt; pos-&gt;ziffer;
				pos=pos-&gt;next;
			}

		}

		int step(){
			if(pos==NULL) return 0;
			prev=pos;
			pos=pos-&gt;next;
			return 1;
		}

		int back(){
			if(pos-&gt;prev==NULL) return 0;
			pos = pos-&gt;prev;
			prev = pos-&gt;prev;

			return 1;
		}

		int del(){

			pos=anf;
			while(step()){
				if(prev==NULL) return 0;
				free(prev);
			}
			return 1;
		}

		/* Destruktor */

		~_twTlz(){
			b++;
		}

	};

	int _twTlz::a = 0;
	int _twTlz::b = 0;
</code></pre>
<p>am Ende der Main lösche ich auch zahl1 und zahl2 mit del( );</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333814</guid><dc:creator><![CDATA[Obstsalat]]></dc:creator><pubDate>Mon, 24 Jun 2013 11:57:34 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Mon, 24 Jun 2013 12:26:19 GMT]]></title><description><![CDATA[<p>ganz viel malloc, niemals free - das kann, zumindest auf Dauer, nicht gut gehen.</p>
<p>Ausserdem: In C++ verwendet man new und delete (bzw new[] und delete[]), aber seit C++11 eigentlich in aller Regel nur noch in Verbindung mit smart pointer (unique_ptr und shared_ptr, dann braucht es kein explizites delete mehr) und in Deinem Fall waere ein std::vector sicherlich am Besten geeignet, so dass Du auch kein new und delete mehr brauchst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333839</guid><dc:creator><![CDATA[mmmalloc]]></dc:creator><pubDate>Mon, 24 Jun 2013 12:26:19 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Mon, 24 Jun 2013 12:26:57 GMT]]></title><description><![CDATA[<p>Manuelle Speicherverwaltung möglichst nicht selber machen, sondern die Standardbibliothek machen lassen. Falls man es unbedingt selber machen möchte: Ressourcen von Ressourcenhalterklassen verwalten lassen (RAII). Genau eine Ressource je Halter, niemals mehr. Fertige Ressourcenhalterklassen gibt es wieder in der Standardbibliothek. Falls man es unbedingt selber machen möchte: Bei der Implementierung der Ressourcenhalterklassen die wichtigsten Grundkonzepte beachten: RAII, Regel der großen Drei (oder neuerdings: Regel der großen Fünf), eventuell noch Copy&amp;Swap-Idiom.</p>
<p>Die Ressource ist bei dir Speicher.</p>
<p>P.S.: Wieso malloc statt new? Wieso die static-Variablen? Wieso short als Datentyp? Insgesamt: Einige fragwürdige Designentscheidungen, die nach voreiliger (und falscher) Optimierung aussehen. Erst einmal sauber programmieren und testen, dann Mikrooptimierungen einbauen (und zwar solche, die auch funktionieren!).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333840</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 24 Jun 2013 12:26:57 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Mon, 24 Jun 2013 12:29:04 GMT]]></title><description><![CDATA[<p>Wenn C++, dann benutze doch erstmal die Typen der Standardbibliothek, bspw. std::list, std::vector. Es empfiehlt sich beispielsweise <a href="http://www.amazon.de/The-Programming-Language-Bjarne-Stroustrup/dp/0321563840/ref=sr_1_2?ie=UTF8&amp;qid=1372076923&amp;sr=8-2&amp;keywords=c%2B%2B" rel="nofollow">http://www.amazon.de/The-Programming-Language-Bjarne-Stroustrup/dp/0321563840/ref=sr_1_2?ie=UTF8&amp;qid=1372076923&amp;sr=8-2&amp;keywords=c%2B%2B</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333841</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 24 Jun 2013 12:29:04 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Mon, 24 Jun 2013 12:35:01 GMT]]></title><description><![CDATA[<p>Das ist die kryptischte und langsamste Implementierung eines Bigints, die ich je gesehen habe. Jedes Detail ist schlecht und das Grunddesign ist ein Performancekiller.</p>
<p>Das Speicherleck dürfte daher zustandekommen, dass du für &quot; <code>_twTlz temp;</code> &quot; vergessen hast, del() aufzurufen (bzw. aus unerfindlichen Gründen del() nicht im Destruktor aufrufst).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333845</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333845</guid><dc:creator><![CDATA[heulsuse]]></dc:creator><pubDate>Mon, 24 Jun 2013 12:35:01 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Mon, 24 Jun 2013 12:38:19 GMT]]></title><description><![CDATA[<p>Ich nutze malloc und free, weil wir das in der Uni grade so machen in C und ich das in c++ einfach so übernehme, damit ich das nebenbei etwas üben kann.</p>
<p>Der short int ist einfach daraus entstanden, dass ich den Speicherbedarf (wenn schon irgendwo n Speicherleck ist) klein halten will.</p>
<p>[quote=&quot;mmmalloc&quot;]ganz viel malloc, niemals free - das kann, zumindest auf Dauer, nicht gut gehen.<br />
quote]</p>
<p>ich habe eine funktion, die die ganze Liste durchgeht und jedes Element wieder freed. Wie gesagt, am ende der Main rufe ich für beide objekte die del() funktion auf.</p>
<p>Btw benutze ich malloc 2 mal im ganzen Code. Wo siehst du ganz viel malloc?</p>
<p>Ich würde halt scon gerne wissen, wo nun mein Leck ist. Das Programm läuft richtig, halt nur mit der unschönen Eigenschaft, dass es den Speicher füllt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333847</guid><dc:creator><![CDATA[Obstsalat]]></dc:creator><pubDate>Mon, 24 Jun 2013 12:38:19 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Mon, 24 Jun 2013 12:40:47 GMT]]></title><description><![CDATA[<p>heulsuse schrieb:</p>
<blockquote>
<p>Das ist die kryptischte und langsamste Implementierung eines Bigints, die ich je gesehen habe. Jedes Detail ist schlecht und das Grunddesign ist ein Performancekiller.</p>
<p>Das Speicherleck dürfte daher zustandekommen, dass du für &quot; <code>_twTlz temp;</code> &quot; vergessen hast, del() aufzurufen (bzw. aus unerfindlichen Gründen del() nicht im Destruktor aufrufst).</p>
</blockquote>
<p>ich hatte del() schon im destruktor, aber dann kommt es zur heapzerstörung.</p>
<p>wie kann ich temp mit del() löschen? Hab ich auch schon gedacht, aber ich muss das temp ja zurückgeben. wenn ich das danach noch del() will, kommt es ja gar nicht zum delete, weil return aus der funktion führt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333849</guid><dc:creator><![CDATA[Obstsalat]]></dc:creator><pubDate>Mon, 24 Jun 2013 12:40:47 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Mon, 24 Jun 2013 12:50:25 GMT]]></title><description><![CDATA[<p>Obstsalat schrieb:</p>
<blockquote>
<p>Der short int ist einfach daraus entstanden, dass ich den Speicherbedarf (wenn schon irgendwo n Speicherleck ist) klein halten will.</p>
</blockquote>
<p>Und es ist völlig falsch. Du erreichst nicht im geringsten, was du damit vor hast und das Vorhaben geht am Problem vorbei.</p>
<blockquote>
<p>ich habe eine funktion, die die ganze Liste durchgeht und jedes Element wieder freed. Wie gesagt, am ende der Main rufe ich für beide objekte die del() funktion auf.</p>
</blockquote>
<p>Und zwar machst du es falsch. Mach es so wie vorgeschlagen dann <em>kann</em> so ein Fehler gar nicht auftreten, weil zu jedem malloc automatisch(!) ein passendes free kommen würde.</p>
<blockquote>
<p>Btw benutze ich malloc 2 mal im ganzen Code. Wo siehst du ganz viel malloc?</p>
</blockquote>
<p>Es geht nicht um das Vorkommen im Code, sondern darum, wie oft und worauf es aufgerufen wird. Was bei dir offensichtlich falsch ist, was kein Wunder ist, da du alles von Hand machst und selber nicht mehr durchblickst. Lass den Compiler für dich arbeiten! Ein Computer ist dafür gebaut, den Durchblick zu behalten.</p>
<blockquote>
<p>Ich würde halt scon gerne wissen, wo nun mein Leck ist. Das Programm läuft richtig, halt nur mit der unschönen Eigenschaft, dass es den Speicher füllt.</p>
</blockquote>
<p>heulsuse schrieb:</p>
<blockquote>
<p>Das Speicherleck dürfte daher zustandekommen, dass du für &quot;_twTlz temp;&quot; vergessen hast, del() aufzurufen (bzw. aus unerfindlichen Gründen del() nicht im Destruktor aufrufst).</p>
</blockquote>
<blockquote>
<p>ich hatte del() schon im destruktor, aber dann kommt es zur heapzerstörung.</p>
</blockquote>
<p>Dann hast du noch mehr Fehler drin. Du hast den Überblick verloren.</p>
<blockquote>
<p>wie kann ich temp mit del() löschen?</p>
</blockquote>
<p>Wie schon oft im Thread gesagt: Gar nicht. Es ist zwar möglich, aber tu es nicht! Du kommst dabei nur selber durcheinander. Nutze die Mittel der Sprache! Mit Smartpointern kannst du gar nicht mehr versehentlich Speicherlöcher bauen, bloß noch durch absichtlichen Missbrauch. Wenn du die Standardbibliothek benutzt, dann brauchst du dafür nicht einmal eine Zeile programmieren und der gesamte Code fällt auf wenige Zeilen zusammen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333853</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 24 Jun 2013 12:50:25 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Mon, 24 Jun 2013 12:51:03 GMT]]></title><description><![CDATA[<p>Obstsalat schrieb:</p>
<blockquote>
<p>heulsuse schrieb:</p>
<blockquote>
<p>Das ist die kryptischte und langsamste Implementierung eines Bigints, die ich je gesehen habe. Jedes Detail ist schlecht und das Grunddesign ist ein Performancekiller.</p>
<p>Das Speicherleck dürfte daher zustandekommen, dass du für &quot; <code>_twTlz temp;</code> &quot; vergessen hast, del() aufzurufen (bzw. aus unerfindlichen Gründen del() nicht im Destruktor aufrufst).</p>
</blockquote>
<p>ich hatte del() schon im destruktor, aber dann kommt es zur heapzerstörung.</p>
<p>wie kann ich temp mit del() löschen? Hab ich auch schon gedacht, aber ich muss das temp ja zurückgeben. wenn ich das danach noch del() will, kommt es ja gar nicht zum delete, weil return aus der funktion führt.</p>
</blockquote>
<p>Ok, ich habe falsch geguckt.</p>
<p>Deine Schleife macht im Prinzip</p>
<pre><code class="language-cpp">for(int i=1;i!=1000000;i++) {
  ehemals_temp = twTlzAdd(zahl1, zahl2);
  zahl1 = ehemals_temp;
}
</code></pre>
<p>Das Problem ist, dass der Wert, der vorher in zahl1 stand, nicht gelöscht wird.</p>
<p>Der Fix wäre also:</p>
<pre><code class="language-cpp">for(int i=1;i!=1000000;i++) {
  ehemals_temp = twTlzAdd(zahl1, zahl2);
  zahl1.del();
  zahl1 = ehemals_temp;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2333856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333856</guid><dc:creator><![CDATA[heulsuse]]></dc:creator><pubDate>Mon, 24 Jun 2013 12:51:03 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Mon, 24 Jun 2013 12:59:29 GMT]]></title><description><![CDATA[<p>heulsuse schrieb:</p>
<blockquote>
<p>Der Fix wäre also:</p>
<pre><code class="language-cpp">for(int i=1;i!=1000000;i++) {
  ehemals_temp = twTlzAdd(zahl1, zahl2);
  zahl1.del();
  zahl1 = ehemals_temp;
}
</code></pre>
</blockquote>
<p>Das ist die Lösung. Es funktioniert. Vielen Dank für den Hinweis. Super wäre noch wenn jemand erklären könnte, was bei der Zuweisung passiert?</p>
<p>Ich dachte zahl1 = zahl2 würde zahl1 überschreiben, sodass kein speicher verloren geht. Anscheind ist das nicht so. Was passiert da?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333863</guid><dc:creator><![CDATA[Obstsalat]]></dc:creator><pubDate>Mon, 24 Jun 2013 12:59:29 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Mon, 24 Jun 2013 13:04:48 GMT]]></title><description><![CDATA[<p>Der Zuweisungsoperator wird aufgerufen.<br />
Der standardmäßig generierte macht eine komponentweise Zuweisung.<br />
In deinem Fall: laenge = other.laenge; prev = other.prev; ...<br />
Du musst aber vorher den Speicher freigeben (Regel der großen Drei!)<br />
Aber nutze bitte Smartpointer oder RAII Klassen, dein Leben ist einfacher.<br />
Oder am simpelsten std::vector, aber nicht dieses Gefrimmel.<br />
Und selbst wenn du malloc() und free() im Kurs lernst, C++ new und delete machen das gleiche nur besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333868</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 24 Jun 2013 13:04:48 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Mon, 24 Jun 2013 13:18:34 GMT]]></title><description><![CDATA[<p>Ok, ich habe jetzt den Zuweisungsoperator selbst definiert. Quasi wie der Defauflt nur mit dem del() drin.</p>
<pre><code>void operator= (_twTlz zahl){

			del();
			laenge = zahl.laenge;

			anf = zahl.anf;
			pos = zahl.pos;
			end = zahl.end;
			prev = zahl.prev;
		}
</code></pre>
<p>Dann kann ich auch meine erste (vorher Fehlerhafte) Schleife verwenden. Ich bedanke mich für die viele Hilfe hier. cucu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333885</guid><dc:creator><![CDATA[Obstsalat]]></dc:creator><pubDate>Mon, 24 Jun 2013 13:18:34 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Mon, 24 Jun 2013 13:23:26 GMT]]></title><description><![CDATA[<p>Gut, wenn du jetzt aber den Destruktor implementierst, so dass der del() aufruft crashst.<br />
Weil jeder Kopie dann del() aufruft und Speicher zweimal freigegeben wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333892</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 24 Jun 2013 13:23:26 GMT</pubDate></item></channel></rss>