<?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[realloc liefert zu viel speicher]]></title><description><![CDATA[<p>folgendes:</p>
<pre><code class="language-cpp">char* string = 0;
//...
string = (char*) realloc (string, (get_upper_bound() + 1) * sizeof(char));
</code></pre>
<p>wobei get_upper_bound() den Wert 8 zurückliefert und string vorher 0 ist.<br />
nach der realloc anweisung sieht string wie folgt aus</p>
<pre><code>string = &quot;ÍÍÍÍÍÍÍÍÍýýýý««««««««þîþ&quot;
</code></pre>
<p>hat also viel zu viel speicherplatz bekommen, aber ich weiß nicht warum. vllt hat ja jemand ne ahnung woran es liegen könnte, danke schon mal im voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/182038/realloc-liefert-zu-viel-speicher</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 17:35:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/182038.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 20 May 2007 17:18:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Sun, 20 May 2007 17:18:25 GMT]]></title><description><![CDATA[<p>folgendes:</p>
<pre><code class="language-cpp">char* string = 0;
//...
string = (char*) realloc (string, (get_upper_bound() + 1) * sizeof(char));
</code></pre>
<p>wobei get_upper_bound() den Wert 8 zurückliefert und string vorher 0 ist.<br />
nach der realloc anweisung sieht string wie folgt aus</p>
<pre><code>string = &quot;ÍÍÍÍÍÍÍÍÍýýýý««««««««þîþ&quot;
</code></pre>
<p>hat also viel zu viel speicherplatz bekommen, aber ich weiß nicht warum. vllt hat ja jemand ne ahnung woran es liegen könnte, danke schon mal im voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1288591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1288591</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Sun, 20 May 2007 17:18:25 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Sun, 20 May 2007 17:45:47 GMT]]></title><description><![CDATA[<ol>
<li>ist das eher ein C problem und kein C++ problem. in C++ verwendest du new.</li>
<li>was erwartest du das in dem string drinnen steht ? wenn du 8 bytes allokierst, bedeutet das das du nur die 8 bytes verwenden darfst, da du sonst in fremden oder nicht allokierten speicher reinschreibst.</li>
</ol>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1288620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1288620</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sun, 20 May 2007 17:45:47 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Sun, 20 May 2007 17:57:21 GMT]]></title><description><![CDATA[<p>FreakyBKA schrieb:</p>
<blockquote>
<p>nach der realloc anweisung sieht string wie folgt aus</p>
<pre><code>string = &quot;ÍÍÍÍÍÍÍÍÍýýýý««««««««þîþ&quot;
</code></pre>
<p>hat also viel zu viel speicherplatz bekommen, aber ich weiß nicht warum. vllt hat ja jemand ne ahnung woran es liegen könnte, danke schon mal im voraus.</p>
</blockquote>
<p>Du interpretierst die Ausgabe vollkommen falsch. Tatsächlich hast Du nur die ersten 9 Bytes allokiert und darfst auch nur diese Benutzen. Alles danach wären unerlauvter Speicherzugriff.</p>
<p>Aber... Ein String in C ist definiert als eine mit 0 terminierte Zeichenkette. Da der allokierte Speicher nicht automatisch auf 0 gesetzt wird, wird im Prinzip alles bis zur ersten zufälligen 0 im Speicher als String interpretiert.</p>
<p>Auch ist der String nicht vorher 0, sondern der Zeiger auf String ist 0. Solange der Zeiger 0 ist hat er naturgemäß auch keinen Inhalt... Durch realloc setzt du den Zeiger auf die Anfangsadresse des neu reservierten Speichers, mehr nicht... Der Inhalt dieses Speichers ist rein zufällig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1288631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1288631</guid><dc:creator><![CDATA[loskos]]></dc:creator><pubDate>Sun, 20 May 2007 17:57:21 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Sun, 20 May 2007 18:08:45 GMT]]></title><description><![CDATA[<p>Diese Ìs sind wahrscheinlich das Zeichen das zu dem Bit-pattern gehört mit welchem dein Compiler nicht initialisierten Speicher im Debug-Build kennzeichnet.<br />
Alles danach ist fremder Speicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1288639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1288639</guid><dc:creator><![CDATA[lolz]]></dc:creator><pubDate>Sun, 20 May 2007 18:08:45 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Sun, 20 May 2007 18:22:49 GMT]]></title><description><![CDATA[<p>also allokiere ich einfach 1 speicherplatz mehr und setze die letzte stelle auf '\0' und dann sollte es funktionieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1288646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1288646</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Sun, 20 May 2007 18:22:49 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Sun, 20 May 2007 18:42:29 GMT]]></title><description><![CDATA[<p>FreakyBKA schrieb:</p>
<blockquote>
<p>also allokiere ich einfach 1 speicherplatz mehr und setze die letzte stelle auf '\0' und dann sollte es funktionieren?</p>
</blockquote>
<p>Nein, falsch. Sondern Du verwendest 'std::string'.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1288653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1288653</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sun, 20 May 2007 18:42:29 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Sun, 20 May 2007 18:46:38 GMT]]></title><description><![CDATA[<p>FreakyBKA schrieb:</p>
<blockquote>
<p>also allokiere ich einfach 1 speicherplatz mehr und setze die letzte stelle auf '\0' und dann sollte es funktionieren?</p>
</blockquote>
<p>ja. Es ist kein C-String wenn keine 0 am Ende ist! Aber ich würde dir auch eher zu std::string raten.</p>
<p>Ansonsten:<br />
1. sizeof(char) ist immer 1<br />
2. malloc/realloc/calloc/free benutzt man in C++ nicht mehr. Dafür benutzt man jetzt new</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1288659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1288659</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Sun, 20 May 2007 18:46:38 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Sun, 20 May 2007 20:15:18 GMT]]></title><description><![CDATA[<p>warum soll das falsch sein? das ist alles im rahmen einer eigenen string klasse, aber auch egal, es funktioniert jetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1288727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1288727</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Sun, 20 May 2007 20:15:18 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Sun, 20 May 2007 21:29:43 GMT]]></title><description><![CDATA[<p>FreakyBKA schrieb:</p>
<blockquote>
<p>warum soll das falsch sein? das ist alles im rahmen einer eigenen string klasse</p>
</blockquote>
<p>Dann kannst du 'eh die C-String Repräsentation für die Datenspeicherung verwerfen. Ein simples Array tut es da genauso und ist effizienter. Und *alloc/free solltest du trotzdem durch new/delete ersetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1288763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1288763</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sun, 20 May 2007 21:29:43 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Mon, 21 May 2007 10:41:54 GMT]]></title><description><![CDATA[<p>aber wenn ich new/delete verwende dann kann ich nicht mehr nachträglich den speicher vergrößern und muss jedesmal neues feld erstellen und kopieren. was genau ist denn gegen malloc/realloc/free einzuwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1288965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1288965</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Mon, 21 May 2007 10:41:54 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Mon, 21 May 2007 10:58:29 GMT]]></title><description><![CDATA[<p>malloc() und Co. arbeiten wunderbar - mit PoD-Typen. Aber sie haben keine Ahnung von Konstruktoren und dergleichen.</p>
<p>(und intern dürfte realloc auch nicht viel anders machen als einen neuen Speicherblock abzufordern und die Daten dort reinzukopieren - nur eventuell auf HW-Ebene besser optimiert)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1288975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1288975</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 21 May 2007 10:58:29 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Mon, 21 May 2007 13:47:38 GMT]]></title><description><![CDATA[<p>also in einen anderen Thread, wurde mir mal gesagt das realloc ersteinmal versucht den aktuellen speicher zu vergrößern und andernfalls neu allokiert. andere frage was sind denn PoD-Typen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1289104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1289104</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Mon, 21 May 2007 13:47:38 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Mon, 21 May 2007 13:50:03 GMT]]></title><description><![CDATA[<p>FreakyBKA schrieb:</p>
<blockquote>
<p>also in einen anderen Thread, wurde mir mal gesagt das realloc ersteinmal versucht den aktuellen speicher zu vergrößern und andernfalls neu allokiert.</p>
</blockquote>
<p>Korrekt. Und wenn man komplexe Speicheranforderung in C++ braucht, kann man Allokatoren verwenden.</p>
<blockquote>
<p>andere frage was sind denn PoD-Typen?</p>
</blockquote>
<p>Plain old data. Alles, was keine Klasse ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1289105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1289105</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Mon, 21 May 2007 13:50:03 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Mon, 21 May 2007 22:20:42 GMT]]></title><description><![CDATA[<p>Naja, das kommt darauf an was man unter einer Klasse versteht...</p>
<pre><code class="language-cpp">class Foo
{
public:
    int x;
    void sepp() { x++; }
};
</code></pre>
<p>-&gt; Foo ist ein POD.<br />
Die genauen Regeln weiss ich aber auch nimmer, müsste ich selbst nachgucken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1289487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1289487</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 21 May 2007 22:20:42 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Tue, 22 May 2007 06:17:32 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Die genauen Regeln weiss ich aber auch nimmer, müsste ich selbst nachgucken.</p>
</blockquote>
<p>Kurzfassung: POD ist alles, was du auch als C-struct übergeben kannst. Ausführlicher: Keine Konstruktoren oder Destruktoren, keine Ableitung, keine virtuellen Methoden, keine privaten Elemente. (und natürlich müssen alle Member ebenfalls POD's oder built-in Typen sein)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1289545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1289545</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 22 May 2007 06:17:32 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Tue, 22 May 2007 18:16:00 GMT]]></title><description><![CDATA[<p>Danke. z.B. bei Konstruktoren und non-public Members war ich mir nicht sicher -- würde ja eigentlich nicht stören.<br />
Andere Frage... ist das noch ein POD:</p>
<pre><code class="language-cpp">class foo
{
public:
    int x;
public:
    int y;
};
</code></pre>
<p>?<br />
Weil ja x und y im Speicher nicht so hintereinander liegen müssen (kann auch erst y und dann x kommen) soweit ich den Standard kenne/verstehe.<br />
Geht das nun trotzdem noch als POD durch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290093</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 22 May 2007 18:16:00 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Tue, 22 May 2007 18:44:00 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Danke. z.B. bei Konstruktoren und non-public Members war ich mir nicht sicher -- würde ja eigentlich nicht stören.</p>
</blockquote>
<p>Huh? Na gerade der Konstruktor macht doch einen riesigen Unterschied. Angenommen, man deklariert ein Feld von Objekten mit 1000 Einträgen. Wenn es sich um Non-PODs handelt, dann müssen 1000 Konstruktoren aufgerufen werden. Das kann für ganz erhebliche Performance-Unterschiede sorgen. Non-public-Members stören in der Tat nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290105</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Tue, 22 May 2007 18:44:00 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Tue, 22 May 2007 18:52:18 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Danke. z.B. bei Konstruktoren und non-public Members war ich mir nicht sicher -- würde ja eigentlich nicht stören.<br />
Andere Frage... ist das noch ein POD:</p>
<pre><code class="language-cpp">class foo
{
public:
    int x;
public:
    int y;
};
</code></pre>
<p>?<br />
Weil ja x und y im Speicher nicht so hintereinander liegen müssen (kann auch erst y und dann x kommen) soweit ich den Standard kenne/verstehe.<br />
Geht das nun trotzdem noch als POD durch?</p>
</blockquote>
<p>Ist immer noch ein POD. Die Umordnungsregel trifft PODs nicht, denn man könnte immer einen layout-kompatiblen Typen konstruieren, der ohne zusätzliche Zugriffsspezifikation auskommt.</p>
<p>Konstruktoren (&amp;Destruktoren) sind im Prinzip der wichtigste Faktor, der zu nicht-PODs führt: ohne Konstruktor haben wir nur eine Anhäufung von Daten ohne inneren Zusammenhang - mithin auch keinerlei Invarianten, die während der Lebenszeit gelten könnten. Konstruktoren machen es erst möglich, dass aus einer bloßen Aggregation ein größeres Ganzes wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290113</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 22 May 2007 18:52:18 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Tue, 22 May 2007 19:19:20 GMT]]></title><description><![CDATA[<p>ZU dem Thema ne Frage, die mich schon länger beschäftigt: Warum gibt es kein C++-Equivalent zu realloc(). malloc() &lt;-&gt; new und free() &lt;-&gt;delet ist ja klar, aber realloc()? Immerhin würde man doch vielleicht mal ein Feld vergrößern wollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290127</guid><dc:creator><![CDATA[geloescht]]></dc:creator><pubDate>Tue, 22 May 2007 19:19:20 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Tue, 22 May 2007 19:35:12 GMT]]></title><description><![CDATA[<p>geloescht schrieb:</p>
<blockquote>
<p>ZU dem Thema ne Frage, die mich schon länger beschäftigt: Warum gibt es kein C++-Equivalent zu realloc(). malloc() &lt;-&gt; new und free() &lt;-&gt;delet ist ja klar, aber realloc()? Immerhin würde man doch vielleicht mal ein Feld vergrößern wollen.</p>
</blockquote>
<p>Weil C++ keine Abbildung von C mit neuen Worten ist. Für sich vergrößern wollende Felder gibt es so schöne Sachen wie std::vector&lt;T&gt;, die unter der Haube mit Allokatoren arbeiten die ähnliches wie realloc leisten dürften.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290136</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 22 May 2007 19:35:12 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Tue, 22 May 2007 19:51:23 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Weil C++ keine Abbildung von C mit neuen Worten ist. Für sich vergrößern wollende Felder gibt es so schöne Sachen wie std::vector&lt;T&gt;, die unter der Haube mit Allokatoren arbeiten die ähnliches wie realloc leisten dürften.</p>
</blockquote>
<p>Der standardmäßig verwendete Allokator dürfte wohl auch bloß new und delete benutzen (ist bei mir mit g++ 4.1.2 so). Besitzt eine normale Allokatorklasse überhaupt die Fähigkeit des Vergrößern bzw. Verkleinerns des Speicherbereichs? Und selbst wenn, es werden sich so keine system- und compilerunabhängige Allokatoren mit dieser Fähigkeit schreiben lassen: Die müssten entweder auf Betriebssystemfunktionen oder auf realloc() + manuelles Aufrufen des Konstruktors zurückgreifen. Hab Allokatoren noch nie benutzt, also lasse ich mich gerne eines Besseren belehren. &lt;nicht ganz ernst gemeinte ironie&gt; Schön, dass wir nochmal eine Abstraktionsschicht für die Speicherverwaltung haben, damit können wir jetzt unsere Abstraktionsschicht für die Abstraktion der Abstraktion abstrahieren ;)&lt;/ironie&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290151</guid><dc:creator><![CDATA[geloescht]]></dc:creator><pubDate>Tue, 22 May 2007 19:51:23 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Wed, 23 May 2007 06:34:38 GMT]]></title><description><![CDATA[<p>Nur am Rande: Die Allokatoren trennen sowieso die Speicheranforderung und Konstruktion von Objekten in zwei getrennte Methoden. (und ein vector&lt;&gt; verbessert seine Performance idR, indem er mehr Speicher anfordert als er aktuell benötigt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290320</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 23 May 2007 06:34:38 GMT</pubDate></item><item><title><![CDATA[Reply to realloc liefert zu viel speicher on Wed, 23 May 2007 07:43:56 GMT]]></title><description><![CDATA[<p>Ganz erlich, ich verwende so gut wie nie ein new[]. Eigentlich gar nicht. deswgen interessiere ich mihc eigentlich auhc nicht für eine realloc-Alternative.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290357</guid><dc:creator><![CDATA[Helium]]></dc:creator><pubDate>Wed, 23 May 2007 07:43:56 GMT</pubDate></item></channel></rss>