<?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[Was wird davon alles freigegeben]]></title><description><![CDATA[<p>Ich hab mal ein paar Szenarien zur Speicherverwaltung und da ich die Funktionsweise teilweise sehr widersprüchlich lese wollte ich mal wissen welche der folgenden Szenarien alles löschen und welche Speicherlecks hinterlassen:<br />
a)<br />
char* a = (char*) calloc(10, sizeof(1));<br />
free(a);<br />
b)<br />
char* a = (char*) malloc(sizeof(int));<br />
free(a);<br />
c)<br />
int* a = (int*)malloc(sizeof(char));<br />
free(a);<br />
d)<br />
int* a = new char(3);<br />
delete a;<br />
e)<br />
class A<br />
{<br />
int a, b, c;<br />
};<br />
class B : public A<br />
{<br />
int d, e;<br />
};<br />
[...]<br />
A* a = (A*)new B();<br />
delete a;</p>
<p>Wär ganz nett wenn mir jemand sagen könnte welche Lecks hinterlassen und vor allem warum.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/200654/was-wird-davon-alles-freigegeben</link><generator>RSS for Node</generator><lastBuildDate>Sun, 04 Oct 2026 23:32:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/200654.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 17 Dec 2007 22:56:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Was wird davon alles freigegeben on Mon, 17 Dec 2007 22:56:12 GMT]]></title><description><![CDATA[<p>Ich hab mal ein paar Szenarien zur Speicherverwaltung und da ich die Funktionsweise teilweise sehr widersprüchlich lese wollte ich mal wissen welche der folgenden Szenarien alles löschen und welche Speicherlecks hinterlassen:<br />
a)<br />
char* a = (char*) calloc(10, sizeof(1));<br />
free(a);<br />
b)<br />
char* a = (char*) malloc(sizeof(int));<br />
free(a);<br />
c)<br />
int* a = (int*)malloc(sizeof(char));<br />
free(a);<br />
d)<br />
int* a = new char(3);<br />
delete a;<br />
e)<br />
class A<br />
{<br />
int a, b, c;<br />
};<br />
class B : public A<br />
{<br />
int d, e;<br />
};<br />
[...]<br />
A* a = (A*)new B();<br />
delete a;</p>
<p>Wär ganz nett wenn mir jemand sagen könnte welche Lecks hinterlassen und vor allem warum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1422327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422327</guid><dc:creator><![CDATA[Ankou]]></dc:creator><pubDate>Mon, 17 Dec 2007 22:56:12 GMT</pubDate></item><item><title><![CDATA[Reply to Was wird davon alles freigegeben on Mon, 17 Dec 2007 23:06:17 GMT]]></title><description><![CDATA[<p>a-d hinterlassen keine Leaks. e erzeugt undefiniertes Verhalten, weil A keinen virtuellen Destruktor hat. Wenn es compilieren würde, weil B auch keinen public Konstruktor hat <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>edit: tja, d compiliert auch nicht, aber würde, wenn, kein Leak hinterlassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1422329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422329</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 17 Dec 2007 23:06:17 GMT</pubDate></item><item><title><![CDATA[Reply to Was wird davon alles freigegeben on Mon, 17 Dec 2007 23:26:27 GMT]]></title><description><![CDATA[<p>mhm, bei d fehlt ein Typecast, aber gut.<br />
Also ist die Größe des reservierten Speichers unwichtig und nur die Destruktoren zählen? Wird bei Fall b oder dessen new/delete Äquivalent auch wirklich nicht nur 1 Byte gelöscht?<br />
wie siehts damit aus?<br />
class A<br />
{<br />
int a, b, c;<br />
public:<br />
virtual ~A(void){}<br />
};<br />
class B : public A<br />
{<br />
int d, e;<br />
public:<br />
~B(void){}<br />
};<br />
[...]<br />
A* a = (A*)new B();<br />
delete a;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1422330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422330</guid><dc:creator><![CDATA[Ankou]]></dc:creator><pubDate>Mon, 17 Dec 2007 23:26:27 GMT</pubDate></item><item><title><![CDATA[Reply to Was wird davon alles freigegeben on Mon, 17 Dec 2007 23:33:50 GMT]]></title><description><![CDATA[<p>Ankou schrieb:</p>
<blockquote>
<p>mhm, bei d fehlt ein Typecast, aber gut.</p>
</blockquote>
<p>nanu? d ist korrekt einfach als</p>
<pre><code class="language-cpp">int* d = new int
</code></pre>
<blockquote>
<p>Also ist die Größe des reservierten Speichers unwichtig und nur die Destruktoren zählen?</p>
</blockquote>
<p>es ist wohl etwas unklar, welche antwort du dir erwartest. die größe des reservierten speichers ist nur als unterscheidung zwischen der allokation einzelner objekte und arrays wichtig. im einen fall nimmst du new/delete und im anderen new[]/delete[]. auf die größe kommt es aber direkt tatsächlich nicht an.</p>
<blockquote>
<p>wie siehts damit aus?<br />
class A<br />
{<br />
int a, b, c;<br />
public:<br />
virtual ~A(void){}<br />
};<br />
class B : public A<br />
{<br />
int d, e;<br />
public:<br />
~B(void){}<br />
};<br />
[...]<br />
A* a = (A*)new B();<br />
delete a;</p>
</blockquote>
<p>kein speicherleck, alles gelöscht, was gelöscht werden soll. /edit: allerdings wird die konvertierung von B nach A automatisch übernommen. solche (C-style) casts solltest du in C++ allerdings sowieso nicht verwenden. entweder static_cast oder - in diesem fall - gar keinen:</p>
<pre><code class="language-cpp">A* a = new B;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1422332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422332</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Mon, 17 Dec 2007 23:33:50 GMT</pubDate></item><item><title><![CDATA[Reply to Was wird davon alles freigegeben on Tue, 18 Dec 2007 09:21:34 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>a-d hinterlassen keine Leaks. e erzeugt undefiniertes Verhalten, weil A keinen virtuellen Destruktor hat. Wenn es compilieren würde, weil B auch keinen public Konstruktor hat <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>
</blockquote>
<p>Klar hat B einen public Ctor - du siehst ihn nur nicht <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="😉"
    /> (der Compiler spendiert jeder Klasse einen impliziten Default-Ctor, Copy-Ctor, op= und Dtor, die alle public gesetzt sind (den Default-Ctor nur, wenn du keinen benutzerdefinierten hast))</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16411">@Ankou</a>: Variante (c) compiliert zwar, dürfte dir aber Probleme bereiten, wenn du etwas mit dem Speicher machen willst:</p>
<pre><code class="language-cpp">int* a = (int*)malloc(sizeof(char));
*a = 4711;//BUMM
free(a);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1422417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422417</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 18 Dec 2007 09:21:34 GMT</pubDate></item><item><title><![CDATA[Reply to Was wird davon alles freigegeben on Tue, 18 Dec 2007 12:49:37 GMT]]></title><description><![CDATA[<p>ok danke.<br />
Btw, steht im Default Konstruktor mehr drin als wenn ich einen mit {} erstelle?<br />
@queerboy:<br />
da stand schon absichtlich new char. Das is das selbe wie c) nur im new/delete Paket. Aber wenn c geht, wird wohl auch d gehen, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1422546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422546</guid><dc:creator><![CDATA[Ankou]]></dc:creator><pubDate>Tue, 18 Dec 2007 12:49:37 GMT</pubDate></item><item><title><![CDATA[Reply to Was wird davon alles freigegeben on Tue, 18 Dec 2007 12:54:03 GMT]]></title><description><![CDATA[<p>Ankou schrieb:</p>
<blockquote>
<p>ok danke.<br />
Btw, steht im Default Konstruktor mehr drin als wenn ich einen mit {} erstelle?</p>
</blockquote>
<p>nein.</p>
<blockquote>
<p>@queerboy:<br />
da stand schon absichtlich new char. Das is das selbe wie c) nur im new/delete Paket. Aber wenn c geht, wird wohl auch d gehen, oder?</p>
</blockquote>
<p>nein, tut es nicht - bei Variante c hast du noch einen Cast drin, bei Variante d nicht (und char* und int* sind nicht miteinander kompatibel). Und selbst mit einem Cast hättest du da effektiv das selbe Problem wie bei Variante c - BUMM!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1422549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422549</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 18 Dec 2007 12:54:03 GMT</pubDate></item><item><title><![CDATA[Reply to Was wird davon alles freigegeben on Tue, 18 Dec 2007 12:56:50 GMT]]></title><description><![CDATA[<p>Dass ich in den Pointer möglichst nichts schreiben sollte is mir schon klar^^<br />
War ja auch rein theoretisch...<br />
und zu dem Typecast:</p>
<blockquote>
<p>Ankou schrieb:<br />
mhm, bei d fehlt ein Typecast, aber gut.</p>
<p>nanu? d ist korrekt einfach als int* d = new int</p>
</blockquote>
<p>Deswegen hab ich das gesagt. Dass da ein Typecast fehlt hab ich ja gesagt <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/1422551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422551</guid><dc:creator><![CDATA[Ankou]]></dc:creator><pubDate>Tue, 18 Dec 2007 12:56:50 GMT</pubDate></item><item><title><![CDATA[Reply to Was wird davon alles freigegeben on Tue, 18 Dec 2007 13:21:20 GMT]]></title><description><![CDATA[<p>also dir geht es nur darum, zu wissen, ob delete genausoviel speicher freigibt, wie mit new angefordert wurde? dann ja. dito bei *alloc &amp; free. bei new und delete musst du dann nur bei den jeweiligen versionen für arrays aufpassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1422569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422569</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Tue, 18 Dec 2007 13:21:20 GMT</pubDate></item></channel></rss>