<?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[Seltsamer Fehler bei vollem Speicher]]></title><description><![CDATA[<p>Hallo,</p>
<p>mir ist heute eine kleine Anomalie aufgefallen. Und zwar habe ich folgende Funktion, die ich nach jedem new benutze, wobei ich new stets mit nothrow benutze.</p>
<pre><code class="language-cpp">inline void error_test (void *pointer, const char *error_message){

	if (pointer == NULL){
		std::cerr &lt;&lt; &quot;ERROR:&quot; &lt;&lt; error_message &lt;&lt; std::endl;
		exit(EXIT_FAILURE);
	}

	return;
}
</code></pre>
<p>Das ist vielleicht nicht das Schlauste, was man machen kann, aber für mich erstmal genug. Nun ist es so: Wenn ich zum Start des Programms einen trivialen Aufruf mit dem Nullpointer mache (error_test(NULL, &quot;test&quot;)), funktioniert alles, wie es soll. Wenn der Speicher allerdings mal WIRKLICH voll ist, d.h. new<br />
gibt einen Nullpointer zurück, schreibt er die error_message nicht mehr hin, d.h. es kommt als Output nur</p>
<pre><code>ERROR:
</code></pre>
<p>, aber nicht mehr.</p>
<p>Gesagt sei dabei, dass mein Programm extrem viele kleine Speicherblöcke holt, d.h. bei einem fehlgeschlagenen new ist der Speicher wirklich richtig voll. Kann es sein, dass einfach nicht mehr genug Speicher da ist, um die error_message zu speichern (der Speicher für die error_message müsste wohl vom Heap geholt werden, nehme ich an?) oder wie ist dieses Verhalten zu erklären?</p>
<p>Vielen Dank schonmal im Voraus,</p>
<p>plizzz</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/297822/seltsamer-fehler-bei-vollem-speicher</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 06:39:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/297822.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 07 Jan 2012 19:21:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Seltsamer Fehler bei vollem Speicher on Sat, 07 Jan 2012 19:21:58 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>mir ist heute eine kleine Anomalie aufgefallen. Und zwar habe ich folgende Funktion, die ich nach jedem new benutze, wobei ich new stets mit nothrow benutze.</p>
<pre><code class="language-cpp">inline void error_test (void *pointer, const char *error_message){

	if (pointer == NULL){
		std::cerr &lt;&lt; &quot;ERROR:&quot; &lt;&lt; error_message &lt;&lt; std::endl;
		exit(EXIT_FAILURE);
	}

	return;
}
</code></pre>
<p>Das ist vielleicht nicht das Schlauste, was man machen kann, aber für mich erstmal genug. Nun ist es so: Wenn ich zum Start des Programms einen trivialen Aufruf mit dem Nullpointer mache (error_test(NULL, &quot;test&quot;)), funktioniert alles, wie es soll. Wenn der Speicher allerdings mal WIRKLICH voll ist, d.h. new<br />
gibt einen Nullpointer zurück, schreibt er die error_message nicht mehr hin, d.h. es kommt als Output nur</p>
<pre><code>ERROR:
</code></pre>
<p>, aber nicht mehr.</p>
<p>Gesagt sei dabei, dass mein Programm extrem viele kleine Speicherblöcke holt, d.h. bei einem fehlgeschlagenen new ist der Speicher wirklich richtig voll. Kann es sein, dass einfach nicht mehr genug Speicher da ist, um die error_message zu speichern (der Speicher für die error_message müsste wohl vom Heap geholt werden, nehme ich an?) oder wie ist dieses Verhalten zu erklären?</p>
<p>Vielen Dank schonmal im Voraus,</p>
<p>plizzz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2164976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2164976</guid><dc:creator><![CDATA[plizzz]]></dc:creator><pubDate>Sat, 07 Jan 2012 19:21:58 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Fehler bei vollem Speicher on Sat, 07 Jan 2012 19:35:00 GMT]]></title><description><![CDATA[<blockquote>
<p>(der Speicher für die error_message müsste wohl vom Heap geholt werden, nehme ich an?)</p>
</blockquote>
<p>Nö, du übergibst ja nur einen Zeiger, dann ist es egal wo der Speicher herkommt.</p>
<pre><code class="language-cpp">error_test(0, &quot;Hallo Welt&quot;); // Static data

char error[] = &quot;Hallo Welt&quot;;
error_test(0, error); // Stack

std::string msg(&quot;Hallo Welt&quot;);
error_test(0, msg.c_str()); // Heap, von std::string verwaltet
</code></pre>
<p>Kann mir das auch nicht ganz erklären.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2164978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2164978</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sat, 07 Jan 2012 19:35:00 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Fehler bei vollem Speicher on Sat, 07 Jan 2012 20:30:22 GMT]]></title><description><![CDATA[<p>Du kannst ja mal in die Implementierung deines Compilers von operator&lt;&lt;(ostream&amp;, const char <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="😉"
    /> schauen, vielleicht wird da irgendwo Speicher angefordert oder auch bei std::endl. Wenn du den Fehler verhindern willst, kannst du ja am Anfang einen Speicherblock anfordern (vielleicht 500 Byte) und diesen dann vor der Fehlerausgabe freigeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2164980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2164980</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Sat, 07 Jan 2012 20:30:22 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Fehler bei vollem Speicher on Sun, 08 Jan 2012 09:02:17 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p>Du kannst ja mal in die Implementierung deines Compilers von operator&lt;&lt;(ostream&amp;, const char <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="😉"
    /> schauen, vielleicht wird da irgendwo Speicher angefordert oder auch bei std::endl. Wenn du den Fehler verhindern willst, kannst du ja am Anfang einen Speicherblock anfordern (vielleicht 500 Byte) und diesen dann vor der Fehlerausgabe freigeben.</p>
</blockquote>
<p>Diese Methode hat funktioniert, auch wenn ich noch nicht exakt weiß, wieso. Werde mich mal bei Zeiten daran setzen und nachschauen, ob deine Vermutung richtig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165168</guid><dc:creator><![CDATA[plizzz]]></dc:creator><pubDate>Sun, 08 Jan 2012 09:02:17 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Fehler bei vollem Speicher on Sun, 08 Jan 2012 12:14:45 GMT]]></title><description><![CDATA[<p>Könnte sein dass deine Implementierung den const char* in einen String konvertiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165235</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sun, 08 Jan 2012 12:14:45 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Fehler bei vollem Speicher on Sun, 08 Jan 2012 12:26:36 GMT]]></title><description><![CDATA[<p>Denke eher nicht, denn wenn ich diesen Code habe</p>
<pre><code class="language-cpp">inline void new_test (void *pointer, const char *function_name, char *reserved_memory){

	if (pointer == NULL){
		delete[] reserved_memory;
		std::cerr &lt;&lt; &quot;ERROR: memory allocation failed in function &quot; &lt;&lt; function_name &lt;&lt; std::endl;
		exit(EXIT_FAILURE);
	}

	return;
}
</code></pre>
<p>dann funktioniert es. D.h. wenn so eine Konversion stattfände, dürfte sie erst dann stattfinden, wenn function_name in cerr benutzt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165240</guid><dc:creator><![CDATA[plizzz]]></dc:creator><pubDate>Sun, 08 Jan 2012 12:26:36 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Fehler bei vollem Speicher on Sun, 08 Jan 2012 12:35:08 GMT]]></title><description><![CDATA[<p>Ich meinte dass bei der Ausgabe konvertiert wird. <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>Könnte a.) an einer affigen Implementierung liegen oder b.) daran, dass aus irgendeinem Grund kein operator&lt;&lt; für const char* verfügbar ist und der für std::string genommen wird, inklusive Konvertierung.</p>
<p>Versuch mal das hier:</p>
<pre><code class="language-cpp">inline void mem_test(void *pointer, const char *function_name)
    {
        if(!pointer)
        {
            char const* msg = &quot;ERROR: memory allocation failed in function &quot;;
            std::cerr.write(msg, strlen(msg));
            std::cerr.write(function_name, strlen(function_name));
            std::cerr.put('\n');
            std::cerr.flush();

            exit(EXIT_FAILURE);
        }
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2165247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165247</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sun, 08 Jan 2012 12:35:08 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Fehler bei vollem Speicher on Sun, 08 Jan 2012 12:39:38 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">inline void new_test (void *pointer, const char *function_name, char *reserved_memory){

	if (pointer == NULL){
		std::cerr &lt;&lt; &quot;ERROR: memory allocation failed in function &quot; &lt;&lt; function_name &lt;&lt; std::endl;
		delete[] reserved_memory;
		exit(EXIT_FAILURE);
	}

	return;
}
</code></pre>
<p>das sollte aber genauso nicht klappen, oder?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165252</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sun, 08 Jan 2012 12:39:38 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Fehler bei vollem Speicher on Sun, 08 Jan 2012 12:46:20 GMT]]></title><description><![CDATA[<p>genau.</p>
<p>Ich finde es eigentlich total gruselig, dass cerr überhaupt alokiert. Das heißt, dass es mit dieser Implementierung des C++ Standards keine ausfallsichere Fehlerausgabe gibt. ätzend. Würde ich fast unte rdie Kategorie &quot;bug&quot; einordnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165255</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 08 Jan 2012 12:46:20 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Fehler bei vollem Speicher on Sun, 08 Jan 2012 12:53:34 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>genau.</p>
<p>Ich finde es eigentlich total gruselig, dass cerr überhaupt alokiert. Das heißt, dass es mit dieser Implementierung des C++ Standards keine ausfallsichere Fehlerausgabe gibt. ätzend. Würde ich fast unte rdie Kategorie &quot;bug&quot; einordnen.</p>
</blockquote>
<p>Afaik gibt es sogar bool operator==(char const*) für std::string, die den char* erst einen String kopieren anstatt direkt strcmp aufzurufen. Keine Ahnung wie man auf so ne Idee kommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165260</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sun, 08 Jan 2012 12:53:34 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Fehler bei vollem Speicher on Sun, 08 Jan 2012 12:54:50 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>genau.</p>
<p>Ich finde es eigentlich total gruselig, dass cerr überhaupt alokiert. Das heißt, dass es mit dieser Implementierung des C++ Standards keine ausfallsichere Fehlerausgabe gibt. ätzend. Würde ich fast unte rdie Kategorie &quot;bug&quot; einordnen.</p>
</blockquote>
<p>Das scheint nicht das cerr-Objekt zu sein, sondern der Operator &lt;&lt;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165261</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 08 Jan 2012 12:54:50 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Fehler bei vollem Speicher on Sun, 08 Jan 2012 18:29:01 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Ich meinte dass bei der Ausgabe konvertiert wird. <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>Könnte a.) an einer affigen Implementierung liegen oder b.) daran, dass aus irgendeinem Grund kein operator&lt;&lt; für const char* verfügbar ist und der für std::string genommen wird, inklusive Konvertierung.</p>
<p>Versuch mal das hier:</p>
<pre><code class="language-cpp">inline void mem_test(void *pointer, const char *function_name)
    {
        if(!pointer)
        {
            char const* msg = &quot;ERROR: memory allocation failed in function &quot;;
            std::cerr.write(msg, strlen(msg));
            std::cerr.write(function_name, strlen(function_name));
            std::cerr.put('\n');
            std::cerr.flush();
            
            exit(EXIT_FAILURE);
        }
    }
</code></pre>
</blockquote>
<p>Das funktioniert leider auch nicht. Ist auch nicht allzu wichtig an sich (die Methode mit dem reservierten Speicher funktioniert, auch wenn sie nicht allzu schön ist), aber irgendwie schon interessant zu wissen, was da genau passiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165453</guid><dc:creator><![CDATA[plizzz]]></dc:creator><pubDate>Sun, 08 Jan 2012 18:29:01 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Fehler bei vollem Speicher on Sun, 08 Jan 2012 18:32:01 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>otze schrieb:</p>
<blockquote>
<p>genau.</p>
<p>Ich finde es eigentlich total gruselig, dass cerr überhaupt alokiert. Das heißt, dass es mit dieser Implementierung des C++ Standards keine ausfallsichere Fehlerausgabe gibt. ätzend. Würde ich fast unte rdie Kategorie &quot;bug&quot; einordnen.</p>
</blockquote>
<p>Das scheint nicht das cerr-Objekt zu sein, sondern der Operator &lt;&lt;.</p>
</blockquote>
<p>mit dem letzten Post hätten wir das jetzt ausgeschlossen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165454</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 08 Jan 2012 18:32:01 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Fehler bei vollem Speicher on Sun, 08 Jan 2012 18:51:14 GMT]]></title><description><![CDATA[<p>vlt das char const * str = &quot;ERROR: ....&quot; ? Allokiert das Speicher?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165467</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Sun, 08 Jan 2012 18:51:14 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Fehler bei vollem Speicher on Sun, 08 Jan 2012 19:05:12 GMT]]></title><description><![CDATA[<p>pyhax schrieb:</p>
<blockquote>
<p>vlt das char const * str = &quot;ERROR: ....&quot; ? Allokiert das Speicher?</p>
</blockquote>
<p>So ungefähr sizeof(char*). Auf dem Stack. Außerdem noch zwei weitere Zeiger für die Funktionsparameter und ein paar weitere Verwaltungsdaten. Wenn auf dem Stack nicht mal mehr 50-100 Byte frei sind, hat man natürlich ein Problem. Ich weiß jetzt nicht genau, was der Threadersteller für ein System hat und selbst wenn, dann wüsste ich nicht, wie dieses genau arbeitet. Aber da der Heap von Unten wächst und der Stack von Oben, kann durchaus sein, dass dies nicht mehr funktioniert, sofern wirklich alles bis auf's letzte Byte voll ist. Oder gibt es Systeme, in denen Speicher für den Stack im Voraus reserviert ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165471</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 08 Jan 2012 19:05:12 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Fehler bei vollem Speicher on Mon, 09 Jan 2012 01:13:55 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Oder gibt es Systeme, in denen Speicher für den Stack im Voraus reserviert ist?</p>
</blockquote>
<p>Ich kenne eigentlich nur solche Systeme.<br />
Bzw. zumindest der Adressraum ist reserviert.<br />
Und wenn der Adressraum des Stack nicht mehr mit Speicher hinterlegt werden kann, dann bekommt man keinen std::bad_alloc. Was auch immer dann passiert, das OS behandelt den Fall selbst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165619</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 09 Jan 2012 01:13:55 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Fehler bei vollem Speicher on Mon, 09 Jan 2012 08:53:02 GMT]]></title><description><![CDATA[<p>Es ist nicht davon auszugehen, dass ganz zu Programmbeginn angelegter Speicher in der Nähe des Stacks liegt, und die Freigabe dürfte ja hier nur dann passieren, wenn der Speicher bereits voll ist.</p>
<p>Ich habe den Streambuffer von std::cerr im Verdacht, möchte aber nicht ausschließen, dass die Ursache noch tiefer liegt - wo kein Speicher mehr ist, kann viel daneben gehen. Vielleicht wäre es einen Versuch wert, statt std::cerr mal puts bzw. fputs zu bemühen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165663</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 09 Jan 2012 08:53:02 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Fehler bei vollem Speicher on Mon, 09 Jan 2012 09:01:42 GMT]]></title><description><![CDATA[<p>Ich würde auch eher auf den Streambuffer tippen, als auf den Ausgabeoperator.<br />
Mit dem Debugger Reinsteppen könnte Klarheit bringen.</p>
<p>Wenn man ganz sicher gehen will: selbst Ausgabefunktionen mit der native OS API (win32, ...) programmieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165665</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 09 Jan 2012 09:01:42 GMT</pubDate></item></channel></rss>