<?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[Problem mit Speicherfreigabe bei Programmabbruch]]></title><description><![CDATA[<p>Huhu liebes C++ Forum.. ich hab mal wieder ein Problem.. *g*</p>
<p>Ich habe ein Programm mit einer QT-Oberfläche. Wenn ich das Programm jetzt aus Visuals Studio starte erhalte öffnen sich 2 Fenster. Einmal das Konsolenfenster und einmal mein QT Fenster. Wenn ich das Programm beende indem ich das QT Fenster beende schließt sich das Programm und alles ist wunderbar. Wenn ich das Programm allerdings beende indem ich das Konsolenfenster schliesse bleibt das Programm kurz hängen und ich kriege eine Windows Fehlermeldung: Windows kann das Programm nicht beenden blabla &quot;Sofort beenden&quot;, &quot;Abbrechen&quot; (ich denke mal diese Fehlermeldung kennt so gut wie jeder).<br />
Nachdem ich eine Zeit mit Fehlersuche verbracht habe habe ich festgestellt das es an einer &quot;delete xyz&quot; Anweisung liegt. Wenn ich diese auskommentiere beendet sich Programm auch normal wenn ich das Konsolenfenster schließe.</p>
<p>Ich habe mir im Debugger mal die Schritte angeschaut die durchlaufen werden wenn ich das Programm normal beende und es läuft alles so wie geplant.</p>
<p>Ich bin bisher davon ausgegangen das das Programm einfach &quot;hart&quot; beendet wird wenn ich das Konsolenfenster schliesse (wie wenn ich das Programm im Taskmanager beende). Wenn ich jedoch den Programm über den Taskmanager beende erscheint dieses Problem nicht.</p>
<p>Jetzt frage ich mich natürlich an was das liegen kann und ob/wie ich dahinter kommen kann was schief läuft wenn ich das Programm über das Konsolenfenster beende. Was macht Visual Studio an dieser Stelle?<br />
Bzw. sollte ich mich überhaupt darum kümmern? (der Benutzer soll ja später nicht die Möglichkeit haben das Programm auf diese Art zu beenden)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/228703/problem-mit-speicherfreigabe-bei-programmabbruch</link><generator>RSS for Node</generator><lastBuildDate>Mon, 28 Sep 2026 05:41:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/228703.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 01 Dec 2008 21:48:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Speicherfreigabe bei Programmabbruch on Mon, 01 Dec 2008 21:48:52 GMT]]></title><description><![CDATA[<p>Huhu liebes C++ Forum.. ich hab mal wieder ein Problem.. *g*</p>
<p>Ich habe ein Programm mit einer QT-Oberfläche. Wenn ich das Programm jetzt aus Visuals Studio starte erhalte öffnen sich 2 Fenster. Einmal das Konsolenfenster und einmal mein QT Fenster. Wenn ich das Programm beende indem ich das QT Fenster beende schließt sich das Programm und alles ist wunderbar. Wenn ich das Programm allerdings beende indem ich das Konsolenfenster schliesse bleibt das Programm kurz hängen und ich kriege eine Windows Fehlermeldung: Windows kann das Programm nicht beenden blabla &quot;Sofort beenden&quot;, &quot;Abbrechen&quot; (ich denke mal diese Fehlermeldung kennt so gut wie jeder).<br />
Nachdem ich eine Zeit mit Fehlersuche verbracht habe habe ich festgestellt das es an einer &quot;delete xyz&quot; Anweisung liegt. Wenn ich diese auskommentiere beendet sich Programm auch normal wenn ich das Konsolenfenster schließe.</p>
<p>Ich habe mir im Debugger mal die Schritte angeschaut die durchlaufen werden wenn ich das Programm normal beende und es läuft alles so wie geplant.</p>
<p>Ich bin bisher davon ausgegangen das das Programm einfach &quot;hart&quot; beendet wird wenn ich das Konsolenfenster schliesse (wie wenn ich das Programm im Taskmanager beende). Wenn ich jedoch den Programm über den Taskmanager beende erscheint dieses Problem nicht.</p>
<p>Jetzt frage ich mich natürlich an was das liegen kann und ob/wie ich dahinter kommen kann was schief läuft wenn ich das Programm über das Konsolenfenster beende. Was macht Visual Studio an dieser Stelle?<br />
Bzw. sollte ich mich überhaupt darum kümmern? (der Benutzer soll ja später nicht die Möglichkeit haben das Programm auf diese Art zu beenden)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1624005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1624005</guid><dc:creator><![CDATA[xorm]]></dc:creator><pubDate>Mon, 01 Dec 2008 21:48:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherfreigabe bei Programmabbruch on Tue, 02 Dec 2008 07:09:25 GMT]]></title><description><![CDATA[<p>Für QT und Konsorten gibt's auch ein eigenes Board:</p>
<p><a href="http://c-plusplus.net/forum/viewforum-var-f-is-51.html" rel="nofollow">http://c-plusplus.net/forum/viewforum-var-f-is-51.html</a></p>
<p>Lass dich am besten dahin verschieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1624091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1624091</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Tue, 02 Dec 2008 07:09:25 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherfreigabe bei Programmabbruch on Tue, 02 Dec 2008 17:00:36 GMT]]></title><description><![CDATA[<p>Hm ich habe das Thema hier aufgemacht weil ich eigentlich denke das QT nicht die Ursache für das Problem ist. Ich gehe mal davon aus das dieses Problem auch existieren würde wenn ich eine reine Konsolenanwendung hätte. Schliesslich könnte man dann ja auch einfach das Konsolenfenster schliessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1624490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1624490</guid><dc:creator><![CDATA[xorm]]></dc:creator><pubDate>Tue, 02 Dec 2008 17:00:36 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherfreigabe bei Programmabbruch on Tue, 02 Dec 2008 17:04:14 GMT]]></title><description><![CDATA[<p>In dem Fall müsstest du mal relevanten Code posten.<br />
- Welchen Speicher reservierst du<br />
- wo / wann gibst du ihn wieder frei ( oder versuchst es zumindest )</p>
<p>Wenn du glaubst, dass es nix mit QT zu tun hat, dann schreib das am besten garnicht erst hin, sondern poste gleich den Code, wo du den Fehler vermutest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1624495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1624495</guid><dc:creator><![CDATA[it0101@loggedoff]]></dc:creator><pubDate>Tue, 02 Dec 2008 17:04:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherfreigabe bei Programmabbruch on Tue, 02 Dec 2008 17:36:57 GMT]]></title><description><![CDATA[<p>Grundsätzlich gilt: zu jedem new/new[] gehört <em>genau</em> ein delete/delete[]. Aber wie bereits gesagt wurde, poste erst mal ein wenig Code, dann sehen wir weiter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1624512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1624512</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Tue, 02 Dec 2008 17:36:57 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherfreigabe bei Programmabbruch on Wed, 03 Dec 2008 22:11:33 GMT]]></title><description><![CDATA[<p>Kann gerne ich machen. Das Programm ist allerdings etwas größer und ich muss erstmal die entsprechenden Teile raussuchen und zu einem kleinem Testprogramm zusammenbauen. Ich weiß nicht ob ich vor dem Wochenende dazu komme.<br />
Daher bitte nicht wundern wenn ich mich ein paar Tage nicht melde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625160</guid><dc:creator><![CDATA[xorm]]></dc:creator><pubDate>Wed, 03 Dec 2008 22:11:33 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherfreigabe bei Programmabbruch on Wed, 03 Dec 2008 23:53:06 GMT]]></title><description><![CDATA[<p>Wenn ich mich richtig erinnere läufts ja so ab, dass ein Objekt von QApplication erzeugt wird, dem weist du dann ein Objekt deiner Windowklasse zu und führst das ganze schließlich mit exec aus.</p>
<p>Irgendwie so sollte das jedenfalls laufen.</p>
<p>Das Problem ist dass die Konsole den Hauptthread deines Prozesses darstellt, also auch den in dem dein QApplication Objekt arbeitet. Wenn du die Konsole schließt killst du diesen und deine Qt-Applikation hat nicht genug Zeit noch alles aufzuräumen bevor Windows dem ganzen den Todesstoß verpassen will</p>
<p>Mir fallen auf Anhieb nur plattformabhängige Lösungen ein:</p>
<p>Die einfachste ist das Konsolenfenster verschwinden lassen:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;

//....

HWND hwnd;

hwnd = GetConsoleWindow(); // siehe da: http://msdn.microsoft.com/en-us/library/ms683175.aspx

if( hwnd )
	ShowWindow( hwnd, SW_HIDE );
</code></pre>
<p>Eine Andere wäre irgendwie zu versuchen die Message abzufangen die der Konsole mitteilt dass sie geschlossen wird, dürfte aber wesentlich schwieriger sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625180</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Wed, 03 Dec 2008 23:53:06 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherfreigabe bei Programmabbruch on Thu, 04 Dec 2008 07:51:04 GMT]]></title><description><![CDATA[<p>Soweit ich weiss läuft das Beenden mittels &quot;X&quot; bei Konsolen-Applikationen über ein &quot;signal&quot; (vermutlich SIGTERM). Setz den Handler über die &quot;signal&quot; Funktion und tu im Handler was auch immer nötig ist um dein Programm sauber zu beenden.<br />
Alternativ kannst du, wenn es &quot;nichts ausmacht&quot; den Prozess im Signal-Handler auch einfach mit ExitProcess &quot;abschiessen&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625240</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 04 Dec 2008 07:51:04 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherfreigabe bei Programmabbruch on Thu, 04 Dec 2008 10:17:40 GMT]]></title><description><![CDATA[<p>_matze schrieb:</p>
<blockquote>
<p>Grundsätzlich gilt: zu jedem new/new[] gehört <em>genau</em> ein delete/delete[]. Aber wie bereits gesagt wurde, poste erst mal ein wenig Code, dann sehen wir weiter.</p>
</blockquote>
<p>Und gerade das ist bei Qt (leider) nicht so. Bei Qt werden zwar die meisten Objekte mit new angelegt (müssen sie sogar), um die Freigabe kümmert sich aber das Framework. Man baut sich Parent-Child-Bäume auf, und wenn Parents zerstört werden, werden auch die abhängigen Childs zerstört.<br />
Deshalb knallen einem Programme die statische Qt-Widgets anlegen auch so toll um die Ohren, und das ist auch einer der Gründe, wieso ich Qt etwas komisch finde.<br />
Ohne Code schwer zu sagen, aber ich vermute mal, dass Du etwas löscht, das Qt bereits gelöscht hat, oder das Qt versucht etwas zu löschen, dass Du selbst bereits gelöscht hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625329</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 04 Dec 2008 10:17:40 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherfreigabe bei Programmabbruch on Thu, 04 Dec 2008 11:35:54 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4465">@Tachyon</a>: ich dachte immer QT verwendet Ref-Counting. In dem Fall könnte man statische Objekte am Leben halten, indem man einfach 1x AddRef aufruft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625372</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 04 Dec 2008 11:35:54 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherfreigabe bei Programmabbruch on Thu, 04 Dec 2008 11:41:59 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4465">@Tachyon</a>: ich dachte immer QT verwendet Ref-Counting. In dem Fall könnte man statische Objekte am Leben halten, indem man einfach 1x AddRef aufruft.</p>
</blockquote>
<p>Es heisst Qt, nicht QT <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> .<br />
Ist das so? Meines Wissens hat Qt <a href="http://doc.trolltech.com/4.0/objecttrees.html" rel="nofollow">dieses Verhalten</a>. Ich sehe aber gerade, dass Qt Child-Objekte von den Parents entfernt, wenn man sie Childs selbst löscht. Ich denke aber, wenn man versucht die Childs löscht, nachdem der Parent gelöscht wurde, gibts trotzdem Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625381</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 04 Dec 2008 11:41:59 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherfreigabe bei Programmabbruch on Thu, 04 Dec 2008 13:56:52 GMT]]></title><description><![CDATA[<p>Oops, doch kein Ref-Counting, da hatte ich grossen Blödsinn in Erinnerung <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/1625456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625456</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 04 Dec 2008 13:56:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherfreigabe bei Programmabbruch on Sat, 06 Dec 2008 18:09:24 GMT]]></title><description><![CDATA[<p>Danke für die Hinweise <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>Ich habe mich heute nochmal drangesetzt und denke den Fehler gefunden zu haben. Wie ich vermutet hatte lag das Problem nicht an Qt.<br />
Ich hatte aus Debug zwecken eine Textausgabe im Destruktor einer Klasse. Von dieser Klasse habe ich einem Programm nun ein statisches Objekt angelegt. Wenn ich das Programm normal beendet habe ging es ohne Probleme und wenn ich das Fenster geschlossen habe kam es zu einer Fehlermeldung.</p>
<p>Letztendlich hatte ich sowas:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class MyClass {

public:
	MyClass() {
		std::cout &lt;&lt; &quot;Konstruktor&quot; &lt;&lt; std::endl;
	}

	~MyClass() {
		std::cout &lt;&lt; &quot;Destruktor&quot; &lt;&lt; std::endl;
	}
};

int _tmain(int argc, char* argv[]) {

	static MyClass myClass;

	char c;
	std::cin &gt;&gt; c;

	return 0;
}
</code></pre>
<p>Wenn ich das Beispielprogramm beende indem ich etwas eingebe und Enter drücke ist alles gut. Wenn ich das Fenster schließe bleibt es hängen.<br />
Sobald ich die Textausgabe im Destruktor entferne oder das static weg mache geht es.<br />
cout scheint also nicht mehr zu existieren wenn der Destruktor aufgerufen wird.</p>
<p>mfg xorm :xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1626224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1626224</guid><dc:creator><![CDATA[xorm]]></dc:creator><pubDate>Sat, 06 Dec 2008 18:09:24 GMT</pubDate></item></channel></rss>