<?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[Pointer-Problem]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe ein großes Problem mit meiner BinaryTreeNode-Klasse und deren Pointern. Vorweg am besten mal eine kurzversion (ohne unnötige Methoden etc.) meiner Klasse, und den Code, der sie benutzt:</p>
<pre><code>#ifndef _BINARYTREENODE_H
#define _BINARYTREENODE_H

#include &lt;iostream&gt;

using namespace std;

template &lt;class T&gt; class BinaryTreeNode;

template &lt;class T&gt;
class BinaryTreeNode
{
public:
	BinaryTreeNode(const T&amp; _Element, const int&amp; _weight);
	~BinaryTreeNode();
	BinaryTreeNode(const T&amp; _Element, const int&amp; _weight, BinaryTreeNode&amp; l, BinaryTreeNode&amp; r);

	BinaryTreeNode&lt;T&gt;* left;
	BinaryTreeNode&lt;T&gt;* right;

	T Element;
	int weight;
};

template &lt;class T&gt;
BinaryTreeNode&lt;T&gt;::BinaryTreeNode(const T&amp; _Element, const int&amp; _weight)
{
	Element = _Element;
	weight = _weight;
	left = 0;
	right = 0;
}

template &lt;class T&gt;
BinaryTreeNode&lt;T&gt;::~BinaryTreeNode()
{
}

template &lt;class T&gt;
BinaryTreeNode&lt;T&gt;::BinaryTreeNode(const T&amp; _Element, const int&amp; _weight, BinaryTreeNode&amp; l, BinaryTreeNode&amp; r)
{
	Element = _Element;
	weight = _weight;
	left = &amp;l;
	right = &amp;r;
}

#endif
</code></pre>
<p>In meinem code will ich folgendes machen: Ich habe 2 BinaryTreeNodes in einem vector gespeichert, nun will ich die beiden daraus löschen und einen neuen BinaryTreeNode erstellen, welcher die beiden als &quot;left&quot; bzw. &quot;right&quot; subtree hat. Dazu rufe ich den entsprechenden Konstruktor auf:</p>
<pre><code>vector&lt;BinaryTreeNode&lt;char&gt;&gt; nodes; 

// der vector nodes wurde bereits mit einigen nodes gefüllt! 

while(nodes.size() &gt; 1)
{
	// concatinate the two smallest nodes
	BinaryTreeNode&lt;char&gt; l = nodes[0];
	BinaryTreeNode&lt;char&gt; r = nodes[1];
	nodes.erase(nodes.begin());
	nodes.erase(nodes.begin());
	BinaryTreeNode&lt;char&gt; n(' ', l.weight + r.weight, l, r);
	nodes.push_back(n);

	// re-sort the vector
	sort(nodes.begin(), nodes.end(), compareNodes);
}
</code></pre>
<p>Das kuriose ist, dass alles beim ersten Durchlauf der Schleife funktioniert. Beim debuggen sind alle nodes am richtigen Ort. Doch beim 2. Durchlauf, funktioniert es nicht mehr, dann verschachtelt sich eine Node immer und immer wieder, sie zeigt also auf sich selbst. Ich bin mittlerweile mit meinem Latein am Ende und hab wirklich keine Ahnung mehr warum es nicht klappt.</p>
<p>Der Punkt an dem sich alles verschachtelt tritt erst unmittelbar in der zweiten Zeile der schleife (beim 2. Durchgang) auf.</p>
<p>Hat jemand eine Ahnung was ich hier falsch mache?</p>
<p>Lieben Gruß und vielen Dank<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/269549/pointer-problem</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 02:30:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/269549.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 Jun 2010 12:58:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer-Problem on Sun, 27 Jun 2010 13:06:53 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe ein großes Problem mit meiner BinaryTreeNode-Klasse und deren Pointern. Vorweg am besten mal eine kurzversion (ohne unnötige Methoden etc.) meiner Klasse, und den Code, der sie benutzt:</p>
<pre><code>#ifndef _BINARYTREENODE_H
#define _BINARYTREENODE_H

#include &lt;iostream&gt;

using namespace std;

template &lt;class T&gt; class BinaryTreeNode;

template &lt;class T&gt;
class BinaryTreeNode
{
public:
	BinaryTreeNode(const T&amp; _Element, const int&amp; _weight);
	~BinaryTreeNode();
	BinaryTreeNode(const T&amp; _Element, const int&amp; _weight, BinaryTreeNode&amp; l, BinaryTreeNode&amp; r);

	BinaryTreeNode&lt;T&gt;* left;
	BinaryTreeNode&lt;T&gt;* right;

	T Element;
	int weight;
};

template &lt;class T&gt;
BinaryTreeNode&lt;T&gt;::BinaryTreeNode(const T&amp; _Element, const int&amp; _weight)
{
	Element = _Element;
	weight = _weight;
	left = 0;
	right = 0;
}

template &lt;class T&gt;
BinaryTreeNode&lt;T&gt;::~BinaryTreeNode()
{
}

template &lt;class T&gt;
BinaryTreeNode&lt;T&gt;::BinaryTreeNode(const T&amp; _Element, const int&amp; _weight, BinaryTreeNode&amp; l, BinaryTreeNode&amp; r)
{
	Element = _Element;
	weight = _weight;
	left = &amp;l;
	right = &amp;r;
}

#endif
</code></pre>
<p>In meinem code will ich folgendes machen: Ich habe 2 BinaryTreeNodes in einem vector gespeichert, nun will ich die beiden daraus löschen und einen neuen BinaryTreeNode erstellen, welcher die beiden als &quot;left&quot; bzw. &quot;right&quot; subtree hat. Dazu rufe ich den entsprechenden Konstruktor auf:</p>
<pre><code>vector&lt;BinaryTreeNode&lt;char&gt;&gt; nodes; 

// der vector nodes wurde bereits mit einigen nodes gefüllt! 

while(nodes.size() &gt; 1)
{
	// concatinate the two smallest nodes
	BinaryTreeNode&lt;char&gt; l = nodes[0];
	BinaryTreeNode&lt;char&gt; r = nodes[1];
	nodes.erase(nodes.begin());
	nodes.erase(nodes.begin());
	BinaryTreeNode&lt;char&gt; n(' ', l.weight + r.weight, l, r);
	nodes.push_back(n);

	// re-sort the vector
	sort(nodes.begin(), nodes.end(), compareNodes);
}
</code></pre>
<p>Das kuriose ist, dass alles beim ersten Durchlauf der Schleife funktioniert. Beim debuggen sind alle nodes am richtigen Ort. Doch beim 2. Durchlauf, funktioniert es nicht mehr, dann verschachtelt sich eine Node immer und immer wieder, sie zeigt also auf sich selbst. Ich bin mittlerweile mit meinem Latein am Ende und hab wirklich keine Ahnung mehr warum es nicht klappt.</p>
<p>Der Punkt an dem sich alles verschachtelt tritt erst unmittelbar in der zweiten Zeile der schleife (beim 2. Durchgang) auf.</p>
<p>Hat jemand eine Ahnung was ich hier falsch mache?</p>
<p>Lieben Gruß und vielen Dank<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1917905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1917905</guid><dc:creator><![CDATA[bruegge1987]]></dc:creator><pubDate>Sun, 27 Jun 2010 13:06:53 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem on Sun, 27 Jun 2010 13:23:05 GMT]]></title><description><![CDATA[<p>Ui...</p>
<pre><code>BinaryTreeNode&lt;char&gt; l = nodes[0];
    BinaryTreeNode&lt;char&gt; r = nodes[1];
</code></pre>
<p>Du weißt, dass du dir hier auf dem Stack Objekte erstellst, auf die du dann<br />
später referenzierst? Deine Objekte werden aber nach der while Schleife wieder<br />
gelöscht -&gt; deine Pointer zeigen ins Nirwana...<br />
Generell willst du wahrscheinlich eher:</p>
<pre><code>BinaryTreeNode&lt;char&gt;&amp; l = nodes[0];
    BinaryTreeNode&lt;char&gt;&amp; r = nodes[1];
</code></pre>
<p>wobei das aber auch keine gute Idee ist, da beim Umkopieren des Vektors<br />
aufgrund von Größenwachstum die Zeiger ungültig werden können.</p>
<p>EDIT: btw: Liegt vector&lt;BinaryTreeNode&lt;char&gt;&gt; nodes; auch auf dem Stack?<br />
EDIT2: Kennst du den Unterschied zwischen Stack und Heap?<br />
EDIT3: Bei nodes.push_back(n); wird übrigens auch wieder eine Kopie deines Knoten angelegt</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1917910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1917910</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 27 Jun 2010 13:23:05 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem on Sun, 27 Jun 2010 23:05:59 GMT]]></title><description><![CDATA[<p>Hallo CSpille!</p>
<p>Danke für deine Antwort, allerdings hab ich noch einige Fragen. Vorweg: ich bin noch c++ Anfänger! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Also ich verstehe nicht ganz, welchen Stack du meinst? Also ich hab eigentlich nur die Nodes in einem vector und verbinde dann die ersten 2 nodes zu einer neuen node (als left und right child) und versuche, diese neue node zum vector hinzuzufügen. Das ganze soll, wenn es mal groß ist ein Algorithmus zum erstellen von Huffman-Codes werden.</p>
<p>Den Unterschied zwischen heaps und stacks kenne ich, allerdings weiß ich nicht worauf du verweist.</p>
<p>Da bei dem push_back befehl eine kopie angelegt wird, kann es sein, dass ich einen Copy-Constructor brauche?</p>
<p>MFG<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918188</guid><dc:creator><![CDATA[bruegge1987]]></dc:creator><pubDate>Sun, 27 Jun 2010 23:05:59 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem on Sun, 27 Jun 2010 23:17:24 GMT]]></title><description><![CDATA[<p>l und r sind lokal, du übergibst sie im BinaryTreeNode-Konstruktor als Referenz und holst dir dann deren Adressen.<br />
Damit zeigen left und right auf die lokalen Nodes, die kurz darauf zerstört werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918190</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Sun, 27 Jun 2010 23:17:24 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem on Mon, 28 Jun 2010 09:58:22 GMT]]></title><description><![CDATA[<p>bruegge1987 schrieb:</p>
<blockquote>
<p>Den Unterschied zwischen heaps und stacks kenne ich, allerdings weiß ich nicht worauf du verweist.</p>
</blockquote>
<p>Wegen Verwendung des Plural gehe ich mal davon aus, dass du die generellen<br />
Datenstrukturen kennst, aber nicht auf C++ bezogen.</p>
<p>Also in C++ kann man Objekte auf dem Heap und auf dem Stack ablegen.<br />
Auf dem Stack sind diese nur innerhalb des aktuellen Scopes {} gültig,<br />
auf dem Heap (Erstellung mit new) müssen sie explizit per delete gelöscht werden.</p>
<p>Okay... Mal ein 'kurzer' Code-Auszug, der dir verdeutlichen soll, was<br />
eigentlich so passiert:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

class A{
int a;
public: A(int a){
                this-&gt;a = a;
                std::cout &lt;&lt; &quot;create &quot; &lt;&lt; a &lt;&lt; std::endl;
        }

        ~A(){
                std::cout &lt;&lt; &quot;delete  (&quot; &lt;&lt; this-&gt;a &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;
        }

        A(){
                this-&gt;a = 0;
                std::cout &lt;&lt; &quot;create&quot; &lt;&lt; std::endl;
        }

        A(const A&amp; a){
                this-&gt;a = a.a;
                std::cout &lt;&lt; &quot;copy &quot; &lt;&lt; this-&gt;a &lt;&lt; std::endl;
        }

        void operator=(const A&amp; a){
                std::cout &lt;&lt; &quot;assign &quot; &lt;&lt; a.a &lt;&lt; &quot; (&quot; &lt;&lt; this-&gt;a &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;
                this-&gt;a = a.a;
        }

        int getValue() const{
                return this-&gt;a;
        }

};

void doSomething(){
        A a(9);
}

int main(){
        std::vector&lt;A&gt; vector;
        A* a1 = new A(1);
        A* a2 = new A(2);
        A a3(3);
        A a4b;
        vector.push_back(a3);
        vector.push_back(a4b);
        A* a5 = a1;
        A&amp; a6(*a1);
        {
                A a4(4);
                a4b = a4;
                std::cout &lt;&lt; &quot;new value &quot; &lt;&lt; a4b.getValue() &lt;&lt; std::endl;
                a5 = &amp;a4;
                a6 = a4;
                doSomething();
                std::cout &lt;&lt; &quot;before end of scope&quot; &lt;&lt; std::endl;
        }
        // do not dereference a5, its referencing the destroyed a4;
        // EDIT: Da ja entgegen meinem Vorhaben die Referenz nicht umgebogen wird, sondern der operator=() aufgerufen wird, kannst du a6 weiterhin verwenden...
        // the reference a6 is also not usable anymore
        std::cout &lt;&lt; &quot;after end of scope&quot; &lt;&lt; std::endl;

        delete a1;
        // printing elements in vector: (copies of) a3 &amp; a4b
        // value of 'a4b' is 0, as it is a copy
        for(std::vector&lt;A&gt;::const_iterator it = vector.begin(); it!=vector.end(); ++it){
                std::cout &lt;&lt; &quot;elem &quot; &lt;&lt; it-&gt;getValue() &lt;&lt; std::endl;
        }
        // a2 is never deleted -&gt; memory leak;
        return 0;
}
</code></pre>
<p>Ausgabe mit Kommentaren (kann (glaub ich) evtl. leicht abweichen):</p>
<pre><code>create 1 // Erstellung eines Objektes auf dem Heap -&gt; gültig bis explizit delete aufgerufen wird
create 2 // analog
create 3 // Erstellung eines Objektes auf dem Stack
create // Erstllung eines weiteren Objektes auf dem Stack per Default-Konstruktor (sowas machst du z.B. hier BinaryTreeNode&lt;char&gt; l = nodes[0];)
copy 3 // Das Objekt wird in deinen Vektor kopiert
copy 3 // Ein neues Element soll eingefügt werden -&gt; dein Vektor braucht mehr platz -&gt; internes umkopieren -&gt; deswegen keine Referenzen oder Pointer auf Vektor-Elemente verwenden
copy 0 // Kopie des neu eingefügten Elementes
delete  (3) // Löschen des alten umkopierten Vektorinhalts
create 4 // Erstelle neues Objekt auf dem Stack
assign 4 (0) // Zuweisung des Objektinhalts an anderes Objekt (kein Objekt wird neu erstellt)
new value 4 // Ausgage des neuen Wertes
assign 4 (1) // hmm... Hier wollte ich eigentlich nur die Referenz umbiegen... Kommt gleich nen Post zu... Verstehe ich selbst nicht ^^
create 9 // Erstellen eines neuen Stack-Objektes in der Unterprozedur
delete  (9) // Zerstörung bei Verlassen der Funktion
before end of scope
delete  (4) // Zerstörung des Objektes bei Verlassen des Scopes
after end of scope
delete  (4) // Zerstörung des Heap-Objektes per delete (Neuer Inhalt von a1)
elem 3 // Inhalt Element 0 von Vektor
elem 0 // Inhalt Element 1 von Vektor, da Kopie immernoch 0 und nicht 4
delete  (4) // Löschen des Stack-Objektes a4b
delete  (3) // Löschen des Stack-Objektes a3
delete  (3) // Löschen des Vektors auf dem Stack (0. Element)
delete  (0) // Löschen des Vektors auf dem Stack (1. Element)
</code></pre>
<p>Ich hoffe, ich verwirre dich nicht zu viel, aber anhand des Beispiels siehst<br />
du evtl. was eigentlich so alles passiert...</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918255</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 28 Jun 2010 09:58:22 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem on Mon, 28 Jun 2010 09:20:54 GMT]]></title><description><![CDATA[<p>Oh das ist ja prima!! Werd den code gleich mal compilieren und mit dem debugger durchgehen damit ich auch alles verstehe! Vielen vielen Dank für die Mühe!!! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Ich denke das Problem in meinem Code habe ich nun verstanden und bin auch in der Lage das zu lösen! Ich wusste gar nicht, dass C++ die Objekte in einem Stack UND einem Heap verwaltet. Naja, ich sollte mir vielleicht ein Buch zulegen!</p>
<p>Also wie gesagt, ich werd' den code nun mal durchforsten und mir die ganzen integer alle der Reihe nach angucken. Vielen Dank nochmal, falls ich was tolles rausfinde, poste ich es hier <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>Lieben Gruß<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918279</guid><dc:creator><![CDATA[bruegge1987]]></dc:creator><pubDate>Mon, 28 Jun 2010 09:20:54 GMT</pubDate></item></channel></rss>