<?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[Invalid pointer]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich verzweifle an einen &quot;Invalid pointer&quot;. Ich habe mir folgende Klassenhierarchie gebastelt:</p>
<p>Meine Basisklasse:</p>
<pre><code>template&lt;typename P &gt;
class treeitem {
	public:
		P * getParent() {
			return _parent;
		}

		void setParent(P * parent) {
			_parent = parent;
		}
	protected:
		P * _parent;
};
</code></pre>
<p>Davon abgeleitet habe ich</p>
<pre><code>class Node: public treeitem&lt;Node&gt; {
	public:
		typedef std::vector&lt;treeitem&lt;Node&gt; *&gt;::iterator Iterator;

		Node();
		virtual ~Node();
		Iterator begin();
		Iterator end();

	private:
		std::vector&lt;treeitem&lt;Node&gt; *&gt; children;
};
</code></pre>
<p>und</p>
<pre><code>class Leaf : public treeitem&lt;Node&gt; {
	public:
		Leaf();
		virtual ~Leaf();
};
</code></pre>
<p>Der Destructor von Node sieht so aus:</p>
<pre><code>Node::~Node() {
	Node::Iterator it = children.begin();
	while (it != children.end()) {
		treeitem&lt;Node&gt; * child = *it;
		if (child != NULL) {
			delete child;
		}
		++it;
	}
}
</code></pre>
<p>Den Invalid pointer bekomme ich immer dann, wenn in Zeile 6 des Destructors</p>
<pre><code>delete child;
</code></pre>
<p>aufgerufen wird.</p>
<p>Was laeuft das schief?</p>
<p>Danke fuer eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274483/invalid-pointer</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 14:10:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274483.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 27 Sep 2010 08:23:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Invalid pointer on Mon, 27 Sep 2010 08:23:36 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich verzweifle an einen &quot;Invalid pointer&quot;. Ich habe mir folgende Klassenhierarchie gebastelt:</p>
<p>Meine Basisklasse:</p>
<pre><code>template&lt;typename P &gt;
class treeitem {
	public:
		P * getParent() {
			return _parent;
		}

		void setParent(P * parent) {
			_parent = parent;
		}
	protected:
		P * _parent;
};
</code></pre>
<p>Davon abgeleitet habe ich</p>
<pre><code>class Node: public treeitem&lt;Node&gt; {
	public:
		typedef std::vector&lt;treeitem&lt;Node&gt; *&gt;::iterator Iterator;

		Node();
		virtual ~Node();
		Iterator begin();
		Iterator end();

	private:
		std::vector&lt;treeitem&lt;Node&gt; *&gt; children;
};
</code></pre>
<p>und</p>
<pre><code>class Leaf : public treeitem&lt;Node&gt; {
	public:
		Leaf();
		virtual ~Leaf();
};
</code></pre>
<p>Der Destructor von Node sieht so aus:</p>
<pre><code>Node::~Node() {
	Node::Iterator it = children.begin();
	while (it != children.end()) {
		treeitem&lt;Node&gt; * child = *it;
		if (child != NULL) {
			delete child;
		}
		++it;
	}
}
</code></pre>
<p>Den Invalid pointer bekomme ich immer dann, wenn in Zeile 6 des Destructors</p>
<pre><code>delete child;
</code></pre>
<p>aufgerufen wird.</p>
<p>Was laeuft das schief?</p>
<p>Danke fuer eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957908</guid><dc:creator><![CDATA[sunnyholland]]></dc:creator><pubDate>Mon, 27 Sep 2010 08:23:36 GMT</pubDate></item><item><title><![CDATA[Reply to Invalid pointer on Mon, 27 Sep 2010 08:32:44 GMT]]></title><description><![CDATA[<p>sunnyholland schrieb:</p>
<blockquote>
<p>Den Invalid pointer bekomme ich immer dann, wenn in Zeile 6 des Destructors</p>
<pre><code>delete child;
</code></pre>
<p>aufgerufen wird.</p>
<p>Was laeuft das schief?</p>
</blockquote>
<p>Vielleicht hast du vorher einen invaliden Pointer eingefügt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957909</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 27 Sep 2010 08:32:44 GMT</pubDate></item><item><title><![CDATA[Reply to Invalid pointer on Mon, 27 Sep 2010 08:42:16 GMT]]></title><description><![CDATA[<p>Im Debugger sieht alles ganz normal aus.</p>
<p>Meine Testroutine sieht so aus:</p>
<pre><code>Node * node = new Node();
Leaf * leaf = new Leaf();
leaf-&gt;setParent(node);
*(node-&gt;begin()) = leaf;
delete node;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1957911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957911</guid><dc:creator><![CDATA[sunnyholland]]></dc:creator><pubDate>Mon, 27 Sep 2010 08:42:16 GMT</pubDate></item><item><title><![CDATA[Reply to Invalid pointer on Mon, 27 Sep 2010 08:47:53 GMT]]></title><description><![CDATA[<p>Gibt begin() einfach children.begin() zurück oder steckt da mehr Logik drin? children.begin() ist beim leeren Vector ja == children.end() und Du füllst an dieser Speicherstelle einfach was rein. Schätze, das gibt undefiniertes Verhalten.</p>
<p>Jedenfalls solltest Du in den vector via push_back einfügen. Eigentlich hat das mit deinem Fehler aber nicht direkt etwas zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957912</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Mon, 27 Sep 2010 08:47:53 GMT</pubDate></item><item><title><![CDATA[Reply to Invalid pointer on Mon, 27 Sep 2010 08:50:45 GMT]]></title><description><![CDATA[<p>sunnyholland schrieb:</p>
<blockquote>
<p>Im Debugger sieht alles ganz normal aus.</p>
<p>Meine Testroutine sieht so aus:</p>
<pre><code>Node * node = new Node();
Leaf * leaf = new Leaf();
leaf-&gt;setParent(node);
*(node-&gt;begin()) = leaf;
delete node;
</code></pre>
</blockquote>
<p>D.h. du weist children.begin() einfach einen Wert zu, ohne den Vector entsprechend zu vergössern? Das geht nicht, einfügen geht mit push_back().</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957913</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 27 Sep 2010 08:50:45 GMT</pubDate></item><item><title><![CDATA[Reply to Invalid pointer on Mon, 27 Sep 2010 08:59:07 GMT]]></title><description><![CDATA[<p>Ich hatte vorher einfach eine Array</p>
<pre><code>treeitem&lt;Node&gt; * children[8];
</code></pre>
<p>definiert und mir einen Iterator dazu geschrieben. Da passierte das selbe. Denn Array habe ich dann durch einen std::vector ersetzt und im den Konstruktor von Node folgender massen ergaenzt:</p>
<pre><code>Node::Node() 
    : children(8) 
{
}
</code></pre>
<p>Lasse ich mir dann die Groesse des Vectors mittel size() ausgeben, erhalte ich als Antwort 8.</p>
<p>Ich habe mir die Pointer nocheinmal genau angesehen und festgestellt, dass die Adresse von Leaf nach &quot;new Leaf()&quot; 0x81d098 ist, abgelegt im Vector wird aber 0x81d098. Damit ist der invalid pointer beim delete erklaert, nicht jedoch, warum das Element im Vector auf eine andere Adresse zeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957915</guid><dc:creator><![CDATA[sunnyholland]]></dc:creator><pubDate>Mon, 27 Sep 2010 08:59:07 GMT</pubDate></item><item><title><![CDATA[Reply to Invalid pointer on Mon, 27 Sep 2010 09:20:50 GMT]]></title><description><![CDATA[<p>Wenn ich mein Template treeitem durch eine konkrete Klasse ersetze, geht es. Aber warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957927</guid><dc:creator><![CDATA[sunnyholland]]></dc:creator><pubDate>Mon, 27 Sep 2010 09:20:50 GMT</pubDate></item><item><title><![CDATA[Reply to Invalid pointer on Mon, 27 Sep 2010 09:27:44 GMT]]></title><description><![CDATA[<p>Dir wurden bereits mehrere Fehler genannt. Ein weiterer ist, dass du deine Leaf über Basisklassenpointer löscht, ohne dass die Basisklasse einen virtuellen Destruktor hat.</p>
<blockquote>
<p>dass die Adresse von Leaf nach &quot;new Leaf()&quot; 0x81d098 ist, abgelegt im Vector wird aber 0x81d098</p>
</blockquote>
<p><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>
]]></description><link>https://www.c-plusplus.net/forum/post/1957931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957931</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 27 Sep 2010 09:27:44 GMT</pubDate></item><item><title><![CDATA[Reply to Invalid pointer on Mon, 27 Sep 2010 09:30:42 GMT]]></title><description><![CDATA[<p>Dem Template fehlt auf jeden Fall ein virtueller Destruktor. Das könnte es sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957934</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 27 Sep 2010 09:30:42 GMT</pubDate></item><item><title><![CDATA[Reply to Invalid pointer on Mon, 27 Sep 2010 09:39:55 GMT]]></title><description><![CDATA[<p>So einfach!!! Das wars. Vielen Dank!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957938</guid><dc:creator><![CDATA[sunnyholland]]></dc:creator><pubDate>Mon, 27 Sep 2010 09:39:55 GMT</pubDate></item><item><title><![CDATA[Reply to Invalid pointer on Mon, 27 Sep 2010 09:42:41 GMT]]></title><description><![CDATA[<p>Deine Klasse wird auch robuster, wenn du im Konstruktor des treeitem Parent mit 0 initialisierst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957941</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 27 Sep 2010 09:42:41 GMT</pubDate></item></channel></rss>