<?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[WinMain LifeCycle]]></title><description><![CDATA[<p>Tach!</p>
<p>Ich wundere mich ein wenig über den Aufruf eines Destruktors und wollt fragen, ob das an WinMain liegt:<br />
WinMain instanziiert eine Klasse Applikation und ruft dort nacheinander init() und mainLoop() auf.<br />
In init() werden weitere Objekte instanziiert, direkt oder durch andere Klassen. Darunter auch ein Liste, die mit new() instanziiert wurde, ebenso deren Elemente.<br />
In dem Moment, wo init() abgearbeitet ist, wird nun der Destruktor aufgerufen, warum passiert das? Ist das, weil man wieder in WinMain landet? Dadurch funktioniert mainLoop() natürlich nicht mehr. Ich dacht 'new-Speicher' müßte ich selbst abräumen.<br />
(Fällt mir gerade ein:) Muß ich meine Instanz von 'Applikation' in WinMain() evtl. auch mit new() erzeugen?!</p>
<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/topic/182354/winmain-lifecycle</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 17:02:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/182354.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 24 May 2007 06:39:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to WinMain LifeCycle on Thu, 24 May 2007 06:39:01 GMT]]></title><description><![CDATA[<p>Tach!</p>
<p>Ich wundere mich ein wenig über den Aufruf eines Destruktors und wollt fragen, ob das an WinMain liegt:<br />
WinMain instanziiert eine Klasse Applikation und ruft dort nacheinander init() und mainLoop() auf.<br />
In init() werden weitere Objekte instanziiert, direkt oder durch andere Klassen. Darunter auch ein Liste, die mit new() instanziiert wurde, ebenso deren Elemente.<br />
In dem Moment, wo init() abgearbeitet ist, wird nun der Destruktor aufgerufen, warum passiert das? Ist das, weil man wieder in WinMain landet? Dadurch funktioniert mainLoop() natürlich nicht mehr. Ich dacht 'new-Speicher' müßte ich selbst abräumen.<br />
(Fällt mir gerade ein:) Muß ich meine Instanz von 'Applikation' in WinMain() evtl. auch mit new() erzeugen?!</p>
<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/1291186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291186</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 24 May 2007 06:39:01 GMT</pubDate></item><item><title><![CDATA[Reply to WinMain LifeCycle on Thu, 24 May 2007 07:28:12 GMT]]></title><description><![CDATA[<p>Kannst du das Problem mal bitte mit Code untermauern? Eine Variable wird dann gelöscht, wenn ihr Scope verlassen wird. Und wenn du die Variable in der Funktion erzeugt hast, reicht ihr Scope bis zum return.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291204</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 24 May 2007 07:28:12 GMT</pubDate></item><item><title><![CDATA[Reply to WinMain LifeCycle on Thu, 24 May 2007 08:08:01 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Kannst du das Problem mal bitte mit Code untermauern? Eine Variable wird dann gelöscht, wenn ihr Scope verlassen wird. Und wenn du die Variable in der Funktion erzeugt hast, reicht ihr Scope bis zum return.</p>
</blockquote>
<p>Code habe ich weggelassen, weil sich der auf sooooo viele Klassen verteilt:D, kann ich aber nachholen.<br />
Ich dachte new() bedeutet Speicher auf dem Heap -&gt; selbst abzuräumen, bzw. bei Programmende? Ist das falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291228</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 24 May 2007 08:08:01 GMT</pubDate></item><item><title><![CDATA[Reply to WinMain LifeCycle on Thu, 24 May 2007 08:37:18 GMT]]></title><description><![CDATA[<p>SammyRukka schrieb:</p>
<blockquote>
<p>(...)</p>
<p>Code habe ich weggelassen, weil sich der auf sooooo viele Klassen verteilt:D, kann ich aber nachholen.</p>
</blockquote>
<p>Wenn Du so intensiv mit Klassen, Konsturktoren, Destruktoren usw. hantierst, ist es wohl eher eine Frage für MFC oder C++ :p</p>
<blockquote>
<p>Ich dachte new() bedeutet Speicher auf dem Heap -&gt; selbst abzuräumen, bzw. bei Programmende? Ist das falsch?</p>
</blockquote>
<p>Ja. Wenn das Programm beendet wird, wird der Speicher vom Betriebssystem sowieso freigegeben. Das Abräumen muß während des Programmablaufs passieren, damit Dein Heap nicht mit Speicherleaks verstopft wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291250</guid><dc:creator><![CDATA[Elektronix]]></dc:creator><pubDate>Thu, 24 May 2007 08:37:18 GMT</pubDate></item><item><title><![CDATA[Reply to WinMain LifeCycle on Thu, 24 May 2007 08:48:45 GMT]]></title><description><![CDATA[<p>Wenn du nicht den gesamten Quelltext zeigen willst, kannst du ihn auf auf die wesentlichen Punkte zusammenfassen.</p>
<p>Vor allem: welches Objekt legst du per new an - und was genau machst du mit dem Zeiger, den du zurückbekommen hast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291262</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 24 May 2007 08:48:45 GMT</pubDate></item><item><title><![CDATA[Reply to WinMain LifeCycle on Thu, 24 May 2007 09:20:27 GMT]]></title><description><![CDATA[<p>OK. Ist wohl doch einfacher, wenn ich das poste. Aber ich kann ja mal kurz zusammenfassen, weil ich zum Code erste heute spät komme:</p>
<p>WinMain():</p>
<pre><code>MeinProgramm myProg = MeinProgramm();
myProg.init();
myProg.mainLoop();

return 0;
</code></pre>
<p>MeinProgramm::init():<br />
Ruft einen Parser auf, der ein 'Objektnetz' per new instanziiert, das das im ersten Post beschrieben ist.<br />
MeinProgramm kennt die 'Ankerpunkte' per Pointer (meine ich).</p>
<p>Das ganz ist funktioniert anscheinend auch, allerdings nur so lange, bis init() fertig ist. Dann springt er in den Destruktor meines (per new()) angelegten Listenobjekts. Falls das nicht reicht, kommt Code <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="😉"
    /> thx, so far!<br />
PS: Aber immerhin scheint der Destruktor wieder ordentlich aufzuräumen <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/1291278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291278</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 24 May 2007 09:20:27 GMT</pubDate></item><item><title><![CDATA[Reply to WinMain LifeCycle on Thu, 24 May 2007 09:28:21 GMT]]></title><description><![CDATA[<p>Ich glaube, da benötigen wir doch den Code der init-Methode.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291287</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 24 May 2007 09:28:21 GMT</pubDate></item><item><title><![CDATA[Reply to WinMain LifeCycle on Thu, 24 May 2007 09:32:47 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Ich glaube, da benötigen wir doch den Code der init-Methode.</p>
</blockquote>
<p>OK, kommt Zeit, kommt Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291289</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 24 May 2007 09:32:47 GMT</pubDate></item><item><title><![CDATA[Reply to WinMain LifeCycle on Thu, 24 May 2007 15:57:45 GMT]]></title><description><![CDATA[<p>So, hier die Code-Schnipsel:</p>
<p>WinMain()</p>
<pre><code>int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
	MeinProgramm myProg = MeinProgramm();
	myProg.init();
	myProg.mainLoop();
    return 0;
}
</code></pre>
<p>MeinProgramm.h (Ausschnitt)</p>
<pre><code>private:
	MeineListe* a_liste;
</code></pre>
<p>MeinProgramm.cpp:</p>
<pre><code>void MeinProgramm::init() {
	IniParser l_parser = IniParser();
	MeineListe l_liste = l_parser.erzeugeListe();
	a_liste = &amp;l_liste;
        // ...und noch mehr
}
</code></pre>
<p>MeineListe.h:</p>
<pre><code>class MeineListe {
public:
	int a_anzahl;
	Element* a_liste;

	MeineListe();
	MeineListe(int p_anzahl); // der wird benutzt!
	~MeineListe();
};
</code></pre>
<pre><code>MeineListe.cpp:
MeineListe::MeineListe(int p_anzahl) {
	a_anzahl = p_anzahl;
	a_liste = new Element[p_anzahl];
}

MeineListe::~MeineListe() {
	// Elemente auch abraeumen? Wie?!
	delete a_liste;
}
</code></pre>
<p>Ausschnitt IniParser:</p>
<pre><code>MeineListe&amp; IniParser::erzeugeListe() {

        // ....diverses....

	MeineListe* l_liste = new MeineListe(l_anzahl);

	for (int i = 0; i &lt; l_anzahl; i++) {
                // ....diverses....
	        Element* l_element = new Element();
		l_liste-&gt;a_liste[i] = *l_element;
	}

	return *l_liste;
}
</code></pre>
<p>Bei init()-Ende wird der Destruktor von MeineListe aufgerufen. mainLoop() sollte also egal sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291518</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 24 May 2007 15:57:45 GMT</pubDate></item><item><title><![CDATA[Reply to WinMain LifeCycle on Thu, 24 May 2007 16:04:17 GMT]]></title><description><![CDATA[<p>MeinProgramm myProg();</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291524</guid><dc:creator><![CDATA[..........]]></dc:creator><pubDate>Thu, 24 May 2007 16:04:17 GMT</pubDate></item><item><title><![CDATA[Reply to WinMain LifeCycle on Thu, 24 May 2007 16:10:08 GMT]]></title><description><![CDATA[<p>MeinProgramm myProg;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291530</guid><dc:creator><![CDATA[........]]></dc:creator><pubDate>Thu, 24 May 2007 16:10:08 GMT</pubDate></item><item><title><![CDATA[Reply to WinMain LifeCycle on Thu, 24 May 2007 17:13:23 GMT]]></title><description><![CDATA[<p>Welches ist jetzt die (?) Lösung und wenn das eine Lösung ist, kann mir das jemand erklären? Thx!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291587</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 24 May 2007 17:13:23 GMT</pubDate></item><item><title><![CDATA[Reply to WinMain LifeCycle on Fri, 25 May 2007 07:06:09 GMT]]></title><description><![CDATA[<p>Erstmal (nur am Rande) ist 'MeinProgramm myProg;' als Variablendefinition völlig ausreichend.</p>
<p>Zweitens:</p>
<pre><code class="language-cpp">void MeinProgramm::init() {
    IniParser l_parser = IniParser();
    MeineListe l_liste = l_parser.erzeugeListe();
    a_liste = &amp;l_liste;
        // ...und noch mehr
}
</code></pre>
<p>Du legst eine lokale Kopie der Liste an, die von erzeugeListe() geliefert wurde und gibst deren Adresse zurück. Das bedeutet einerseits ein Speicherleck (nach der Initialisierung von l_liste hast du keinen Zugriff mehr auf den mit new angeforderten Speicher) und andererseits undefiniertes Verhalten (du übergibst die Adresse eines Objekts, das nicht mehr existiert). Die Lösung dazu liegt in einem Zeichen: 'MeineListe**&amp;** l_liste = ...;'</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291948</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 25 May 2007 07:06:09 GMT</pubDate></item><item><title><![CDATA[Reply to WinMain LifeCycle on Fri, 25 May 2007 07:24:19 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: Danke soweit, ich werde das mal sacken lassen und in einer ruhigen Minute 'nacharbeiten'. Evtl. Verständnisfragen kommen dann....<br />
Zwei habe ich aber jetzt schon:<br />
1. Macht es einen Unterschied, welche der Varianten ich benutze?!</p>
<pre><code>MeinProgramm myProg = MeinProgramm();
MeinProgramm myProg();
MeinProgramm myProg;
</code></pre>
<p>2. Dann war ich mit der Referenz als Rückgabe von 'erzeugeListe' ja schon ganz gut...</p>
<pre><code>MeineListe&amp; IniParser::erzeugeListe() { ...}
</code></pre>
<p>.<br />
Das hätte ich dann nur ordentlich nutzen müssen und lokal - also in init() - auch mit der Referenz und nicht mit dem Pointer arbeiten müssen.<br />
Hab ich das richtig verstanden? Wenn ja, dann funktionierte das trotzdem, weil der Compiler mir die Konvertierung selbständig abgenommen hat (Referenz -&gt; Pointer)?!</p>
<p>Aber ersteinmal: Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291952</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 25 May 2007 07:24:19 GMT</pubDate></item></channel></rss>