<?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[speicher reservierung mit pointern]]></title><description><![CDATA[<p>hi,<br />
wenn ich speicher mithilfe eines pointers reserviere mit</p>
<pre><code>typ* pointer; 
pointer = new typ [n]
</code></pre>
<p>wird dann nach einer adresse gesucht die n freie speicherplätze der größe typ direkt nach sich hat und diese speicherplätze werden reserviert oder baut sich alles direkt übereinander auf?</p>
<p>wenn sich alles direkt nacheinander aufbaut kann es ja durch späteres freigeben von speicher durch delete oder casts oder ähnliches zu größeren lücken kommen die wieder aufgefüllt werden sollten um den speicher effektiv zu nutzen. kann man den speicher dann irgendwie zusammenschieben oder in folgendem beispiel z.b. etwas der größe 2 in -- packen statt nach dem xxx?</p>
<pre><code>xxxx--xxx------------
(x = nicht verfügbar, - = verfügbar)
</code></pre>
<p>und ist es möglich/sinnvoll einen teil der reservierung die man nicht mehr braucht freizugeben aber nicht alles? (ohne eine komplett neue adresse zu bekommen und alles kopieren zu müssen).</p>
<p>Ich habe schon ausprobiert</p>
<pre><code>pointer = new int [a];
//... beschreiben ... 
pointer = new int [a-b];
//... auslesen ...
</code></pre>
<p>edit: das hat nicht funktioniert wie ich es mir vorstellte ^^<br />
und z.b. *(pointer[a-2])=5; gab error, war also anscheinend noch reserviert.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285004/speicher-reservierung-mit-pointern</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 17:00:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285004.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 12 Apr 2011 17:13:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to speicher reservierung mit pointern on Tue, 12 Apr 2011 17:22:14 GMT]]></title><description><![CDATA[<p>hi,<br />
wenn ich speicher mithilfe eines pointers reserviere mit</p>
<pre><code>typ* pointer; 
pointer = new typ [n]
</code></pre>
<p>wird dann nach einer adresse gesucht die n freie speicherplätze der größe typ direkt nach sich hat und diese speicherplätze werden reserviert oder baut sich alles direkt übereinander auf?</p>
<p>wenn sich alles direkt nacheinander aufbaut kann es ja durch späteres freigeben von speicher durch delete oder casts oder ähnliches zu größeren lücken kommen die wieder aufgefüllt werden sollten um den speicher effektiv zu nutzen. kann man den speicher dann irgendwie zusammenschieben oder in folgendem beispiel z.b. etwas der größe 2 in -- packen statt nach dem xxx?</p>
<pre><code>xxxx--xxx------------
(x = nicht verfügbar, - = verfügbar)
</code></pre>
<p>und ist es möglich/sinnvoll einen teil der reservierung die man nicht mehr braucht freizugeben aber nicht alles? (ohne eine komplett neue adresse zu bekommen und alles kopieren zu müssen).</p>
<p>Ich habe schon ausprobiert</p>
<pre><code>pointer = new int [a];
//... beschreiben ... 
pointer = new int [a-b];
//... auslesen ...
</code></pre>
<p>edit: das hat nicht funktioniert wie ich es mir vorstellte ^^<br />
und z.b. *(pointer[a-2])=5; gab error, war also anscheinend noch reserviert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048226</guid><dc:creator><![CDATA[Halozination]]></dc:creator><pubDate>Tue, 12 Apr 2011 17:22:14 GMT</pubDate></item><item><title><![CDATA[Reply to speicher reservierung mit pointern on Tue, 12 Apr 2011 17:17:26 GMT]]></title><description><![CDATA[<p>Halozination schrieb:</p>
<blockquote>
<pre><code>pointer = new int [a];
//... beschreiben ... 
pointer = new int [a-b]
//... auslesen ...
</code></pre>
</blockquote>
<p>sollte heissen</p>
<pre><code class="language-cpp">pointer = new int[a];
//... beschreiben ... 
int* temp = new int[a - b];
for(unsigned c = 0; c &lt; a - b; c++)
  temp[c] = pointer[c];

delete[] pointer;
pointer = temp;
temp = nullptr;
//... auslesen ...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2048230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048230</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Tue, 12 Apr 2011 17:17:26 GMT</pubDate></item><item><title><![CDATA[Reply to speicher reservierung mit pointern on Tue, 12 Apr 2011 17:21:04 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Halozination schrieb:</p>
<blockquote>
<pre><code>pointer = new int [a];
//... beschreiben ... 
pointer = new int [a-b]
//... auslesen ...
</code></pre>
</blockquote>
<p>sollte heissen</p>
<pre><code class="language-cpp">pointer = new int[a];
//... beschreiben ... 
int* temp = new int[a - b];
for(unsigned c = 0; c &lt; a - b; c++)
  temp[c] = pointer[c];

delete[] pointer;
pointer = temp;
temp = nullptr;
//... auslesen ...
</code></pre>
</blockquote>
<blockquote>
<p>(ohne eine komplett neue adresse zu bekommen und alles kopieren zu müssen).</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2048234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048234</guid><dc:creator><![CDATA[Halozination]]></dc:creator><pubDate>Tue, 12 Apr 2011 17:21:04 GMT</pubDate></item><item><title><![CDATA[Reply to speicher reservierung mit pointern on Tue, 12 Apr 2011 17:23:08 GMT]]></title><description><![CDATA[<p>Halozination schrieb:</p>
<blockquote>
<p>ohne eine komplett neue adresse zu bekommen und alles kopieren zu müssen</p>
</blockquote>
<p>Aha, nein. Ich lese eigentlich keinen Text, dessen Autor die deutsche Sprache nicht umsetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048236</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Tue, 12 Apr 2011 17:23:08 GMT</pubDate></item><item><title><![CDATA[Reply to speicher reservierung mit pointern on Tue, 12 Apr 2011 17:23:47 GMT]]></title><description><![CDATA[<p>Wie genau die Speicherverwaltung arbeitet, ist nicht festgelegt. Aber ich würde schon davon ausgehen, daß sie sich bemüht, unnötige Speicher-Fragmentierung zu vermeiden. Zusammenschieben kann sie die Speicherbereiche allerdings nicht, schließlich müssen die einmal reservierten Speicherbereiche weiterhin erreichbar bleiben, bis sie wieder freigegeben werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048237</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 12 Apr 2011 17:23:47 GMT</pubDate></item><item><title><![CDATA[Reply to speicher reservierung mit pointern on Tue, 12 Apr 2011 17:32:20 GMT]]></title><description><![CDATA[<p>Halozination schrieb:</p>
<blockquote>
<p>hi,<br />
wenn ich speicher mithilfe eines pointers reserviere mit</p>
<pre><code>typ* pointer; 
pointer = new typ [n]
</code></pre>
<p>wird dann nach einer adresse gesucht die n freie speicherplätze der größe typ direkt nach sich hat und diese speicherplätze werden reserviert oder baut sich alles direkt übereinander auf?</p>
<p>wenn sich alles direkt nacheinander aufbaut kann es ja durch späteres freigeben von speicher durch delete oder casts oder ähnliches zu größeren lücken kommen die wieder aufgefüllt werden sollten um den speicher effektiv zu nutzen.</p>
</blockquote>
<p>Das ist zwar strenggenommen plattformabhängig, aber ja: So wird das in der Regel gemacht und der Effekt den du beschreibst kann dann auch auftreten.</p>
<blockquote>
<p>kann man den speicher dann irgendwie zusammenschieben oder in folgendem beispiel z.b. etwas der größe 2 in -- packen statt nach dem xxx?</p>
<pre><code>xxxx--xxx------------
(x = nicht verfügbar, - = verfügbar)
</code></pre>
<p>und ist es möglich/sinnvoll einen teil der reservierung die man nicht mehr braucht freizugeben aber nicht alles? (ohne eine komplett neue adresse zu bekommen und alles kopieren zu müssen).</p>
<p>Ich habe schon ausprobiert</p>
<pre><code>pointer = new int [a];
//... beschreiben ... 
pointer = new int [a-b];
//... auslesen ...
</code></pre>
<p>edit: das hat nicht funktioniert wie ich es mir vorstellte ^^<br />
und z.b. *(pointer[a-2])=5; gab error, war also anscheinend noch reserviert.</p>
</blockquote>
<p>Die übliche Vorgehensweise wenn man solche Probleme hat und man meint, diese durch Nutzung von Zusatzinformation über das Programmverhalten umgehen zu können, ist das Schreiben eines eigenen Speichermanagers. Dieser wird dann üblicherweise erst einmal einen ausreichend großen Block Speicher auf &quot;normale&quot; Weise für seine Zwecke anfordern (oder je nach Bedarf mehr) und dann kann dein Programm sich an diesen Speichermanager wenden und dieser führt dann solche optimierten Speicheranforderungen aus.</p>
<p>Es gibt dafür sicherlich auch schon fertige Lösungen, weil Speicherfragmentierung durchaus ein Problem sein kann bei lang laufenden Servern. Es gibt soweit ich weiß auch Schlater, mit denen man die Allokationsstrategie des Betriebssystems anpassen kann, so dass man eventuell gar nicht die Indirektion über den eigenen Allokator benötigt. Wie genau, ist natürlich plattformabhängig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048240</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 12 Apr 2011 17:32:20 GMT</pubDate></item></channel></rss>