<?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[Stack mit Klassen füllen]]></title><description><![CDATA[<p>Also ich habe einen Stack geschrieben, der sämtliche Datentypen unterstützen soll.<br />
So weit so gut klappt ja auch alles wunderbar, und bei den standartdatentypen wird der gebrauchter Speicher während den push-aufrufen größer und während den pop-aufrufen kleiner. Wenn ich aber jetzt ne klasse als element nehme, wird der speicher auch richtig allokiert aber bei der pop-methode wird nur ein Teil des Speichers wieder freigemacht, so dass der Speicher erst frei wird wenn ich das programm beende.</p>
<p>Hier mal der Code:</p>
<pre><code>#ifndef STACK_H
#define STACK_H

template&lt;class T&gt;
class Stack
    {
    private:
        struct element
            {
            element* nxt;
            T value;
            };
        element* top;
        int anz_elem;
    public:
        Stack();
        ~Stack();
        int push(T v);
        int pop(T&amp; v);
        int get_anzahl();
        int isempty();
    };

template&lt;class T&gt;
Stack&lt;T&gt;::Stack()
    {
    top = 0;
    anz_elem = 0;
    }

template&lt;class T&gt;
Stack&lt;T&gt;::~Stack()
    {
    T dummy;
    while(pop(dummy))
        ;
    }

template&lt;class T&gt;
int Stack&lt;T&gt;::push(T v)
    {
    element *x = new element;
    if(!x)
        return 0;
    x-&gt;value = v;
    x-&gt;nxt = top;
    top = x;
    anz_elem++;
    return 1;
    }

template&lt;class T&gt;
int Stack&lt;T&gt;::pop(T &amp;v)
    {
    element *x = top;
    if(!x)    
        return 0;
    v = x-&gt;value;
    top = x-&gt;nxt;
    delete(x);
    anz_elem--;
    return 1;
    }

template&lt;class T&gt;
int Stack&lt;T&gt;::get_anzahl()
    {
    return (anz_elem);
    }

template&lt;class T&gt;
int Stack&lt;T&gt;::isempty()
    {
    return(anz_elem == 0);
    }
#endif
</code></pre>
<p>In der main steht dann folgender Code:</p>
<pre><code>class punkt
    {
    public:
        int i;
        int j;
        int q;
        int r;
        int z;
    };

int main()
    {
    Stack&lt;punkt&gt;* stck = new Stack&lt;punkt&gt;;
    punkt p;
    cout &lt;&lt; &quot;Put: &quot; &lt;&lt; endl;
    for(p.i = 0; p.i &lt; 10000000; p.i++)
        {
        stck-&gt;push(p);
        cout &lt;&lt; p.i &lt;&lt; &quot; &quot;;
        }
    cout &lt;&lt; endl &lt;&lt; &quot;Get: &quot; &lt;&lt; endl;
    while(stck-&gt;pop(p))
        cout &lt;&lt; p.i &lt;&lt; &quot; &quot;;
    if(stck-&gt;isempty())
        cout &lt;&lt; &quot;Empty&quot;;
    delete (stck); 
    cin &gt;&gt; p.i;
    }
</code></pre>
<p>So ich hoffe dass ihr mir helfen könnt^^ denn bei längerer laufzeit wäre dieser Speicher tödlich für das System...</p>
<p>Hier mal das bild vom gebrauchten Speicher:</p>
<p><a href="http://imageshack.us" rel="nofollow">[img=http://img61.imageshack.us/img61/1008/sanstitreji0.png]</a></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/217346/stack-mit-klassen-füllen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 15:53:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/217346.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 06 Jul 2008 18:48:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Stack mit Klassen füllen on Sun, 06 Jul 2008 18:48:14 GMT]]></title><description><![CDATA[<p>Also ich habe einen Stack geschrieben, der sämtliche Datentypen unterstützen soll.<br />
So weit so gut klappt ja auch alles wunderbar, und bei den standartdatentypen wird der gebrauchter Speicher während den push-aufrufen größer und während den pop-aufrufen kleiner. Wenn ich aber jetzt ne klasse als element nehme, wird der speicher auch richtig allokiert aber bei der pop-methode wird nur ein Teil des Speichers wieder freigemacht, so dass der Speicher erst frei wird wenn ich das programm beende.</p>
<p>Hier mal der Code:</p>
<pre><code>#ifndef STACK_H
#define STACK_H

template&lt;class T&gt;
class Stack
    {
    private:
        struct element
            {
            element* nxt;
            T value;
            };
        element* top;
        int anz_elem;
    public:
        Stack();
        ~Stack();
        int push(T v);
        int pop(T&amp; v);
        int get_anzahl();
        int isempty();
    };

template&lt;class T&gt;
Stack&lt;T&gt;::Stack()
    {
    top = 0;
    anz_elem = 0;
    }

template&lt;class T&gt;
Stack&lt;T&gt;::~Stack()
    {
    T dummy;
    while(pop(dummy))
        ;
    }

template&lt;class T&gt;
int Stack&lt;T&gt;::push(T v)
    {
    element *x = new element;
    if(!x)
        return 0;
    x-&gt;value = v;
    x-&gt;nxt = top;
    top = x;
    anz_elem++;
    return 1;
    }

template&lt;class T&gt;
int Stack&lt;T&gt;::pop(T &amp;v)
    {
    element *x = top;
    if(!x)    
        return 0;
    v = x-&gt;value;
    top = x-&gt;nxt;
    delete(x);
    anz_elem--;
    return 1;
    }

template&lt;class T&gt;
int Stack&lt;T&gt;::get_anzahl()
    {
    return (anz_elem);
    }

template&lt;class T&gt;
int Stack&lt;T&gt;::isempty()
    {
    return(anz_elem == 0);
    }
#endif
</code></pre>
<p>In der main steht dann folgender Code:</p>
<pre><code>class punkt
    {
    public:
        int i;
        int j;
        int q;
        int r;
        int z;
    };

int main()
    {
    Stack&lt;punkt&gt;* stck = new Stack&lt;punkt&gt;;
    punkt p;
    cout &lt;&lt; &quot;Put: &quot; &lt;&lt; endl;
    for(p.i = 0; p.i &lt; 10000000; p.i++)
        {
        stck-&gt;push(p);
        cout &lt;&lt; p.i &lt;&lt; &quot; &quot;;
        }
    cout &lt;&lt; endl &lt;&lt; &quot;Get: &quot; &lt;&lt; endl;
    while(stck-&gt;pop(p))
        cout &lt;&lt; p.i &lt;&lt; &quot; &quot;;
    if(stck-&gt;isempty())
        cout &lt;&lt; &quot;Empty&quot;;
    delete (stck); 
    cin &gt;&gt; p.i;
    }
</code></pre>
<p>So ich hoffe dass ihr mir helfen könnt^^ denn bei längerer laufzeit wäre dieser Speicher tödlich für das System...</p>
<p>Hier mal das bild vom gebrauchten Speicher:</p>
<p><a href="http://imageshack.us" rel="nofollow">[img=http://img61.imageshack.us/img61/1008/sanstitreji0.png]</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1542050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1542050</guid><dc:creator><![CDATA[uhsuhz]]></dc:creator><pubDate>Sun, 06 Jul 2008 18:48:14 GMT</pubDate></item><item><title><![CDATA[Reply to Stack mit Klassen füllen on Sun, 06 Jul 2008 18:56:19 GMT]]></title><description><![CDATA[<p>hmm fehler in der linkangabe</p>
<p>hier ist der richtige link:</p>
<p><a href="http://img61.imageshack.us/img61/1008/sanstitreji0.png" rel="nofollow">http://img61.imageshack.us/img61/1008/sanstitreji0.png</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1542054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1542054</guid><dc:creator><![CDATA[uhsuhz]]></dc:creator><pubDate>Sun, 06 Jul 2008 18:56:19 GMT</pubDate></item><item><title><![CDATA[Reply to Stack mit Klassen füllen on Sun, 06 Jul 2008 20:12:56 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct element
            {
            element* nxt;
            T value;
            };
</code></pre>
<p>Du hast hier keinen destructor definiert der den destructur für element aufruft und damit sieht der compiler deinen zeiger nur als integer und löscht den.</p>
<pre><code class="language-cpp">template&lt;class T&gt;
int Stack&lt;T&gt;::pop(T &amp;v)
    {
    element *x = top;
    if(!x)    
        return 0;
    v = x-&gt;value;
    top = x-&gt;nxt;
    delete(x-&gt;next); &lt;- irgendwie so muss dein aufruf aussehen
    anz_elem--;
    return 1;
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1542105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1542105</guid><dc:creator><![CDATA[O.G.Wrapper]]></dc:creator><pubDate>Sun, 06 Jul 2008 20:12:56 GMT</pubDate></item><item><title><![CDATA[Reply to Stack mit Klassen füllen on Sun, 06 Jul 2008 20:21:02 GMT]]></title><description><![CDATA[<p>Leider kann ichdir nicht genua helfen... jedoch ist mir in deiner pop-methode etwas aufgefallen:</p>
<p>Wenn dunur ein element hast...<br />
rutscht top auf seinen eigenen Nachfolger, der aber auf 0 zeigt...</p>
<p>top<br />
|v|n|-&gt;0</p>
<p>x=top<br />
|v|n|-&gt;0</p>
<p>Hier soltle ein Fehler sein<br />
top=x-&gt;nxt<br />
x<br />
|v|n|-&gt;0</p>
<p>x-&gt;nxt (=top)<br />
0</p>
<p>top wird also Null oder wie sehe ich das ?</p>
<p>EDIT:<br />
Probier doch mal alle deine im Stack zu speichernde Klasse enthaltenen Variablen i,q,r,... als zeiger zu setzen und sie dann zu löschen. Kannst ja noch einen Konstruktur für die Klasse Punkt bauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1542111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1542111</guid><dc:creator><![CDATA[Quellcode]]></dc:creator><pubDate>Sun, 06 Jul 2008 20:21:02 GMT</pubDate></item><item><title><![CDATA[Reply to Stack mit Klassen füllen on Mon, 07 Jul 2008 13:06:25 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4881">@Quellcode</a></p>
<p>das habe ich jetzt nicht ganz verstanden mit dem fehler in der pop-methode^^<br />
vielleicht könntest du dass mal etwas genauer erklären.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1542630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1542630</guid><dc:creator><![CDATA[uhsuhz]]></dc:creator><pubDate>Mon, 07 Jul 2008 13:06:25 GMT</pubDate></item><item><title><![CDATA[Reply to Stack mit Klassen füllen on Mon, 07 Jul 2008 14:30:52 GMT]]></title><description><![CDATA[<p>habe mitbekommen, dass die pop-Methode richtig ist... bin's nochmal Stück für Stück durchgegangen... Wo aber dein Fehler liegt weiß ich nicht... kann nur versuchen logisch daran zu gehen:</p>
<p>Du reservierst Speicherplatz, aber gibst ihn nicht wieder komplett frei. Irgendwo fehlt ein delete warscheinlich. Oder aber der Speicherplatz für die Integer wird nicht wieder freigegeben (wenn er überhaupt reserviert wird).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1542759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1542759</guid><dc:creator><![CDATA[Quellcode]]></dc:creator><pubDate>Mon, 07 Jul 2008 14:30:52 GMT</pubDate></item><item><title><![CDATA[Reply to Stack mit Klassen füllen on Mon, 07 Jul 2008 14:36:45 GMT]]></title><description><![CDATA[<p>ich weiß auch nicht wo das problem ist, aber der speicher wird allokiert, man sieht es ja im gebrauchten speicher, auf dem bild...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1542775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1542775</guid><dc:creator><![CDATA[uhsuhz]]></dc:creator><pubDate>Mon, 07 Jul 2008 14:36:45 GMT</pubDate></item><item><title><![CDATA[Reply to Stack mit Klassen füllen on Mon, 07 Jul 2008 14:38:34 GMT]]></title><description><![CDATA[<p>probier mal</p>
<pre><code class="language-cpp">delete [] stack;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1542780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1542780</guid><dc:creator><![CDATA[Quellcode]]></dc:creator><pubDate>Mon, 07 Jul 2008 14:38:34 GMT</pubDate></item><item><title><![CDATA[Reply to Stack mit Klassen füllen on Mon, 07 Jul 2008 16:41:02 GMT]]></title><description><![CDATA[<p>ia nee der stack funktionniert ja auch komplett, die löschung aber die gespeicherten klassen werden nicht ganz freigegeben, ich glaub der erste post:</p>
<p>Du hast hier keinen destructor definiert der den destructur für element aufruft und damit sieht der compiler deinen zeiger nur als integer und löscht den.</p>
<p>hat den fehler entdeckt nur sein code kann nicht klappen da ich sonst das erste element ganz lösche und somit die liste futsch ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1542895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1542895</guid><dc:creator><![CDATA[uhsuhz]]></dc:creator><pubDate>Mon, 07 Jul 2008 16:41:02 GMT</pubDate></item><item><title><![CDATA[Reply to Stack mit Klassen füllen on Mon, 07 Jul 2008 19:35:56 GMT]]></title><description><![CDATA[<p>So hab jetzt mal was umgeändert, der speicher wird jetzt auch zur laufzeit freigemacht, ich bin mir aber nicht sicher ob es ganz richitg funktionniert... es scheint zwar so, aber ob es wirklich so ist...</p>
<pre><code>template&lt;class T&gt;
class CStack
    {
    private:
        struct element
            {
            element* nxt;
            T* value;
            };
        element* top;
        int anz_elem;
    public:
        CStack();
        ~CStack();
        int push(T *v);
        int pop(T *v);
        int get_anzahl();
        int isempty();
    };
</code></pre>
<p>und dann in der main:</p>
<pre><code>int main()
    {
    CStack&lt;punkt&gt;* cstck = new CStack&lt;punkt&gt;;
    punkt *p = new punkt;
    cout &lt;&lt; sizeof(punkt);
    cout &lt;&lt; &quot;Put: &quot; &lt;&lt; endl;
    for(p-&gt;i = 0; p-&gt;i &lt; 10000000; p-&gt;i++)
        {
        cstck-&gt;push(p);
        cout &lt;&lt; p-&gt;i &lt;&lt; &quot; &quot;;
        }
    cout &lt;&lt; endl &lt;&lt; &quot;Get: &quot; &lt;&lt; endl;
    while(cstck-&gt;pop(p))
        cout &lt;&lt; p-&gt;i &lt;&lt; &quot; &quot;;
    delete(p);
    delete cstck;
    cin &gt;&gt; p-&gt;i;
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1542986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1542986</guid><dc:creator><![CDATA[uhsuhz]]></dc:creator><pubDate>Mon, 07 Jul 2008 19:35:56 GMT</pubDate></item><item><title><![CDATA[Reply to Stack mit Klassen füllen on Mon, 07 Jul 2008 23:32:09 GMT]]></title><description><![CDATA[<p>Vielleicht für Dich zum Vergleich interessant:<br />
<a href="http://www.henkessoft.de/C++/C++%20Fortgeschrittene/C++_Fortgeschrittene.htm#2.6._Template-Stack-Klasse" rel="nofollow">http://www.henkessoft.de/C++/C++ Fortgeschrittene/C++_Fortgeschrittene.htm#2.6._Template-Stack-Klasse</a><br />
auch Kap. 2.7</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1543056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1543056</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Mon, 07 Jul 2008 23:32:09 GMT</pubDate></item><item><title><![CDATA[Reply to Stack mit Klassen füllen on Tue, 08 Jul 2008 13:54:43 GMT]]></title><description><![CDATA[<p>Danke für den link, nur funktionniert der auch mit arrays, würde mal gerne einen sehen der mit verweisen funktionniert.</p>
<p>Danke aber trotzdem <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1543490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1543490</guid><dc:creator><![CDATA[uhsuhz]]></dc:creator><pubDate>Tue, 08 Jul 2008 13:54:43 GMT</pubDate></item></channel></rss>