<?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[Speicherproblem]]></title><description><![CDATA[<p>Hallo,<br />
ich bin gerade dabei Spiele Programmierung mit C++ und DirectX 9 zu lernen. Nun wollte ich eine Log Funktion einbauen, die auch bedingt lange funktioniert. Sie wird vllt. 5-6 mal aufgerufen und danach sagt mir der Compiler:</p>
<pre><code>Windows hat einen Haltepunkt in cGame.exe ausgelöst.

Dies kann auf eine Beschädigung des Heaps zurückzuführen sein, die auf ein Problem in cGame.exe oder in einer der geladenen DLLs hinweist.

Dies kann auch darauf zurückzuführen sein, dass der Benutzer F12 drückt, während cGame.exe den Fokus hat.

Weitere Analyseinformationen finden Sie möglicherweise im Ausgabefenster.
</code></pre>
<p>in der Datei new.cpp in der Zeile 59 deren Code</p>
<pre><code class="language-cpp">while ((p = malloc(size)) == 0)
</code></pre>
<p>ist. Ich konnte das Problem auf die Funktion die in den Log schreibt zurückführen und noch genauer auf die Funktion die bei mit einen Zeit String erstellt.</p>
<p>Die Funktion eWriteLog, die in die Log Datei schreibt:</p>
<pre><code class="language-cpp">eResult eWriteLog (char *sLogEntry, eLogType logType)
{
	if (logFile)
	{
		char *sTimePrefix = &quot;[&quot;;
		char *sTime = eGetDiffTime();
		char *sTimePostfix = &quot;] &quot;;

		char *postfix = &quot;&lt;br/&gt;&quot;;
		char *prefix;
		if (logType == LT_ERROR)
			prefix = &quot;&lt;font color=\&quot;red\&quot;&gt;Fehler: &lt;/font&gt;&quot;;
		else
			prefix = &quot;&lt;font color=\&quot;blue\&quot;&gt;Information: &lt;/font&gt;&quot;;

		fwrite(sTimePrefix, strlen(sTimePrefix) * sizeof(sTimePrefix[0]), 1, logFile);
		fwrite(sTime, strlen(sTime) * sizeof(sTime[0]), 1, logFile);
		fwrite(sTimePostfix, strlen(sTimePostfix) * sizeof(sTimePostfix[0]), 1, logFile);

		fwrite(prefix, strlen(prefix) * sizeof(prefix[0]), 1, logFile);

		fwrite(sLogEntry, strlen(sLogEntry) * sizeof(sLogEntry[0]), 1, logFile);
		fwrite(postfix, strlen(postfix) * sizeof(postfix[0]), 1, logFile);

		return E_OK;
	}
	else
	{
		return E_FAILED;
	}
}
</code></pre>
<p>und die Funktion eGetDiffTime, die den Zeit String erstellt:</p>
<pre><code class="language-cpp">char* eGetDiffTime()
{
	time_t cCurrentTime = time(NULL);

	double dDiffTime = difftime(cCurrentTime, *cStartTime);

	double dHours = dDiffTime / 60 / 60;
	double dMinutes = dDiffTime / 60;
	double dSeconds = dDiffTime;

	int iHours = dHours;
	int iMinutes = dMinutes - (iHours * 60 * 60);
	int iSeconds = dSeconds - (iMinutes * 60) - (iHours * 60 * 60);

	char *sHours = new char;
	char *sMinutes = new char;
	char *sSeconds = new char;

	if (iMinutes &lt; 10)
		sprintf(sMinutes, &quot;0%d&quot;, iMinutes);
	else
		sprintf(sMinutes, &quot;%d&quot;, iMinutes);
	if (iSeconds &lt; 10)
		sprintf(sSeconds, &quot;0%d&quot;, iSeconds);
	else
		sprintf(sSeconds, &quot;%d&quot;, iSeconds);
	if (iHours &lt; 10)
		sprintf(sHours, &quot;0%d&quot;, iHours);
	else
		sprintf(sHours, &quot;%d&quot;, iHours);

	char *sTime = new char;
	sprintf(sTime, &quot;%s:%s:%s&quot;, sHours, sMinutes, sSeconds);

	return sTime;
}
</code></pre>
<p>cStartTime ist global als time_t deklariert:</p>
<pre><code class="language-cpp">time_t *cStartTime;
</code></pre>
<p>und wird am anfang geladen:<br />
[cpp]<br />
cStartTime = (time_t*)malloc(sizeof(time_t));<br />
time(cStartTime);<br />
[/c]</p>
<p>Mir ist klar das das nicht sehr elegante Lösungen sind, aber ich bin noch nicht so erfahren in C++, für Verbesserungen währe ich dankbar.<br />
Ich hoffe ihr könnt mir bei dem Problem helfen.</p>
<p>Progglord</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/277985/speicherproblem</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 15:31:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277985.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 27 Nov 2010 18:56:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherproblem on Sat, 27 Nov 2010 18:56:43 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich bin gerade dabei Spiele Programmierung mit C++ und DirectX 9 zu lernen. Nun wollte ich eine Log Funktion einbauen, die auch bedingt lange funktioniert. Sie wird vllt. 5-6 mal aufgerufen und danach sagt mir der Compiler:</p>
<pre><code>Windows hat einen Haltepunkt in cGame.exe ausgelöst.

Dies kann auf eine Beschädigung des Heaps zurückzuführen sein, die auf ein Problem in cGame.exe oder in einer der geladenen DLLs hinweist.

Dies kann auch darauf zurückzuführen sein, dass der Benutzer F12 drückt, während cGame.exe den Fokus hat.

Weitere Analyseinformationen finden Sie möglicherweise im Ausgabefenster.
</code></pre>
<p>in der Datei new.cpp in der Zeile 59 deren Code</p>
<pre><code class="language-cpp">while ((p = malloc(size)) == 0)
</code></pre>
<p>ist. Ich konnte das Problem auf die Funktion die in den Log schreibt zurückführen und noch genauer auf die Funktion die bei mit einen Zeit String erstellt.</p>
<p>Die Funktion eWriteLog, die in die Log Datei schreibt:</p>
<pre><code class="language-cpp">eResult eWriteLog (char *sLogEntry, eLogType logType)
{
	if (logFile)
	{
		char *sTimePrefix = &quot;[&quot;;
		char *sTime = eGetDiffTime();
		char *sTimePostfix = &quot;] &quot;;

		char *postfix = &quot;&lt;br/&gt;&quot;;
		char *prefix;
		if (logType == LT_ERROR)
			prefix = &quot;&lt;font color=\&quot;red\&quot;&gt;Fehler: &lt;/font&gt;&quot;;
		else
			prefix = &quot;&lt;font color=\&quot;blue\&quot;&gt;Information: &lt;/font&gt;&quot;;

		fwrite(sTimePrefix, strlen(sTimePrefix) * sizeof(sTimePrefix[0]), 1, logFile);
		fwrite(sTime, strlen(sTime) * sizeof(sTime[0]), 1, logFile);
		fwrite(sTimePostfix, strlen(sTimePostfix) * sizeof(sTimePostfix[0]), 1, logFile);

		fwrite(prefix, strlen(prefix) * sizeof(prefix[0]), 1, logFile);

		fwrite(sLogEntry, strlen(sLogEntry) * sizeof(sLogEntry[0]), 1, logFile);
		fwrite(postfix, strlen(postfix) * sizeof(postfix[0]), 1, logFile);

		return E_OK;
	}
	else
	{
		return E_FAILED;
	}
}
</code></pre>
<p>und die Funktion eGetDiffTime, die den Zeit String erstellt:</p>
<pre><code class="language-cpp">char* eGetDiffTime()
{
	time_t cCurrentTime = time(NULL);

	double dDiffTime = difftime(cCurrentTime, *cStartTime);

	double dHours = dDiffTime / 60 / 60;
	double dMinutes = dDiffTime / 60;
	double dSeconds = dDiffTime;

	int iHours = dHours;
	int iMinutes = dMinutes - (iHours * 60 * 60);
	int iSeconds = dSeconds - (iMinutes * 60) - (iHours * 60 * 60);

	char *sHours = new char;
	char *sMinutes = new char;
	char *sSeconds = new char;

	if (iMinutes &lt; 10)
		sprintf(sMinutes, &quot;0%d&quot;, iMinutes);
	else
		sprintf(sMinutes, &quot;%d&quot;, iMinutes);
	if (iSeconds &lt; 10)
		sprintf(sSeconds, &quot;0%d&quot;, iSeconds);
	else
		sprintf(sSeconds, &quot;%d&quot;, iSeconds);
	if (iHours &lt; 10)
		sprintf(sHours, &quot;0%d&quot;, iHours);
	else
		sprintf(sHours, &quot;%d&quot;, iHours);

	char *sTime = new char;
	sprintf(sTime, &quot;%s:%s:%s&quot;, sHours, sMinutes, sSeconds);

	return sTime;
}
</code></pre>
<p>cStartTime ist global als time_t deklariert:</p>
<pre><code class="language-cpp">time_t *cStartTime;
</code></pre>
<p>und wird am anfang geladen:<br />
[cpp]<br />
cStartTime = (time_t*)malloc(sizeof(time_t));<br />
time(cStartTime);<br />
[/c]</p>
<p>Mir ist klar das das nicht sehr elegante Lösungen sind, aber ich bin noch nicht so erfahren in C++, für Verbesserungen währe ich dankbar.<br />
Ich hoffe ihr könnt mir bei dem Problem helfen.</p>
<p>Progglord</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986803</guid><dc:creator><![CDATA[Progglord]]></dc:creator><pubDate>Sat, 27 Nov 2010 18:56:43 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem on Sat, 27 Nov 2010 19:13:57 GMT]]></title><description><![CDATA[<p>Progglord schrieb:</p>
<blockquote>
<p>Ich bin gerade dabei Spiele Programmierung mit C++ und DirectX 9 zu lernen...</p>
<pre><code class="language-cpp">cStartTime = (time_t*)malloc(sizeof(time_t));
</code></pre>
</blockquote>
<p>Äh, welches Buch ist das? Den Returnwert von malloc zu casten ist &quot;C++-typisch&quot; <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="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986812</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Sat, 27 Nov 2010 19:13:57 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem on Sat, 27 Nov 2010 19:26:46 GMT]]></title><description><![CDATA[<p>Böser C Code, hat mMn nix mit C++ zu tun.</p>
<pre><code>char *sHours = new char;
</code></pre>
<p>Der Pointer wird direkt im Anschluss in sprintf benutzt. Buffer Overflow, anyone?</p>
<p>mfg, René~</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986816</guid><dc:creator><![CDATA[NewSoftzzz]]></dc:creator><pubDate>Sat, 27 Nov 2010 19:26:46 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem on Sat, 27 Nov 2010 20:12:41 GMT]]></title><description><![CDATA[<p>Ich habe jetzt nach weiteren Stunden experimentieren und suchen rausgefunden das es am String liegt der übergeben wird.</p>
<pre><code class="language-cpp">char *errorString = new char;
		sprintf(errorString, &quot;Das D3DDevice konnte nicht erstellt werden (%s): %s&quot;, DXGetErrorString(hResult), DXGetErrorDescription(hResult));

		eWriteLog(&quot;Das D3DDevice konnte nicht erstellt werden&quot;, LT_ERROR);
		return E_FAILED;
</code></pre>
<p>Es liegt hier an DXGetErrorString(hResult) und/oder DXGetErrorDescription(hResult). Ich forsche noch ein wenig und evtl. könnt ihr mir ja auch helfen das Problem zu lösen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/27692">@Vicious</a> Falcon: Das ist aus keinem Buch :D, ich arbeite nur irgendwie gerne mit malloc :D.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986840</guid><dc:creator><![CDATA[Progglord]]></dc:creator><pubDate>Sat, 27 Nov 2010 20:12:41 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem on Sat, 27 Nov 2010 20:14:06 GMT]]></title><description><![CDATA[<p>Progglord schrieb:</p>
<blockquote>
<pre><code class="language-cpp">char *errorString = new char;
</code></pre>
</blockquote>
<p>Alter, wenn du schon C programmieren willst, dann lern es gefälligst richtig damit du dir nicht tausende von Buffer Overflows in deinen Code haust...</p>
<p>mfg, René~</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986842</guid><dc:creator><![CDATA[NewSoftzzz]]></dc:creator><pubDate>Sat, 27 Nov 2010 20:14:06 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem on Sat, 27 Nov 2010 20:54:33 GMT]]></title><description><![CDATA[<p>Ich seh schon die beiden DXGetError Funktionen geben WCHAR* zurück.<br />
Wie kann ich das denn richtig in char* umwandeln ?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1993">@NewSoftzzz</a>: Wenn du schon rummeckerst, dann sag mir wenigstens wie es richtig geht.</p>
<p>EDIT:<br />
Noch eine Frage:<br />
Wie kann ich denn einen Buffer Overflow vorbeugen, bzw. wann wird dieser ausgelöst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986858</guid><dc:creator><![CDATA[Progglord]]></dc:creator><pubDate>Sat, 27 Nov 2010 20:54:33 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem on Sat, 27 Nov 2010 21:00:16 GMT]]></title><description><![CDATA[<p>C++ bietet eine Klasse fuer Zeichenketten an, std::string. Auch solltest du dich mehr mit den Grundlagen vertraut machen und vorher ein reines C++ Buch lesen, bevor du Spiele damit machen kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986860</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Sat, 27 Nov 2010 21:00:16 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem on Sat, 27 Nov 2010 21:04:10 GMT]]></title><description><![CDATA[<p>std::string kenn ich auch, es ist bloß ein wenig her :D. Danke ich werde es mal so machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986863</guid><dc:creator><![CDATA[Progglord]]></dc:creator><pubDate>Sat, 27 Nov 2010 21:04:10 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem on Sun, 28 Nov 2010 02:02:42 GMT]]></title><description><![CDATA[<p>wieso du nur so ne doofe antwort bekommen hast, liegt daran, dass keiner weiß, ob du nun C oder C++ programmierst...<br />
der C weg wäre malloc, C++ std::string oder zumindest new char[SIZE].</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986913</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 28 Nov 2010 02:02:42 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem on Sun, 28 Nov 2010 02:39:53 GMT]]></title><description><![CDATA[<p>Oder man legt einfach ein Array an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986916</guid><dc:creator><![CDATA[feigling]]></dc:creator><pubDate>Sun, 28 Nov 2010 02:39:53 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem on Sun, 28 Nov 2010 03:33:47 GMT]]></title><description><![CDATA[<p>feigling schrieb:</p>
<blockquote>
<p>Oder man legt einfach ein Array an.</p>
</blockquote>
<p>Rohe Arrays sind mühsam und fehleranfällig. Die würde ich wirklich nur verwenden, wenn es gar keine sinnvollen Alternativen wie <code>std::tr1::array</code> gibt und man keinesfalls die Möglichkeit hat, eine Viertelstunde zur Implementierung einer solchen aufzuwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986920</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 28 Nov 2010 03:33:47 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem on Sun, 28 Nov 2010 05:00:56 GMT]]></title><description><![CDATA[<p>Ich hatte vergessen &quot;unter C&quot; dazuzuschreiben <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/1986923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986923</guid><dc:creator><![CDATA[feigling]]></dc:creator><pubDate>Sun, 28 Nov 2010 05:00:56 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem on Sun, 28 Nov 2010 09:33:39 GMT]]></title><description><![CDATA[<p>Progglord schrieb:</p>
<blockquote>
<p>Ich seh schon die beiden DXGetError Funktionen geben WCHAR* zurück.<br />
Wie kann ich das denn richtig in char* umwandeln ?</p>
</blockquote>
<p>Da du unter Windows arbeitest, schau dir mal die Funktion <a href="http://msdn.microsoft.com/en-us/library/dd374130%28VS.85%29.aspx" rel="nofollow">WideCharToMultiByte</a> (das Pendant ist, wer hätte es gedacht, MultiByteToWideChar) an.</p>
<pre><code class="language-cpp">const WCHAR* wstr = L&quot;wstring&quot;;
size_t len = wcslen(wstr);
std::vector&lt;char&gt; v(len+1,0);
WideCharToMultiByte(CP_ACP,0,wstr,len,&amp;v[0],len,0,0);
// mit &amp;v[0] arbeiten
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1986927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986927</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Sun, 28 Nov 2010 09:33:39 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem on Sun, 28 Nov 2010 14:59:46 GMT]]></title><description><![CDATA[<p>feigling schrieb:</p>
<blockquote>
<p>Ich hatte vergessen &quot;unter C&quot; dazuzuschreiben <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>
</blockquote>
<p>Ich denke, als C-Programmierer würde ich mir mit der Zeit sicher auch irgendwas überlegen... <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/1987067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1987067</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 28 Nov 2010 14:59:46 GMT</pubDate></item></channel></rss>