<?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[Memory Leaks &#x2F;&#x2F; malloc() &amp;amp; free() &#x2F;&#x2F; bsp: linked_list]]></title><description><![CDATA[<p>Hallo liebe C++ Gemeinschaft!</p>
<p>Ich habe mir eine kleine linked_list Klasse gecodet, welche auf class templates basiert (da Generics ja scheinbar erst bei MS VS C++ 2005 integriert sind, ich aber nur die 2003 version habe). Im Gegensatz zu der STL version soll meine linked_list nur die Funktionen aufweisen, die ich brauche, und dadurch für mich leichter zu verwenden sein. Deswegen habe ich überhaupt eine eigene machen wollen.</p>
<p>Jetzt habe ich aber ein grosses Problem, und zwar geht es um Memory leaks, bzw um Memory Management, Garbage Collector usw...</p>
<p>Ich habe es so gemacht, dass beim Entfernen eines Elements aus der Liste, das Element ebenfalls aus dem Speicher mittels free(ptr_to_element) entfernt wird.</p>
<p>Jetzt habe ich folgende Probleme / Fragen:</p>
<p>[<em>]Was wenn ein anderer Pointer ausserhalb der Liste noch darauf gezeigt hat??<br />
[</em>]Was wenn das Item des Elements ein Struct, oder Klasse ist, die wiederum Pointer auf alloziierte Speicher besitzt??<br />
[<em>]Wie kann ich im Element Destruktor unterscheiden, ob ein Primitive Type oder ein referenzierter item Typ vorliegt?? und dann davon abhängig evtl. free() benutzen?<br />
[</em>]Wie kann ich free() nur dann benutzen, wenn kein anderer Pointer mehr darauf zeigt??<br />
[*]Ich habe mal was von &quot;auto_pointer&quot; gehört, würde mir das hier nützen und wenn ja, wie?</p>
<p>Ja das sind viele Probleme, und genauso komme ich mir im Moment auch vor; wie soll ich das nur lösen??<br />
Ich bin für jede Anregung, Tips, oder gar Lösungsvorschläge sehr dankbar!</p>
<p>Falls gewünscht kann ich auch meinen Linked_list C++ Code pasten.</p>
<p>grüsse,<br />
Barnski.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/134896/memory-leaks-malloc-amp-free-bsp-linked_list</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 03:32:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/134896.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 29 Jan 2006 15:56:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Memory Leaks &#x2F;&#x2F; malloc() &amp;amp; free() &#x2F;&#x2F; bsp: linked_list on Sun, 29 Jan 2006 15:56:42 GMT]]></title><description><![CDATA[<p>Hallo liebe C++ Gemeinschaft!</p>
<p>Ich habe mir eine kleine linked_list Klasse gecodet, welche auf class templates basiert (da Generics ja scheinbar erst bei MS VS C++ 2005 integriert sind, ich aber nur die 2003 version habe). Im Gegensatz zu der STL version soll meine linked_list nur die Funktionen aufweisen, die ich brauche, und dadurch für mich leichter zu verwenden sein. Deswegen habe ich überhaupt eine eigene machen wollen.</p>
<p>Jetzt habe ich aber ein grosses Problem, und zwar geht es um Memory leaks, bzw um Memory Management, Garbage Collector usw...</p>
<p>Ich habe es so gemacht, dass beim Entfernen eines Elements aus der Liste, das Element ebenfalls aus dem Speicher mittels free(ptr_to_element) entfernt wird.</p>
<p>Jetzt habe ich folgende Probleme / Fragen:</p>
<p>[<em>]Was wenn ein anderer Pointer ausserhalb der Liste noch darauf gezeigt hat??<br />
[</em>]Was wenn das Item des Elements ein Struct, oder Klasse ist, die wiederum Pointer auf alloziierte Speicher besitzt??<br />
[<em>]Wie kann ich im Element Destruktor unterscheiden, ob ein Primitive Type oder ein referenzierter item Typ vorliegt?? und dann davon abhängig evtl. free() benutzen?<br />
[</em>]Wie kann ich free() nur dann benutzen, wenn kein anderer Pointer mehr darauf zeigt??<br />
[*]Ich habe mal was von &quot;auto_pointer&quot; gehört, würde mir das hier nützen und wenn ja, wie?</p>
<p>Ja das sind viele Probleme, und genauso komme ich mir im Moment auch vor; wie soll ich das nur lösen??<br />
Ich bin für jede Anregung, Tips, oder gar Lösungsvorschläge sehr dankbar!</p>
<p>Falls gewünscht kann ich auch meinen Linked_list C++ Code pasten.</p>
<p>grüsse,<br />
Barnski.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/979894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/979894</guid><dc:creator><![CDATA[Barnski]]></dc:creator><pubDate>Sun, 29 Jan 2006 15:56:42 GMT</pubDate></item><item><title><![CDATA[Reply to Memory Leaks &#x2F;&#x2F; malloc() &amp;amp; free() &#x2F;&#x2F; bsp: linked_list on Sun, 29 Jan 2006 16:10:10 GMT]]></title><description><![CDATA[<p>Autsch!</p>
<p>Generics sind C#, nicht C++. Es wird nicht gern gesehen, wenn man Sprachen durcheinander würfelt.<br />
Desweiteren benutzt man in C++ weder malloc noch free sondern new und delete.</p>
<p>Zu deinen Fragen:</p>
<p>1. Dann hat er Pech gehabt.<br />
2. Dann hat es Pech gehabt. (Es sei denn, es hat einen Destruktor und du benutzt new/delete)<br />
3. Gar nicht, du benutzt kein free.<br />
4. Gar nicht, du benutzt kein free. (Was du meinst ist ein <a href="http://www.boost.org/libs/smart_ptr/shared_ptr.htm" rel="nofollow">SharedPointer</a>, der macht das automagisch)<br />
5. s.o. (Aber für diesen Fall keinen auto_ptr, der übergibt die Zuständigkeit)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/979911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/979911</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sun, 29 Jan 2006 16:10:10 GMT</pubDate></item><item><title><![CDATA[Reply to Memory Leaks &#x2F;&#x2F; malloc() &amp;amp; free() &#x2F;&#x2F; bsp: linked_list on Sun, 29 Jan 2006 22:52:15 GMT]]></title><description><![CDATA[<p>Hi .filmor</p>
<p>.filmor schrieb:</p>
<blockquote>
<p>Autsch!</p>
<p>Generics sind C#, nicht C++. Es wird nicht gern gesehen, wenn man Sprachen durcheinander würfelt.</p>
</blockquote>
<p>Das Generics in C++ 2005 zur Verfügung steht habe ich von MSDN:<br />
<a href="http://msdn2.microsoft.com/en-us/library/8z2kbc1y(en-US,VS.80).aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/8z2kbc1y(en-US,VS.80).aspx</a></p>
<p>Auszug aus MSDN: schrieb:</p>
<blockquote>
<p>C++ Language Reference<br />
Generics (C++)</p>
<p>Visual C++ 2005 introduces support for generic methods and types in C++. In this section, find out how to author your own generic methods and types in C++ and how to use generic types authored in C# or another language in C++. This section also includes a comparison of generics and C++ templates.</p>
</blockquote>
<p>Aber da ich leider Visual C++ 2003 habe, muss ich mich mit templates zufrieden geben.</p>
<p>.filmor schrieb:</p>
<blockquote>
<p>Desweiteren benutzt man in C++ weder malloc noch free sondern new und delete.</p>
</blockquote>
<p>Danke für den Hinweis, habe meinen Code jetzt darauf umgestellt. Allerdings rufen new und delete jeweils auch malloc und free auf wie ich gesehen habe. New scheint mir übrigens ein nicht ganz vollwertiger Ersatz für malloc zu sein, da man da keine eigene Speichergrösse angeben kann.</p>
<p>Also meine linked_list und linked_cell haben/sollen beide Konstruktoren, Copy-Knstr, assignment-oper, und destruktor (haben).<br />
Dennoch scheint das Ganze noch nicht zu klappen.</p>
<p>Meine Probleme:</p>
<ul>
<li>Aufgrund der templates kann das item in der linked_cell mal eine Klasse, mal ein struct, und mal ein primitive type (int, double usw..) sein. Deshalb motzt der Compiler wenn ich im destruktor der linked_cell ein &quot;delete item&quot; mache, falls das item ein primitive type ist. Kann ich das nicht irgendwie unterscheiden je nach template type??</li>
<li>Der Compiler reklamiert wenn ich einen assignment-operator implementiere. Was ist daran falsch ??</li>
</ul>
<pre><code class="language-cpp">template&lt;class G&gt; class linked_cell {
public:
//[...]
// assignment-operator
	linked_cell &amp;operator=(const linked_cell&lt;G&gt;&amp;);
};
//[...]
template&lt;class G&gt; &amp;linked_cell&lt;G&gt;::operator=(const linked_cell&lt;G&gt; &amp;other) {
		// assignment-operator (object-copy).
	previous = other.previous;
	next = other.next;
	item = other.item;
	key = other.key;
}
//[...]
</code></pre>
<ul>
<li>Irgendwie scheint er Objekt-Referenzen (pointer) nicht richtig zuzuweisen. Folgendes sollte doch funktionieren, jedoch wird &quot;first&quot; nicht auf das nächste element gesetzt, wenn das erste gelöscht wird. Weshalb nicht, der Code müsste doch stimmen??</li>
</ul>
<pre><code class="language-cpp">//[...]
template&lt;class G&gt; void linked_list&lt;G&gt;::remove_el(linked_cell&lt;G&gt; *a_cell) {
		// remove element. do not change cursor (or change to next).
		// requires a_cell to be element of list and not NULL.
		// requires caller to free allocated space for the element afterwards.
	if (a_cell-&gt;previous == NULL) {
				// cell is at beginning
		first = a_cell-&gt;next;
		if (first != NULL) {
			first-&gt;previous = NULL;
		} else {
			last = NULL;
			after = true;
		}
		if (a_cell == current) {
			current = first;
		}
	} else if (a_cell-&gt;next == NULL) {
				// cell is at end
		last = a_cell-&gt;previous;
		last-&gt;next = NULL;
		if (a_cell == current) {
			current = NULL;
			after = true;
		}
	} else {
				// cell inbetween
		a_cell-&gt;previous-&gt;next = a_cell-&gt;next;
		a_cell-&gt;next-&gt;previous = a_cell-&gt;previous;
		if (a_cell == current) {
			current = current-&gt;next;
		}
	}
	count--;
};
//[...]
</code></pre>
<p>Die Probleme scheinen irgendwie nicht zu schwinden... ist mein Vorhaben überhaupt realisierbar?? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Ich hoffe ich habe das Ganze verständlich rüber gebracht.</p>
<p>grüsse,<br />
Barnski.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/980574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980574</guid><dc:creator><![CDATA[Barnski]]></dc:creator><pubDate>Sun, 29 Jan 2006 22:52:15 GMT</pubDate></item><item><title><![CDATA[Reply to Memory Leaks &#x2F;&#x2F; malloc() &amp;amp; free() &#x2F;&#x2F; bsp: linked_list on Mon, 30 Jan 2006 13:42:38 GMT]]></title><description><![CDATA[<p>Barnski schrieb:</p>
<blockquote>
<p>Das Generics in C++ 2005 zur Verfügung steht habe ich von MSDN</p>
</blockquote>
<p>1. Du meinst Visual C++ 2005 (Das aktuelle C++ ist C++98)<br />
2. Die Generics sind iirc eine Eigenschaft des CLR, also der .NET-Umgebung. Man verwendet also kein C++ sondern Managed-C++ oder C++/CLI. Übrigens lassen die sich auch in ISO-C++ realisieren (void-Zeiger in einem privaten Unterbau und Templateklasse als Wrapper).</p>
<p>Barnski schrieb:</p>
<blockquote>
<p>Allerdings rufen new und delete jeweils auch malloc und free auf wie ich gesehen habe.</p>
</blockquote>
<p>Das ist irrelevant, sie sorgen (auch wenn das im Code möglicherweise nicht sichtbar ist) für Konstruktor und Destruktor Aufrufe, beides Sachen, die malloc/free nicht tun.</p>
<p>Barnski schrieb:</p>
<blockquote>
<p>New scheint mir übrigens ein nicht ganz vollwertiger Ersatz für malloc zu sein, da man da keine eigene Speichergrösse angeben kann.</p>
</blockquote>
<p>Wozu sollte man das wollen? Arrays alloziiert man per new[] und ansonsten bekommt new die Größe automatisch über den zu alloziierenden Typ. Du kannst natürlich auch den ::operator new manuell aufrufen und ihm eine Größe übergeben (ist aber in den meisten Fällen ziemlich sinnlos). Für Arrays benutzt man in C++ new[] und delete[].</p>
<p>Barnski schrieb:</p>
<blockquote>
<p>[*]Aufgrund der templates kann das item in der linked_cell mal eine Klasse, mal ein struct, und mal ein primitive type (int, double usw..) sein. Deshalb motzt der Compiler wenn ich im destruktor der linked_cell ein &quot;delete item&quot; mache, falls das item ein primitive type ist. Kann ich das nicht irgendwie unterscheiden je nach template type??</p>
</blockquote>
<p>Könntest du da genauere Informationen rausrücken? Wenn du den Speicher mit new alloziiert hast, lässt er sich auch mit delete freigeben, egal ob POD (C-Struct bzw. int etc.) oder Klassenobjekt.</p>
<p>Barnski schrieb:</p>
<blockquote>
<p>[*]Der Compiler reklamiert wenn ich einen assignment-operator implementiere. Was ist daran falsch ??</p>
</blockquote>
<p>Formal nichts, bitte Fehlermeldung.</p>
<p>Barnski schrieb:</p>
<blockquote>
<p>[*]Irgendwie scheint er Objekt-Referenzen (pointer) nicht richtig zuzuweisen. Folgendes sollte doch funktionieren, jedoch wird &quot;first&quot; nicht auf das nächste element gesetzt, wenn das erste gelöscht wird. Weshalb nicht, der Code müsste doch stimmen??</p>
</blockquote>
<p>Referenzen != Zeiger! Was ist first?</p>
<p>Barnski schrieb:</p>
<blockquote>
<p>Die Probleme scheinen irgendwie nicht zu schwinden... ist mein Vorhaben überhaupt realisierbar?? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Natürlich ist es das, es ist ja auch schon annähernd <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mn>2</mn><mn>1</mn></msup><mn>0</mn><mn>0</mn></mrow><annotation encoding="application/x-tex">2^100</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.8141079999999999em;"></span><span class="strut bottom" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord"><span class="mord mathrm">2</span><span class="vlist"><span style="top:-0.363em;margin-right:0.05em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-textstyle scriptstyle uncramped"><span class="mord mathrm">1</span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span><span class="mord mathrm">0</span><span class="mord mathrm">0</span></span></span></span>-mal implementiert worden (z.B. auch in der C++-Standardbibliothek, siehe Header &lt;list&gt;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/981070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981070</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Mon, 30 Jan 2006 13:42:38 GMT</pubDate></item><item><title><![CDATA[Reply to Memory Leaks &#x2F;&#x2F; malloc() &amp;amp; free() &#x2F;&#x2F; bsp: linked_list on Mon, 30 Jan 2006 21:33:41 GMT]]></title><description><![CDATA[<p>hi .filmor!</p>
<p>Ja, ich benutze MS Visual Studio 2003. Meine anfängliche Bemerkung wegen Generics bezog sich auf VC++ 2005, Microsoft hat das da offenbar mitintegriert, wie du erklärt hast.</p>
<p>.filmor schrieb:</p>
<blockquote>
<p>Könntest du da genauere Informationen rausrücken? Wenn du den Speicher mit new alloziiert hast, lässt er sich auch mit delete freigeben, egal ob POD (C-Struct bzw. int etc.) oder Klassenobjekt.</p>
</blockquote>
<p>Wenn ich folgendes mache, gibt der Compiler nachfolgende Fehlermeldung aus:</p>
<pre><code class="language-cpp">//destructor
template&lt;class G&gt; linked_cell&lt;G&gt;::~linked_cell() {
		// destructor of linked_cell. free allocated memory by current cell.
	delete item;  // zeile 66
}
</code></pre>
<pre><code class="language-cpp">//[...]
linked_list&lt;int&gt; a_test;
//[...]
</code></pre>
<p>vc++ compiler schrieb:</p>
<blockquote>
<p>linked_cell.h(66): error C2541: 'delete' : cannot delete objects that are not pointers</p>
</blockquote>
<p>Wie kann ich in diesem Zusammenhang new verwenden bei int und wo?</p>
<p>Die linked_cell Klassendefinition sieht folgendermassen aus:</p>
<pre><code class="language-cpp">template&lt;class G&gt; class linked_cell {

public:
// constructor
	linked_cell(const G);
	linked_cell(const G, int);
// copy constructor
	linked_cell (const linked_cell&lt;G&gt;&amp;);
// assignment-operator
	//linked_cell &amp;operator=(const linked_cell&lt;G&gt;&amp;);
// destructor
	~linked_cell();

// attributes
	// reference to previous cell.
	linked_cell&lt;G&gt; *previous;

	// reference to next cell.
	linked_cell&lt;G&gt; *next;

	// reference to item of this cell (may be primitive type).
	G item;

	// key for searching &amp; sorting.
	int key;

// queries
};
</code></pre>
<p>assignment operator auskommentiert weil er ne fehlermeldung gibt, und zwar folgende:</p>
<p>vc++ compiler schrieb:</p>
<blockquote>
<p>linked_cell.h(61): error C2501: 'linked_cell&lt;G&gt;::=' : missing storage-class or type specifiers</p>
</blockquote>
<p>Zeile 61 ist einfach nach der Implementierung der Methode:</p>
<pre><code class="language-cpp">template&lt;class G&gt; &amp;linked_cell&lt;G&gt;::operator=(const linked_cell&lt;G&gt; &amp;other) {
		// assignment-operator (object-copy).
	previous = other.previous;
	next = other.next;
	item = other.item;
	key = other.key;
} // zeile 61
</code></pre>
<p>.filmor schrieb:</p>
<blockquote>
<p>Referenzen != Zeiger! Was ist first?</p>
</blockquote>
<p>Referenzen verhalten sich aber bei der Syntax gleich wie Pointer oder?<br />
also</p>
<pre><code class="language-cpp">my_class *my_object;
</code></pre>
<p>gibt eine Referenz auf ein Objekt,<br />
wenn ich die Referenz umlenken will, mache ich</p>
<pre><code class="language-cpp">my_object = new my_class(); //mit konstruktor
</code></pre>
<p>Oder liegt da etwa der Hund begraben??</p>
<p>Hiermit komme ich auch gerade zu &quot;first&quot;. So sieht die linked_list Klassen definition aus:</p>
<pre><code class="language-cpp">template&lt;class G&gt; class linked_list {

public:

//Constructor
	linked_list();
//copy-constructor
	linked_list (const linked_list&lt;G&gt;&amp;);
//destructor
	~linked_list();
//attributes
	// reference to first cell, NULL if list is empty.
	linked_cell&lt;G&gt; *first;

	// reference to current cell, NULL if not set. start() sets it to first.	
	linked_cell&lt;G&gt; *current;

	// reference to last cell, NULL if list is empty.	
	linked_cell&lt;G&gt; *last;

	// current index of cursor.	
	int index;

	// num of elements in the list.
	int count;

	// is cursor after the end of the list?
	bool after;

	// sort mode of the list: 0=not_sorted, -1=downwards, 1=upwards
	//enum sortmode {downwards=-1, not_sorted=0, upwards=1} sort_mode;
	int sort_mode;

//queries
	// return i_th cell.	
	linked_cell&lt;G&gt; *i_th(int);

//commands
//[...]
	// remove current element.
	void remove();

	// remove an element.
	void remove_el(linked_cell&lt;G&gt;*);

	// remove i_th element.
	void remove_i_th(int);
//[...]
};
</code></pre>
<p>Hier die relevanten implementierten Methoden:</p>
<pre><code class="language-cpp">template&lt;class G&gt; void linked_list&lt;G&gt;::remove_el(linked_cell&lt;G&gt; *a_cell) {
		// remove element. do not change cursor (or change to next).
		// requires a_cell to be element of list and not NULL.
		// requires caller to free allocated space for the element afterwards.
	if (a_cell-&gt;previous == NULL) {
				// cell is at beginning
		first = a_cell-&gt;next;
		if (first != NULL) {
			first-&gt;previous = NULL;
		} else {
			last = NULL;
			after = true;
		}
		if (a_cell == current) {
			current = first;
		}
	} else if (a_cell-&gt;next == NULL) {
				// cell is at end
		last = a_cell-&gt;previous;
		last-&gt;next = NULL;
		if (a_cell == current) {
			current = NULL;
			after = true;
		}
	} else {
				// cell inbetween
		a_cell-&gt;previous-&gt;next = a_cell-&gt;next;
		a_cell-&gt;next-&gt;previous = a_cell-&gt;previous;
		if (a_cell == current) {
			current = current-&gt;next;
		}
	}
	count--;
};

template&lt;class G&gt; void linked_list&lt;G&gt;::forth() {
		// set current to next cell. index will increase. if end of list is reached, after is set to true.

	if (current == NULL) {
			// current cell is after end of list or not yet initialized.
		after = true;
		index = 0;
	} else {
			// current cell is valid.
		current = current-&gt;next;
		index++;
		after = (current == NULL);
	}
};

template&lt;class G&gt; void linked_list&lt;G&gt;::start() {
		// set current to first and index = 0 and after = false if list not empty.
	current = first;
	index = 0;
	after = (first == NULL);
};
</code></pre>
<p>Danke für die Mühe &amp; Antworten,</p>
<p>gruss,<br />
Barnski.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/981585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981585</guid><dc:creator><![CDATA[Barnski]]></dc:creator><pubDate>Mon, 30 Jan 2006 21:33:41 GMT</pubDate></item><item><title><![CDATA[Reply to Memory Leaks &#x2F;&#x2F; malloc() &amp;amp; free() &#x2F;&#x2F; bsp: linked_list on Tue, 31 Jan 2006 09:54:04 GMT]]></title><description><![CDATA[<p>Barnski schrieb:</p>
<blockquote>
<p>.filmor schrieb:</p>
<blockquote>
<p>Könntest du da genauere Informationen rausrücken? Wenn du den Speicher mit new alloziiert hast, lässt er sich auch mit delete freigeben, egal ob POD (C-Struct bzw. int etc.) oder Klassenobjekt.</p>
</blockquote>
<p>Wenn ich folgendes mache, gibt der Compiler nachfolgende Fehlermeldung aus:</p>
<pre><code class="language-cpp">//destructor
template&lt;class G&gt; linked_cell&lt;G&gt;::~linked_cell() {
		// destructor of linked_cell. free allocated memory by current cell.
	delete item;  // zeile 66
}
</code></pre>
<pre><code class="language-cpp">//[...]
linked_list&lt;int&gt; a_test;
//[...]
</code></pre>
<p>vc++ compiler schrieb:</p>
<blockquote>
<p>linked_cell.h(66): error C2541: 'delete' : cannot delete objects that are not pointers</p>
</blockquote>
<p>Wie kann ich in diesem Zusammenhang new verwenden bei int und wo?</p>
</blockquote>
<p>Du bekommst den Item-Inhalt von der Anwendung, richtig? Also kannst du auch die Anwendung dafür verantwortlich machen, einen vernünftigen Destruktor dafür bereitzustellen (int braucht nicht aufgeräumt zu werden - und selbt bei einer linked_list&lt;int*&gt; kannst du nicht wissen, ob dort ein delete nötig ist, also überlass das besser demjenigen, der die Liste verwenden will).</p>
<blockquote>
<p>assignment operator auskommentiert weil er ne fehlermeldung gibt, und zwar folgende:</p>
<p>vc++ compiler schrieb:</p>
<blockquote>
<p>linked_cell.h(61): error C2501: 'linked_cell&lt;G&gt;::=' : missing storage-class or type specifiers</p>
</blockquote>
<p>Zeile 61 ist einfach nach der Implementierung der Methode:</p>
<pre><code class="language-cpp">template&lt;class G&gt; &amp;linked_cell&lt;G&gt;::operator=(const linked_cell&lt;G&gt; &amp;other) {
		// assignment-operator (object-copy).
	previous = other.previous;
	next = other.next;
	item = other.item;
	key = other.key;
} // zeile 61
</code></pre>
</blockquote>
<p>Du hast bei der Definition den Rückgabetyp vergessen: &quot;template&lt;class G&gt; <strong>linked_cell&lt;G&gt;&amp;</strong> linked_cell&lt;G&gt;::operator=(const linked_cell&lt;G&gt;&amp; other)...&quot;</p>
<blockquote>
<p>.filmor schrieb:</p>
<blockquote>
<p>Referenzen != Zeiger! Was ist first?</p>
</blockquote>
<p>Referenzen verhalten sich aber bei der Syntax gleich wie Pointer oder?<br />
also</p>
<pre><code class="language-cpp">my_class *my_object;
</code></pre>
<p>gibt eine Referenz auf ein Objekt,<br />
wenn ich die Referenz umlenken will, mache ich</p>
<pre><code class="language-cpp">my_object = new my_class(); //mit konstruktor
</code></pre>
<p>Oder liegt da etwa der Hund begraben??</p>
</blockquote>
<p>Nein, was du da verwendest, sind Pointer - Referenzen deklarierst du mit &quot;my_class&amp; my_object = some_other_object;&quot; und kannst sie im Nachhinein nicht mehr umbiegen.<br />
(und für eine Linked-List sind Referenzen auch nicht wirklich brauchbar, weil du die Listenelemente ja umhängen mußt)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/981799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981799</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Tue, 31 Jan 2006 09:54:04 GMT</pubDate></item><item><title><![CDATA[Reply to Memory Leaks &#x2F;&#x2F; malloc() &amp;amp; free() &#x2F;&#x2F; bsp: linked_list on Fri, 03 Feb 2006 17:55:14 GMT]]></title><description><![CDATA[<p>Hallo nochmals,</p>
<p>Wollte mich nur noch für die Hilfe bedanken @ CStoll und .filmor.</p>
<p>Meine linked list scheint jetzt zu funktionieren, und den Speicher werde ich nun nicht mehr von der liste selber löschen lassen, sondern mir was anderes überlegen..</p>
<p>gruss,<br />
Barnski.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/985215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/985215</guid><dc:creator><![CDATA[Barnski]]></dc:creator><pubDate>Fri, 03 Feb 2006 17:55:14 GMT</pubDate></item><item><title><![CDATA[Reply to Memory Leaks &#x2F;&#x2F; malloc() &amp;amp; free() &#x2F;&#x2F; bsp: linked_list on Sat, 04 Feb 2006 11:28:52 GMT]]></title><description><![CDATA[<p>Barnski schrieb:</p>
<blockquote>
<p>und den Speicher werde ich nun nicht mehr von der liste selber löschen lassen, sondern mir was anderes überlegen..</p>
</blockquote>
<p>Du kannst dafür Policies verwenden:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct PolDelete
{
   void deleteIt(T t)
   {
      // wenn kein Zeiger, dann mache nichts
   }
};

/// Spezialisierung für Zeiger
template &lt;&gt;
struct PolDelete&lt;T*&gt;
{
   void deleteIt(T t)
   {
      delete t;
   }
};

/// und verwenden kanns Du das dann so:
template&lt;class G&gt; linked_cell&lt;G&gt;::~linked_cell() {
        // destructor of linked_cell. free allocated memory by current cell.
    PolDelete&lt;G&gt; pd;
    pd.deleteIt(item);  // zeile 66
}
</code></pre>
<p>So sollte es funktionieren, vielleicht macht da der VC++ Probleme.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/985551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/985551</guid><dc:creator><![CDATA[adxin]]></dc:creator><pubDate>Sat, 04 Feb 2006 11:28:52 GMT</pubDate></item><item><title><![CDATA[Reply to Memory Leaks &#x2F;&#x2F; malloc() &amp;amp; free() &#x2F;&#x2F; bsp: linked_list on Sat, 04 Feb 2006 16:37:01 GMT]]></title><description><![CDATA[<p>Ah, genau sowas habe ich gesucht! also wäre es doch möglich.. thx <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Ich habe mich jedoch dazu entschlossen einen eigenen Garbage Collector zu schreiben, mit eigenen malloc und free funktionen.</p>
<p>der soll einen memory automatisch freigeben wenn kein Pointer mehr darauf zeigt! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<p>gruss,<br />
Barnski</p>
]]></description><link>https://www.c-plusplus.net/forum/post/985858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/985858</guid><dc:creator><![CDATA[Barnski]]></dc:creator><pubDate>Sat, 04 Feb 2006 16:37:01 GMT</pubDate></item><item><title><![CDATA[Reply to Memory Leaks &#x2F;&#x2F; malloc() &amp;amp; free() &#x2F;&#x2F; bsp: linked_list on Sat, 04 Feb 2006 16:41:49 GMT]]></title><description><![CDATA[<p>Nach deinen bisherigen Postings in diesem Thread glaub ich kaum das du einen<br />
Garbage Collector schreiben kannst/wirst. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/985867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/985867</guid><dc:creator><![CDATA[AberHallo]]></dc:creator><pubDate>Sat, 04 Feb 2006 16:41:49 GMT</pubDate></item><item><title><![CDATA[Reply to Memory Leaks &#x2F;&#x2F; malloc() &amp;amp; free() &#x2F;&#x2F; bsp: linked_list on Sat, 04 Feb 2006 20:27:10 GMT]]></title><description><![CDATA[<p>Ich muss ja nicht einen super tollen GC machen... Er soll gerade meinen Ansprüchen und Notwendigkeiten genügen...</p>
<p>übrigens für alle die's interessiert, ich habe hier ein GC-FAQ gefunden:</p>
<p><a href="http://www.iecc.com/gclist/GC-faq.html" rel="nofollow">http://www.iecc.com/gclist/GC-faq.html</a></p>
<p>und ein smart-pointer FAQ:</p>
<p><a href="http://ootips.org/yonat/4dev/smart-pointers.html" rel="nofollow">http://ootips.org/yonat/4dev/smart-pointers.html</a></p>
<p>gruss,<br />
Barnski.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/986075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/986075</guid><dc:creator><![CDATA[Barnski]]></dc:creator><pubDate>Sat, 04 Feb 2006 20:27:10 GMT</pubDate></item></channel></rss>