<?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[Heap nutzen ja&#x2F;nein? -GELÖST-]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

class Spieler
{...};

int main()
{
    //Objekt erzeugen
    Spieler a;
    ...
}
</code></pre>
<p>In welchem Speicherbereich wird eigentlich das Objekt &quot;a&quot; angelegt?<br />
Man könnte das Objekt ja auch im Heap speichern, wäre das besser?<br />
Also z.B.</p>
<pre><code class="language-cpp">Spieler *a=new Spieler;
...
delete a; //Speicherbereich wieder freigeben
a=0; //Zeiger auf Null setzen
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/292192/heap-nutzen-ja-nein-gelöst</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 03:54:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/292192.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 04 Sep 2011 21:00:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Heap nutzen ja&#x2F;nein? -GELÖST- on Mon, 05 Sep 2011 20:39:47 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

class Spieler
{...};

int main()
{
    //Objekt erzeugen
    Spieler a;
    ...
}
</code></pre>
<p>In welchem Speicherbereich wird eigentlich das Objekt &quot;a&quot; angelegt?<br />
Man könnte das Objekt ja auch im Heap speichern, wäre das besser?<br />
Also z.B.</p>
<pre><code class="language-cpp">Spieler *a=new Spieler;
...
delete a; //Speicherbereich wieder freigeben
a=0; //Zeiger auf Null setzen
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2114933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2114933</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Mon, 05 Sep 2011 20:39:47 GMT</pubDate></item><item><title><![CDATA[Reply to Heap nutzen ja&#x2F;nein? -GELÖST- on Sun, 04 Sep 2011 21:06:29 GMT]]></title><description><![CDATA[<ol>
<li>Nein, es würde nichts bringen.</li>
<li>Es würde auch nichts bringen, den Zeiger auf 0 zu setzen, lass das bleiben, ohne einen guten Grund zu haben.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2114940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2114940</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sun, 04 Sep 2011 21:06:29 GMT</pubDate></item><item><title><![CDATA[Reply to Heap nutzen ja&#x2F;nein? -GELÖST- on Sun, 04 Sep 2011 21:19:39 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<ol start="2">
<li>Es würde auch nichts bringen, den Zeiger auf 0 zu setzen, lass das bleiben, ohne einen guten Grund zu haben.</li>
</ol>
</blockquote>
<p>Ok, dachte daß das sinnvoll ist, um zu verhindern, daß z.B. ein erneutes &quot;delete&quot; auf die gleiche Adresse aufgerufen wird.<br />
Kann es ausserdem nicht zu Fehlern im Programm kommen, wenn der Zeiger irgendwohin<br />
zeigt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2114952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2114952</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Sun, 04 Sep 2011 21:19:39 GMT</pubDate></item><item><title><![CDATA[Reply to Heap nutzen ja&#x2F;nein? -GELÖST- on Sun, 04 Sep 2011 21:19:27 GMT]]></title><description><![CDATA[<p>redrew99 schrieb:</p>
<blockquote>
<p>Ok, dachte das sinnvoll ist, um zu verhindern, daß z.B. ein erneutes &quot;delete&quot; auf die gleiche Adresse aufgerufen wird.<br />
Kann es ausserdem nicht zu Fehlern im Programm kommen, wenn der Zeiger irgendwohin<br />
zeigt?</p>
</blockquote>
<p>Nein, nicht solange du nicht auf die Idee kommst irgendetwas komisches mit ihm zu machen. Der Zeiger selbst interessiert sich nicht für seinen Wert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2114953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2114953</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 04 Sep 2011 21:19:27 GMT</pubDate></item><item><title><![CDATA[Reply to Heap nutzen ja&#x2F;nein? -GELÖST- on Sun, 04 Sep 2011 21:57:54 GMT]]></title><description><![CDATA[<p>Generell würde ich wenn möglich den stack verwenden, nur wenn du sehr viel oder dynamisch Speicher brauchst solltest du den heap verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2114970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2114970</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Sun, 04 Sep 2011 21:57:54 GMT</pubDate></item><item><title><![CDATA[Reply to Heap nutzen ja&#x2F;nein? -GELÖST- on Mon, 05 Sep 2011 05:56:40 GMT]]></title><description><![CDATA[<p>redrew99 schrieb:</p>
<blockquote>
<p>In welchem Speicherbereich wird eigentlich das Objekt &quot;a&quot; angelegt?</p>
</blockquote>
<p>Im automatischen Speicher. Man sagt dazu auch manchmal &quot;Stack&quot; weil der automatische Speicher meistens durch einen Stack implementiert wird.</p>
<p>In C++ gibt es drei Speicherbereiche:<br />
- automatisch<br />
- statisch<br />
- Freispeicher (&quot;Heap&quot;)</p>
<p>Wo Du ein Objekt ablegst, hat auch Implikationen bezüglich der Lebenszeit des Objekts. Bitte nochmal im schlauen Buch dazu nachschlagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115008</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 05 Sep 2011 05:56:40 GMT</pubDate></item><item><title><![CDATA[Reply to Heap nutzen ja&#x2F;nein? -GELÖST- on Mon, 05 Sep 2011 09:11:19 GMT]]></title><description><![CDATA[<p>ich hab zu dem Thema auch eine Frage:<br />
angenommen ich möchte einen &quot;Baum&quot; aufbauen und habe solche Klassen:</p>
<pre><code class="language-cpp">class Node
{
private:
	std::string name;
	...

public:
	static Node CreateNode(const std::string &amp;name)
	{
		Node node;
		node.name = name;
		return node;
	}
};

class Tree
{
private:
	std::list&lt;Node&gt; nodeList;
	...

	void func()
	{
		nodeList.push_back(Node::CreateNode(&quot;node&quot;));
		...
	}
}
</code></pre>
<p>Belaste ich damit den Heap oder den Stack? CreateNode gibt eine auf dem Stack erzeugte Variable zurück, die in der nodeList gespeichert wird. std::list benutzt aber den Heap(?) zur Verwaltung der Elemente oder? Wird Node dann im großen Heap verwaltet oder bleibt die Variable im kleinen Stack?</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115074</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Mon, 05 Sep 2011 09:11:19 GMT</pubDate></item><item><title><![CDATA[Reply to Heap nutzen ja&#x2F;nein? -GELÖST- on Mon, 05 Sep 2011 09:21:02 GMT]]></title><description><![CDATA[<p>list kopiert das Ding für sich. Das, was createNode zurückgibt ist ein temporäres Objekt, was anschließend zerstört wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115080</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 05 Sep 2011 09:21:02 GMT</pubDate></item><item><title><![CDATA[Reply to Heap nutzen ja&#x2F;nein? -GELÖST- on Mon, 05 Sep 2011 09:22:42 GMT]]></title><description><![CDATA[<p>Auf dem Heap, aber wie wär's mit nem Konstruktor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115082</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 05 Sep 2011 09:22:42 GMT</pubDate></item><item><title><![CDATA[Reply to Heap nutzen ja&#x2F;nein? -GELÖST- on Mon, 05 Sep 2011 09:32:39 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<ol start="2">
<li>Es würde auch nichts bringen, den Zeiger auf 0 zu setzen, lass das bleiben, ohne einen guten Grund zu haben.</li>
</ol>
</blockquote>
<p>Quatsch, wieso das denn? Es ist doch sogar sehr oft üblich, Zeiger auf 0 zu prüfen, bevor darauf zugegriffen wird. Da wäre es fatal, wenn noch eine ehemals gültige Adresse drinstehen würde. Sobald es möglich ist, dass eine Zeigervariable nach dem delete noch mal abgefragt wird, sollte man unbedingt 0 zuweisen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115086</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Mon, 05 Sep 2011 09:32:39 GMT</pubDate></item><item><title><![CDATA[Reply to Heap nutzen ja&#x2F;nein? -GELÖST- on Mon, 05 Sep 2011 09:39:41 GMT]]></title><description><![CDATA[<p>_matze schrieb:</p>
<blockquote>
<p>314159265358979 schrieb:</p>
<blockquote>
<ol start="2">
<li>Es würde auch nichts bringen, den Zeiger auf 0 zu setzen, lass das bleiben, ohne einen guten Grund zu haben.</li>
</ol>
</blockquote>
<p>Quatsch, wieso das denn? Es ist doch sogar sehr oft üblich, Zeiger auf 0 zu prüfen, bevor darauf zugegriffen wird. Da wäre es fatal, wenn noch eine ehemals gültige Adresse drinstehen würde. Sobald es möglich ist, dass eine Zeigervariable nach dem delete noch mal abgefragt wird, sollte man unbedingt 0 zuweisen.</p>
</blockquote>
<p>Nö, 0 erzeugt pseudo-definiertes Verhalten.<br />
Ein double-delete kracht immer und man kann schnell den Fehler finden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115090</guid><dc:creator><![CDATA[Ethon_notloggedin]]></dc:creator><pubDate>Mon, 05 Sep 2011 09:39:41 GMT</pubDate></item><item><title><![CDATA[Reply to Heap nutzen ja&#x2F;nein? -GELÖST- on Mon, 05 Sep 2011 09:54:11 GMT]]></title><description><![CDATA[<p>Ethon_notloggedin schrieb:</p>
<blockquote>
<p>_matze schrieb:</p>
<blockquote>
<p>314159265358979 schrieb:</p>
<blockquote>
<ol start="2">
<li>Es würde auch nichts bringen, den Zeiger auf 0 zu setzen, lass das bleiben, ohne einen guten Grund zu haben.</li>
</ol>
</blockquote>
<p>Quatsch, wieso das denn? Es ist doch sogar sehr oft üblich, Zeiger auf 0 zu prüfen, bevor darauf zugegriffen wird. Da wäre es fatal, wenn noch eine ehemals gültige Adresse drinstehen würde. Sobald es möglich ist, dass eine Zeigervariable nach dem delete noch mal abgefragt wird, sollte man unbedingt 0 zuweisen.</p>
</blockquote>
<p>Nö, 0 erzeugt pseudo-definiertes Verhalten.<br />
Ein double-delete kracht immer und man kann schnell den Fehler finden.</p>
</blockquote>
<p>Und wenn der Zeiger aber wirklich in einer Programmausführung nicht verwendet wurde, einfach weil er nicht gebraucht wurde? Soll's dann krachen, obwohl im Grunde nichts schiefgegangen ist? Nö.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115101</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Mon, 05 Sep 2011 09:54:11 GMT</pubDate></item><item><title><![CDATA[Reply to Heap nutzen ja&#x2F;nein? -GELÖST- on Mon, 05 Sep 2011 09:57:59 GMT]]></title><description><![CDATA[<p>_matze schrieb:</p>
<blockquote>
<p>Und wenn der Zeiger aber wirklich in einer Programmausführung nicht verwendet wurde, einfach weil er nicht gebraucht wurde? Soll's dann krachen, obwohl im Grunde nichts schiefgegangen ist? Nö.</p>
</blockquote>
<p>Wenn er nicht verwendet wurde, kracht es auch nicht. <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/2115102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115102</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 05 Sep 2011 09:57:59 GMT</pubDate></item><item><title><![CDATA[Reply to Heap nutzen ja&#x2F;nein? -GELÖST- on Mon, 05 Sep 2011 10:39:48 GMT]]></title><description><![CDATA[<p>_matze schrieb:</p>
<blockquote>
<p>Und wenn der Zeiger aber wirklich in einer Programmausführung nicht verwendet wurde, einfach weil er nicht gebraucht wurde? Soll's dann krachen, obwohl im Grunde nichts schiefgegangen ist? Nö.</p>
</blockquote>
<p>Wenn du Lesend, Schreibend oder Löschend auf einen Zeiger zugreifst den du vorher gelöscht hast, dann ist etwas gründlich schiefgelaufen und es ist angebracht, es ordentlich krachen zu lassen, anstatt den Fehler zu vertuschen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115123</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 05 Sep 2011 10:39:48 GMT</pubDate></item><item><title><![CDATA[Reply to Heap nutzen ja&#x2F;nein? -GELÖST- on Mon, 05 Sep 2011 11:33:23 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>_matze schrieb:</p>
<blockquote>
<p>Und wenn der Zeiger aber wirklich in einer Programmausführung nicht verwendet wurde, einfach weil er nicht gebraucht wurde? Soll's dann krachen, obwohl im Grunde nichts schiefgegangen ist? Nö.</p>
</blockquote>
<p>Wenn er nicht verwendet wurde, kracht es auch nicht. <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>Wieso sollte es? Wenn vor dem eigentlichen Zugriff auf 0 geprüft wird, kracht natürlich gar nix. Die 0 signalisiert doch schließlich (wenn man es so vereinbart hat), dass der betreffende Programmteil, der auf diesen Zeiger aufbaut, momentan nicht eingesetzt wird. Bei uns könnte sowas z.B. bedeuten, dass eine bestimmte Bilderfassungsquelle nicht verfügbar ist. Daher wurde kein passendes Handle erzeugt und dem Zeiger im struct keine Adresse auf ein gültiges Handle verpasst. Das ist dann auch völlig in Ordnung und hat überhaupt nix mit Fehler Vertuschen zu tun. Es ist <em>kein</em> Programmfehler.</p>
<p>Man kann jetzt darüber streiten, ob man sowas designtechnisch auch anders lösen kann. Kann man natürlich. Man könnte sich irgendwelche Schalter basteln, die einem signalisieren, dass man auf Zeiger xy nicht zugreifen darf (bool, bitflags, wasauchimmer). Oder man akzeptiert, dass eine 0 denselben Zweck erfüllen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115163</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Mon, 05 Sep 2011 11:33:23 GMT</pubDate></item><item><title><![CDATA[Reply to Heap nutzen ja&#x2F;nein? -GELÖST- on Mon, 05 Sep 2011 11:36:02 GMT]]></title><description><![CDATA[<p>_matze schrieb:</p>
<blockquote>
<p>Wieso sollte es? Wenn vor dem eigentlichen Zugriff auf 0 geprüft wird, kracht natürlich gar nix. Die 0 signalisiert doch schließlich (wenn man es so vereinbart hat), dass der betreffende Programmteil, der auf diesen Zeiger aufbaut, momentan nicht eingesetzt wird. Bei uns könnte sowas z.B. bedeuten, dass eine bestimmte Bilderfassungsquelle nicht verfügbar ist. Daher wurde kein passendes Handle erzeugt und dem Zeiger im struct keine Adresse auf ein gültiges Handle verpasst. Das ist dann auch völlig in Ordnung und hat überhaupt nix mit Fehler Vertuschen zu tun. Es ist <em>kein</em> Programmfehler.</p>
<p>Man kann jetzt darüber streiten, ob man sowas designtechnisch auch anders lösen kann. Kann man natürlich. Man könnte sich irgendwelche Schalter basteln, die einem signalisieren, dass man auf Zeiger xy nicht zugreifen darf (bool, bitflags, wasauchimmer). Oder man akzeptiert, dass eine 0 denselben Zweck erfüllen kann.</p>
</blockquote>
<p>Das ist ein völlig anderer Anwendungsfall. Wenn durch die 0 tatsächlich etwas signalisiert wird, dann ist das sogar sehr sinnvoll und das Mittel der Wahl. Aber ein pauschales Nullsetzen wie das woran sich hier die Diskussion entzündet hat, ist meistens Unsinn und wird von Leuten verbreitet, die mal diese sinnvollen Fälle gesehen, aber nicht verstanden haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115169</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 05 Sep 2011 11:36:02 GMT</pubDate></item><item><title><![CDATA[Reply to Heap nutzen ja&#x2F;nein? -GELÖST- on Mon, 05 Sep 2011 11:40:12 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Aber ein pauschales Nullsetzen wie das woran sich hier die Diskussion entzündet hat, ist meistens Unsinn und wird von Leuten verbreitet, die mal diese sinnvollen Fälle gesehen, aber nicht verstanden haben.</p>
</blockquote>
<p>Na ja, ich habe mich eigentlich nur gegen das pauschale Nicht-Null-Setzen gewehrt. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2115176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115176</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Mon, 05 Sep 2011 11:40:12 GMT</pubDate></item></channel></rss>