<?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&#x2F;heap]]></title><description><![CDATA[<p>hi leute,</p>
<p>also wenn ich das richtig verstanden habe wird das meiste auf<br />
den stack gepackt, was denk ich mal der cpu cache is,<br />
und heap grob der ram.</p>
<p>gibts so ne grundregel was man lieber auf den stack packt und<br />
was auf den heap?</p>
<p>hab ehrlich gesagt mit new,delete, malloc und was es da gibt noch nicht<br />
gearbeitet, aber denke das es wohl wichtig wird sich damit zu beschäftigen.</p>
<p>danke schonmal im voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/155789/stack-heap</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 16:30:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/155789.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 09 Aug 2006 14:27:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to stack&#x2F;heap on Wed, 09 Aug 2006 14:27:40 GMT]]></title><description><![CDATA[<p>hi leute,</p>
<p>also wenn ich das richtig verstanden habe wird das meiste auf<br />
den stack gepackt, was denk ich mal der cpu cache is,<br />
und heap grob der ram.</p>
<p>gibts so ne grundregel was man lieber auf den stack packt und<br />
was auf den heap?</p>
<p>hab ehrlich gesagt mit new,delete, malloc und was es da gibt noch nicht<br />
gearbeitet, aber denke das es wohl wichtig wird sich damit zu beschäftigen.</p>
<p>danke schonmal im voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1113851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1113851</guid><dc:creator><![CDATA[adonis]]></dc:creator><pubDate>Wed, 09 Aug 2006 14:27:40 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Wed, 09 Aug 2006 14:47:01 GMT]]></title><description><![CDATA[<p>adonis schrieb:</p>
<blockquote>
<p>hi leute,</p>
<p>also wenn ich das richtig verstanden habe wird das meiste auf<br />
den stack gepackt, was denk ich mal der cpu cache is,<br />
und heap grob der ram.</p>
<p>gibts so ne grundregel was man lieber auf den stack packt und<br />
was auf den heap?</p>
<p>hab ehrlich gesagt mit new,delete, malloc und was es da gibt noch nicht<br />
gearbeitet, aber denke das es wohl wichtig wird sich damit zu beschäftigen.</p>
<p>danke schonmal im voraus</p>
</blockquote>
<p>Sowohl stack als auch heap befinden sich im arbeitsspeicher.</p>
<p>Der stack wird als Notizblock der cpu bezeichnet.</p>
<p>Der stack, der einem programm zugewiesen wird ist sehr kanpp (1 mb ???), deswegen sollte man, vor allem bei großen datenmengen den heap benutzen.</p>
<p>malloc() (C) und new (C++) kann man für dynamische speicherverwaltung nutzen.</p>
<p>Wenn du zB einen C array anlegst, so muss die arraygröße konstant sein:</p>
<pre><code class="language-cpp">int array[14]; /* das geht */
int array_size = 14;
int array2[array_size]; /* das geht nicht = error*/

int* parray = malloc(array_size*sizeof(int)); /* geht */
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1113864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1113864</guid><dc:creator><![CDATA[SDFDSFSD]]></dc:creator><pubDate>Wed, 09 Aug 2006 14:47:01 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Wed, 09 Aug 2006 15:03:26 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Wichtig? Komm erstmal in die Datenbankerstellung <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>
<p>MFG winexec*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1113877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1113877</guid><dc:creator><![CDATA[winexec*]]></dc:creator><pubDate>Wed, 09 Aug 2006 15:03:26 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Wed, 09 Aug 2006 16:11:40 GMT]]></title><description><![CDATA[<p>Der Stack funktioniert eben nach einfachem Stapel-Prinzip. Wenn man Daten speichern will, dann legt man es einfach oben drauf. Wenn die Daten ungültig werden, hebt man sie einfach von oben ab. Der Stack ist nicht sonderlich groß (die größe ist vom Betriebssystem und diversen Einstellungen abhängig)</p>
<p>Der Heap dagegen arbeitet mit komplizierten Algorithmen und Tabellen, um die Speicheranforderungen sinnvoll zu verteilen. Dafür kann man aber Speicher jederzeit freigeben. Der Heap ist für große und langlebige Daten gedacht, während der Stack für lokale Variablen und ähnliches genutzt wird (weil hier das drauflegen/abheben am leichtesten funktioniert).</p>
<p>Normale Variablen werden auf dem Stack angelegt. Mit new bzw. new[] kannst du Speicher auf dem Heap anfordern (den du aber mittels delete bzw. delete[] manuell freigeben musst!). (In C++ lohnt sich aber für die Speicherverwaltung Smart-Pointer einzusetzen.)</p>
<pre><code class="language-cpp">void foo() {
  int a = 0; // variable auf dem Stack
} // hier wird die Variable automatisch &quot;zerstört&quot;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1113921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1113921</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Wed, 09 Aug 2006 16:11:40 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Wed, 09 Aug 2006 17:06:43 GMT]]></title><description><![CDATA[<p>stapelprinzip sagt mir noch was LIFO last in, first out.<br />
push ax<br />
push bx</p>
<p>pop bx<br />
pop ax<br />
.......</p>
<p>wie ist das eigendlich wenn man den speicher nicht wieder freigibt?<br />
bleibt der speicher weiterhin reserviert, auch wenn man das programm<br />
beendet? oder nur innerhalb der laufzeit des programms?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1113972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1113972</guid><dc:creator><![CDATA[adonis]]></dc:creator><pubDate>Wed, 09 Aug 2006 17:06:43 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Wed, 09 Aug 2006 17:20:04 GMT]]></title><description><![CDATA[<p>Moderne Betriebssysteme räumen sämtlichen, von deinem Programm verwendeten speicher auf. Es ist jedoch good practice, selbst aufzuräumen.</p>
<p>Greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1113983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1113983</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Wed, 09 Aug 2006 17:20:04 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Wed, 09 Aug 2006 18:18:11 GMT]]></title><description><![CDATA[<p>Das Problem mit der Speicherfreigabe besteht, bei langlaufender Software (wie zB Servern).</p>
<p>Die meisten GUI und Serverprogramme dürften ja ungefähr so aussehen</p>
<pre><code class="language-cpp">init();
while(event()) {
  handle_event();
}
deinit();
</code></pre>
<p>Wenn du nun nicht sauber deine Resourcen freigibst und bei handle_event zB jedes mal 100 byte Speicher nicht freigibt, kannst du dir ja ausrechnen wie viele events dein Programm verarbeiten kann, bis der Speicher vollgelaufen ist und irgend wann der Rechner lahm liegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1114023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1114023</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Wed, 09 Aug 2006 18:18:11 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Wed, 09 Aug 2006 18:36:16 GMT]]></title><description><![CDATA[<p>ahh noch eine frage,</p>
<p>also wenn ich ein object mit new erstelle, werden dann<br />
die ganzen variablen des objects auf den heap gepackt?</p>
<p>zumindest würde ich mir das so vorstellen, da ich sonst kein<br />
sinn sähe ein object mit new zu erstellen.<br />
oder sehe ich da was falsch?</p>
<p>fragen über fragen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1114037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1114037</guid><dc:creator><![CDATA[adonis]]></dc:creator><pubDate>Wed, 09 Aug 2006 18:36:16 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Wed, 09 Aug 2006 19:06:25 GMT]]></title><description><![CDATA[<p>also wenn ich das richtig verstanden habe, müsste alles<br />
so in der art aussehen?</p>
<pre><code class="language-cpp">include &lt;iostream&gt;
#include &lt;cstring&gt;

#include &quot;datenbank.h&quot;

void progstart();
void optionen();
using namespace std;

void main(void)
{
	DatenBank* myBank = new DatenBank;
	progstart();
	optionen();
	delete myBank;
}

void progstart()
{
	cout&lt;&lt;&quot;*******************************************&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;* Programm zur Erstellung einer Datenbank.*&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;* vers. 1.0                               *&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;*                                         *&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;*******************************************&quot;&lt;&lt;endl;
	cout&lt;&lt;endl&lt;&lt;endl;
}

void optionen()
{
	int* auswahl = new int;
	char* temp = new char;
	cout&lt;&lt;&quot;--------------------------&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;1. Neues Projekt erstellen&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;2. Altes Projekt laden    &quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;--------------------------&quot;&lt;&lt;endl;
	cin&gt;&gt;*auswahl;

	switch(*auswahl)
	{
	case 1:
		cout&lt;&lt;&quot;Neues Projekt&quot;&lt;&lt;endl;
		cin&gt;&gt;*temp;
		break;
	case 2:
		cout&lt;&lt;&quot;Altes Projekt&quot;&lt;&lt;endl;
		cin&gt;&gt;*temp;
		break;
		delete auswahl;
		delete temp;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1114056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1114056</guid><dc:creator><![CDATA[adonis]]></dc:creator><pubDate>Wed, 09 Aug 2006 19:06:25 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Thu, 10 Aug 2006 08:22:27 GMT]]></title><description><![CDATA[<p>Nein, in deinem Fall hast du ja in optionen() eine Speicherlücke, wenn der Benutzer 1 wählt.</p>
<p>Außerdem sollte dir bewusst sein, dass du mit</p>
<pre><code class="language-cpp">char *temp=new char;
</code></pre>
<p>exakt Speicher für ein char anlegst.</p>
<p>Generell macht es aber in deinem Programm wenig Sinn Speicher auf dem Heap zu erzeugen. Besonders für einzelne Variablen vom Typ int oä. <a href="http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&amp;faq=main#Answ" rel="nofollow">Außerdem ist void main falsch!</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1114309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1114309</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Thu, 10 Aug 2006 08:22:27 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Thu, 10 Aug 2006 08:23:12 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile.php?mode=viewprofile&amp;u=1819" rel="nofollow">kingruedi</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=8" rel="nofollow">Rund um die Programmierung</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=15" rel="nofollow">C++</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1114310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1114310</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Thu, 10 Aug 2006 08:23:12 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Thu, 10 Aug 2006 09:51:10 GMT]]></title><description><![CDATA[<p>ok, also kleine variablen, die keinen grösseren sinn haben,<br />
wie variablen für switch/case oä, nicht mit new.<br />
nur welche wo grosse datenmengen wie zb nen int array 640*480<br />
wo ich nen ganzes bild unterbringen könnte.</p>
<p>delete aus der option funktion, hab ich mal aus switch case rausgenommen.<br />
und hinter &quot;}&quot; gesetzt.</p>
<p>optionen() speicherlücke, leuchtet mir noch nicht ganz ein.<br />
(*noch nen schluck kaffe nimmt und hofft, dass es hilft*)</p>
<p>danke hab mir mal den link zu void main in die favs gepackt, hatte das nie<br />
verstanden,hatte es so aus nem buch gelernt, hab 2 grundlagenbücher, da steht auch immer void main.</p>
<p>edit:</p>
<p>aja und void main() hab ich natürlich geändert:)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1114388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1114388</guid><dc:creator><![CDATA[adonis]]></dc:creator><pubDate>Thu, 10 Aug 2006 09:51:10 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Thu, 10 Aug 2006 10:27:07 GMT]]></title><description><![CDATA[<p>adonis schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void optionen()
{
    int* auswahl = new int;
    char* temp = new char;
    cout&lt;&lt;&quot;--------------------------&quot;&lt;&lt;endl;
    cout&lt;&lt;&quot;1. Neues Projekt erstellen&quot;&lt;&lt;endl;
    cout&lt;&lt;&quot;2. Altes Projekt laden    &quot;&lt;&lt;endl;
    cout&lt;&lt;&quot;--------------------------&quot;&lt;&lt;endl;
    cin&gt;&gt;*auswahl;

    switch(*auswahl)
    {
    case 1:
        cout&lt;&lt;&quot;Neues Projekt&quot;&lt;&lt;endl;
        cin&gt;&gt;*temp;
        break;
    case 2:
        cout&lt;&lt;&quot;Altes Projekt&quot;&lt;&lt;endl;
        cin&gt;&gt;*temp;
        break;
        delete auswahl;
        delete temp;
    }
}
</code></pre>
</blockquote>
<p>Variablen mit kurzer Lebensdauer werden i.d.R. auf dem Stack abgelegt. Du würdest doch nicht</p>
<pre><code class="language-cpp">for( int *i = new int( 1 ); *i &lt;= 10; ++(*i) )
    cout &lt;&lt; *i &lt;&lt; endl;
delete i;
</code></pre>
<p>schreiben, oder?</p>
<p>Beachte, dass eine Reservierung von Speicher auf dem Heap im allgemeinen langsamer ist, als ein einfaches PUSH auf dem Stack.</p>
<p>Greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1114424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1114424</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Thu, 10 Aug 2006 10:27:07 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Thu, 10 Aug 2006 11:02:19 GMT]]></title><description><![CDATA[<p>ok, noch eine frage:)</p>
<p>geh ich recht in der annahme dass für jedes programm ein stack<br />
angelegt wird?</p>
<p>ich mein jedes programm hat variablen die auf den stack gelegt werden.<br />
bei einer bestimten anzahl von laufenden programmen, würde ein<br />
einzelner stack ja vollaufen.</p>
<p>oder gibt es einen fest reservierten bereich von einer bestimmeten<br />
grösse, was der gesamt stack ist, wo jedes programm einen teil zugewiesen bekommt worin er arbeiten kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1114448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1114448</guid><dc:creator><![CDATA[adonis]]></dc:creator><pubDate>Thu, 10 Aug 2006 11:02:19 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Thu, 10 Aug 2006 11:08:57 GMT]]></title><description><![CDATA[<p>Jedes Programm (eigentlich jeder Thread) bekommt seinen eigenen Stack.</p>
<p>Greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1114455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1114455</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Thu, 10 Aug 2006 11:08:57 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Thu, 10 Aug 2006 11:21:23 GMT]]></title><description><![CDATA[<p>Gründe den Stack dem Heap vorzuziehen:</p>
<p>1. Die Destruktion wird automatisch vorgenommen<br />
2. Automatischer Destruktoraufruf beim stack-unwinding von try-catch<br />
3. Es kann kein delete vergessen werden -&gt; keine Speicherlöcher<br />
4. Es kann nicht fälschlicherweise delete statt delete[] nach &quot;new char[]&quot;<br />
verwendet werden, keine Speicherlöcher durch vergessene Klammern []<br />
(ohne [] löscht delete nur die erste Speicherstelle des char[]-Arrays)<br />
5. &quot;string&quot; hat im Gegensatz zu &quot;new char[]&quot; eine vollkommen dynamische Länge<br />
6. Stack-Variablen können vom Compiler optimaler genutzt werden (Addressierung mittels ebp)<br />
7. Heap-Management sollte man generell immer der STL überlassen</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1114466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1114466</guid><dc:creator><![CDATA[Helmut S.]]></dc:creator><pubDate>Thu, 10 Aug 2006 11:21:23 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Thu, 10 Aug 2006 11:51:58 GMT]]></title><description><![CDATA[<p>ok, wenn ich das jetzt also richtig verstanden habe.<br />
der stack wird nur anders verwaltet, als der heap.<br />
der ganze ram könnte auch ein kompletter stack sein, wenn man ihn<br />
so definiert.</p>
<p>was wo als stack definiert wird regelt das betriebssystem.<br />
für jedes programm wir ein bereich im ram als stack definiert.</p>
<p>wie ich stack und heap nutze muss ich selber entscheiden.</p>
<p>heap-management und stl werd ich mal nachschlagen.</p>
<p>so, hoffe das ich das jetzt alles soweit richtig verstanden habe:)</p>
<p>aber muss zugeben ziehmlich interessantes thema</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1114494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1114494</guid><dc:creator><![CDATA[adonis]]></dc:creator><pubDate>Thu, 10 Aug 2006 11:51:58 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Thu, 10 Aug 2006 12:02:17 GMT]]></title><description><![CDATA[<p>adonis schrieb:</p>
<blockquote>
<p>.</p>
<p>was wo als stack definiert wird regelt das betriebssystem.</p>
</blockquote>
<p>Stackgrösse ist Linker-Option /STACK:reserve[,commit]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1114499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1114499</guid><dc:creator><![CDATA[Helmut S.]]></dc:creator><pubDate>Thu, 10 Aug 2006 12:02:17 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Thu, 10 Aug 2006 12:42:55 GMT]]></title><description><![CDATA[<p>könnte man ein programm schreiben wo der stack<br />
erst während der laufzeit vollläuft? würde gern mal sehen was<br />
dann passiert:)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1114554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1114554</guid><dc:creator><![CDATA[adonis]]></dc:creator><pubDate>Thu, 10 Aug 2006 12:42:55 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Thu, 10 Aug 2006 13:03:51 GMT]]></title><description><![CDATA[<p>adonis schrieb:</p>
<blockquote>
<p>könnte man ein programm schreiben wo der stack<br />
erst während der laufzeit vollläuft?</p>
</blockquote>
<p>Während der Compilezeit kann der Stack des Programms nicht vollaufen <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>
<pre><code class="language-cpp">void murks()
{
    int ary[1000];
    murks();
}

int main()
{
    murks();
}
</code></pre>
<p>Der Array wäre nichtmal nötig, allerdings geht's dann schneller <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1114586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1114586</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 10 Aug 2006 13:03:51 GMT</pubDate></item><item><title><![CDATA[Reply to stack&#x2F;heap on Thu, 10 Aug 2006 13:55:11 GMT]]></title><description><![CDATA[<p>adonis schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">...
void main(void)
{
	DatenBank* myBank = new DatenBank;
	progstart();
	optionen();
	delete myBank;
}
...
</code></pre>
</blockquote>
<p>Hi,</p>
<p>ein Hinweis noch: Wenn progstart(), optionen() oder irgendeine davon implizit aufgerufene Funktion (und sei sie noch so weit unten im System) eine exception wirft, wird delete nicht mehr aufgerufen. Dagegen hilft nur entweder &quot;exceptionhandling mit try/catch&quot; oder &quot;scoping mit einem Stackobject&quot; (auto_ptr o.ä.).<br />
Ich habe mir letzteres angewöhnt:</p>
<pre><code class="language-cpp">template &lt;typename PType&gt;
class AutoDelete {
public:
// Construction / Destruction
	AutoDelete(PType _p) : p(_p) {}
	~AutoDelete() { if(NULL != p) delete p;	}			
private:
// Attributes
	PType p;
// not to be implemented
	AutoDelete(AutoDelete const &amp;);
	AutoDelete const &amp; operator=(AutoDelete const &amp;);
...
};

int main(int argc, char* argv[]) {
      DatenBank* myBank = new DatenBank;
      AutoDelete&lt;DatenBank*&gt; myBankScope(myBank); // kann man ab hier vergessen
      progstart();
      optionen();
      return 0;
}
</code></pre>
<p>muss aber jeder selbst wissen, ob einem das sowas wert ist und man mit den Einschränkungen (Kopierverbot) und Risiken (man kann natürlich myBank auch manuell löschen und AutoDelete dann auf den Hammer laufen lassen) leben kann/mag.<br />
(kann man mit zu schließenden Files etc. ebenso machen)</p>
<p>Dein Beispiel ist allerdings etwas besonders:<br />
- Da das DatenBank-Objekt während der gesamten Programmlaufzeit existiert, würde das Betriebssystem den Speicher auch bei &quot;vergessenem delete&quot; höchstwahrscheinlich bei Programmende automatisch freigeben, aber<br />
- da &quot;DatenBank&quot; sehr komplex klingt, wird vermutlich beim &quot;fachlichen Abräumen im Destruktor&quot; noch einiges zu tun sein, was das Betriebssystem natürlich nicht übernehmen kann....</p>
<p>Ich persönlich bin &quot;Stackfan&quot;, weil es die Programme besser zu strukturieren &quot;motiviert&quot;, die Dinge automatisiert, die letztlich nur lästige/fehleranfällige Tipparbeit sind und letztlich (IMHO) wartbarere und übersichtlichere Programme erzeugt.<br />
... und an Speichergrenzen bin ich bislang noch nie gekommen - allerdings laufen unsere Programme auch auch &quot;xGB-RAM-Kisten&quot;, bei denen es nicht so eine Rolle spielt und die wirklichen Datenmengen liegen im DB2 - Ausnahme: Speicherfresser durch &quot;Heap-Programmierung&quot;. :p <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>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1114634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1114634</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 10 Aug 2006 13:55:11 GMT</pubDate></item></channel></rss>