<?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[Wie gibt man eine verkettete Struktur nach malloc frei ?]]></title><description><![CDATA[<p>Hallo, ich verwende gerade die IPHelper API, und hole mir die Netwerk MAC Adresse daraus.<br />
Nun habe ich eine Frage zu den komischen Strukturen:</p>
<pre><code>PIP_ADAPTER_INFO pAdInfo = NULL;
	GetAdaptersInfo(pAdInfo, &amp;buflen);
</code></pre>
<p>Ich bekomme &quot;einen&quot; Pointer auf eine PIP_ADAPTER_INFO Struktur aber am Anfang dieser Struktur einen weiteren Pointer auf eine weitere PIP_ADAPTER_INFO Struktur des nächsten Netzwerkadapters.<br />
In der MSDN wird der erste Pointer gespeichert und am Schluss mit Free() freigegeben, aber das kann doch nicht sein.<br />
Ich denke doch mal die Größe des ersten Pointers ist sizeof(PIP_ADAPTER_INFO), hat ja auch die Deklariation wie oben.<br />
Müsste man hier nicht nach jedem -&gt;Next Pointer den vorliegenden Pointer mit free() behandeln ?</p>
<pre><code>typedef struct _IP_ADAPTER_INFO {
  struct _IP_ADAPTER_INFO {
  }* Next;
  DWORD ComboIndex;
  char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
  char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
  UINT AddressLength;
  BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
  DWORD Index;
  UINT Type;
  UINT DhcpEnabled;
  PIP_ADDR_STRING CurrentIpAddress;
  IP_ADDR_STRING IpAddressList;
  IP_ADDR_STRING GatewayList;
  IP_ADDR_STRING DhcpServer;
  BOOL HaveWins;
  IP_ADDR_STRING PrimaryWinsServer;
  IP_ADDR_STRING SecondaryWinsServer;
  time_t LeaseObtained;
  time_t LeaseExpires;
} IP_ADAPTER_INFO, 
 *PIP_ADAPTER_INFO;
</code></pre>
<p><a href="http://msdn.microsoft.com/en-us/library/aa365917(VS.85).aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/aa365917(VS.85).aspx</a></p>
<p>Grüße<br />
Thenoname</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/218253/wie-gibt-man-eine-verkettete-struktur-nach-malloc-frei</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 04:39:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/218253.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 18 Jul 2008 06:56:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie gibt man eine verkettete Struktur nach malloc frei ? on Fri, 18 Jul 2008 07:26:58 GMT]]></title><description><![CDATA[<p>Hallo, ich verwende gerade die IPHelper API, und hole mir die Netwerk MAC Adresse daraus.<br />
Nun habe ich eine Frage zu den komischen Strukturen:</p>
<pre><code>PIP_ADAPTER_INFO pAdInfo = NULL;
	GetAdaptersInfo(pAdInfo, &amp;buflen);
</code></pre>
<p>Ich bekomme &quot;einen&quot; Pointer auf eine PIP_ADAPTER_INFO Struktur aber am Anfang dieser Struktur einen weiteren Pointer auf eine weitere PIP_ADAPTER_INFO Struktur des nächsten Netzwerkadapters.<br />
In der MSDN wird der erste Pointer gespeichert und am Schluss mit Free() freigegeben, aber das kann doch nicht sein.<br />
Ich denke doch mal die Größe des ersten Pointers ist sizeof(PIP_ADAPTER_INFO), hat ja auch die Deklariation wie oben.<br />
Müsste man hier nicht nach jedem -&gt;Next Pointer den vorliegenden Pointer mit free() behandeln ?</p>
<pre><code>typedef struct _IP_ADAPTER_INFO {
  struct _IP_ADAPTER_INFO {
  }* Next;
  DWORD ComboIndex;
  char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
  char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
  UINT AddressLength;
  BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
  DWORD Index;
  UINT Type;
  UINT DhcpEnabled;
  PIP_ADDR_STRING CurrentIpAddress;
  IP_ADDR_STRING IpAddressList;
  IP_ADDR_STRING GatewayList;
  IP_ADDR_STRING DhcpServer;
  BOOL HaveWins;
  IP_ADDR_STRING PrimaryWinsServer;
  IP_ADDR_STRING SecondaryWinsServer;
  time_t LeaseObtained;
  time_t LeaseExpires;
} IP_ADAPTER_INFO, 
 *PIP_ADAPTER_INFO;
</code></pre>
<p><a href="http://msdn.microsoft.com/en-us/library/aa365917(VS.85).aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/aa365917(VS.85).aspx</a></p>
<p>Grüße<br />
Thenoname</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549152</guid><dc:creator><![CDATA[thenoname]]></dc:creator><pubDate>Fri, 18 Jul 2008 07:26:58 GMT</pubDate></item><item><title><![CDATA[Reply to Wie gibt man eine verkettete Struktur nach malloc frei ? on Fri, 18 Jul 2008 07:12:01 GMT]]></title><description><![CDATA[<p>Warum? Hier wird nur eine verkettete Liste aufgebaut. Wenn es keinen weiteren Adapter gibt, ist der Next-Pointer NULL. Das Free kommt nur, wenn die nächste Adapterstruktur auch vorhanden ist:</p>
<pre><code>if (pAdapterInfo)
        FREE(pAdapterInfo);

    return 0;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1549161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549161</guid><dc:creator><![CDATA[Elektronix]]></dc:creator><pubDate>Fri, 18 Jul 2008 07:12:01 GMT</pubDate></item><item><title><![CDATA[Reply to Wie gibt man eine verkettete Struktur nach malloc frei ? on Fri, 18 Jul 2008 07:16:44 GMT]]></title><description><![CDATA[<p>Wird denn die malloc Größe zum Freigeben verwendet oder die Größe/Länge &quot;einer&quot; Struktur ?</p>
<p>ps. so wie du oben schreibst, hätte ich es gemacht, aber die MSDN nimmt den &quot;Ersten&quot; Pointer und befreit nicht jede Struktur die != NULL ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549162</guid><dc:creator><![CDATA[thenoname]]></dc:creator><pubDate>Fri, 18 Jul 2008 07:16:44 GMT</pubDate></item><item><title><![CDATA[Reply to Wie gibt man eine verkettete Struktur nach malloc frei ? on Fri, 18 Jul 2008 07:25:53 GMT]]></title><description><![CDATA[<p>thenoname schrieb:</p>
<blockquote>
<p>Wird denn die malloc Größe zum Freigeben verwendet oder die Größe/Länge &quot;einer&quot; Struktur ?</p>
</blockquote>
<p>malloc/free wissen nichts von Strukturen.</p>
<p>thenoname schrieb:</p>
<blockquote>
<p>ps. so wie du oben schreibst, hätte ich es gemacht, aber die MSDN nimmt den &quot;Ersten&quot; Pointer und befreit nicht jede Struktur die != NULL ist.</p>
</blockquote>
<p>Das Beispiel in der MSDN Library holt <strong>zunächst</strong> einen Puffer in der Größe <em>einer</em> Struktur, um die tatsächlich benötigte Größe zu ermitteln. Danach wird dieser Puffer freigegeben, und ein neuer in der passenden Größe geholt (das 2. malloc).</p>
<p>Der zweite Puffer wird allerdings nicht wieder freigegeben (Speicherleck).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549169</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 18 Jul 2008 07:25:53 GMT</pubDate></item><item><title><![CDATA[Reply to Wie gibt man eine verkettete Struktur nach malloc frei ? on Fri, 18 Jul 2008 07:36:41 GMT]]></title><description><![CDATA[<p>nönönö,</p>
<p>pAdapter = pAdapterInfo;</p>
<p>der pAdapter geht durch alle Verkettungen, der pAdapterInfo wird am Schluss mit:</p>
<pre><code>if (pAdapterInfo)
        FREE(pAdapterInfo);
</code></pre>
<p>freigegeben.<br />
Er wird nicht einmal annähernd dieser Pointer pAdapterInfo angefasst.<br />
pAdapterInfo hat zudem nicht die Größe &quot;einer&quot; Struktur sondern die Buffergröße. (laut dem malloc)</p>
<p>ps. erstes malloc ist klar zum Größe ermitteln !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549172</guid><dc:creator><![CDATA[thenoname]]></dc:creator><pubDate>Fri, 18 Jul 2008 07:36:41 GMT</pubDate></item><item><title><![CDATA[Reply to Wie gibt man eine verkettete Struktur nach malloc frei ? on Fri, 18 Jul 2008 07:38:02 GMT]]></title><description><![CDATA[<p>thenoname schrieb:</p>
<blockquote>
<p>nönönö,</p>
<p>pAdapter = pAdapterInfo;</p>
<p>der pAdapter geht durch alle Verkettungen, der pAdapterInfo wird am Schluss mit:</p>
<pre><code>if (pAdapterInfo)
        FREE(pAdapterInfo);
</code></pre>
<p>freigegeben.</p>
</blockquote>
<p>Ok, ich hatte in meine lokale MSDN geschaut. Das aktuelle Beispiel im Web sieht so aus, wie du es beschreibst.</p>
<p>thenoname schrieb:</p>
<blockquote>
<p>Er wird nicht einmal annähernd dieser Pointer pAdapterInfo angefasst.</p>
</blockquote>
<p>Muss ja auch nicht. Der Zeiger wird nur noch zum Freigeben gebraucht.</p>
<p>thenoname schrieb:</p>
<blockquote>
<p>pAdapterInfo hat zudem nicht die Größe &quot;einer&quot; Struktur sondern die Buffergröße.</p>
</blockquote>
<p>Das ist ja auch der Sinn der Sache. GetAdaptersInfo schreibt die gesamte Liste in einen einzigen Puffer. Nur den musst du freigeben, denn nur den hast du alloziiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549177</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 18 Jul 2008 07:38:02 GMT</pubDate></item><item><title><![CDATA[Reply to Wie gibt man eine verkettete Struktur nach malloc frei ? on Fri, 18 Jul 2008 07:42:01 GMT]]></title><description><![CDATA[<p>Jo, danke, jetzt issses klar.</p>
<p>Was macht delete mypointer ?<br />
Wird hier nur der pointer = 4 Byte freigegeben ?<br />
Das muss ich doch nie tun = geht automatisch ?</p>
<p>Grüße<br />
thenoname</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549180</guid><dc:creator><![CDATA[thenoname]]></dc:creator><pubDate>Fri, 18 Jul 2008 07:42:01 GMT</pubDate></item><item><title><![CDATA[Reply to Wie gibt man eine verkettete Struktur nach malloc frei ? on Fri, 18 Jul 2008 07:46:15 GMT]]></title><description><![CDATA[<p>thenoname schrieb:</p>
<blockquote>
<p>Was macht delete mypointer ?</p>
</blockquote>
<p>Wenn mypointer auf etwas zeigt, das mit <em>new</em> alloziiert wurde, wird das, <em>worauf der Zeiger zeigt</em>, wieder freigegeben.</p>
<p>thenoname schrieb:</p>
<blockquote>
<p>Wird hier nur der pointer = 4 Byte freigegeben ?</p>
</blockquote>
<p>Nein. delete ändert den Zeiger selbst überhaupt nicht.</p>
<p>thenoname schrieb:</p>
<blockquote>
<p>Das muss ich doch nie tun = geht automatisch ?</p>
</blockquote>
<p>Das, was delete tut, passiert niemals automatisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549181</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 18 Jul 2008 07:46:15 GMT</pubDate></item><item><title><![CDATA[Reply to Wie gibt man eine verkettete Struktur nach malloc frei ? on Fri, 18 Jul 2008 07:47:29 GMT]]></title><description><![CDATA[<p>Ach und noch eine Frage <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>wenn ich einen Pointer mit malloc behandle habe ich ihn bei free() zum löschen<br />
mit der mit malloc definierten Größe.<br />
Was ist nun aber, wenn ich mittendrinn</p>
<pre><code>mystorepointer=mypointer;
</code></pre>
<p>benutze ? Werden die malloc Infos=Größe mittransferiert auf mystorepointer und ich<br />
kann hier einen free() ausführen oder hat die Größe nur mypointer ?</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549182</guid><dc:creator><![CDATA[thenoname]]></dc:creator><pubDate>Fri, 18 Jul 2008 07:47:29 GMT</pubDate></item><item><title><![CDATA[Reply to Wie gibt man eine verkettete Struktur nach malloc frei ? on Fri, 18 Jul 2008 07:48:34 GMT]]></title><description><![CDATA[<p>thenoname schrieb:</p>
<blockquote>
<p>Was ist nun aber, wenn ich mittendrinn</p>
<p>mystorepointer=mypointer;</p>
<p>benutze ?</p>
</blockquote>
<p>Welcher von den beiden zeigte auf mit malloc geholten Speicher?<br />
Wenn es mystorepointer war, hast du ein Speicherleck. Wenn es mypointer war, könntest du hinterher free mit jedem der beiden Zeiger aufrufem (aber nur mit einem).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549184</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 18 Jul 2008 07:48:34 GMT</pubDate></item><item><title><![CDATA[Reply to Wie gibt man eine verkettete Struktur nach malloc frei ? on Fri, 18 Jul 2008 07:53:20 GMT]]></title><description><![CDATA[<p>Sorry, ich malloc(e) vorher mypointer <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>Danke für die Antworten, jetzt habe ich es endlich mal kappiert !</p>
<p>Kann man &quot;new&quot; und malloc mischen ?</p>
<p>Also mit malloc Speicher holen und mit delete wieder freigeben ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549186</guid><dc:creator><![CDATA[thenoname]]></dc:creator><pubDate>Fri, 18 Jul 2008 07:53:20 GMT</pubDate></item><item><title><![CDATA[Reply to Wie gibt man eine verkettete Struktur nach malloc frei ? on Fri, 18 Jul 2008 07:58:47 GMT]]></title><description><![CDATA[<p>thenoname schrieb:</p>
<blockquote>
<p>Kann man &quot;new&quot; und malloc mischen ?</p>
<p>Also mit malloc Speicher holen und mit delete wieder freigeben ?</p>
</blockquote>
<p>Generell Nein. Es gibt bestimmte Situationen mit manchen Compilern, in denen das möglicherweise funktioniert. Lass dich aber auf so etwas nicht ein, weil das nicht vom Standard abgedeckt ist, und möglicherweise irgendwann nicht mehr funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549192</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 18 Jul 2008 07:58:47 GMT</pubDate></item><item><title><![CDATA[Reply to Wie gibt man eine verkettete Struktur nach malloc frei ? on Fri, 18 Jul 2008 08:07:35 GMT]]></title><description><![CDATA[<p>thenoname schrieb:</p>
<blockquote>
<p>wenn ich einen Pointer mit malloc behandle habe ich ihn bei free() zum löschen<br />
mit der mit malloc definierten Größe.<br />
Was ist nun aber, wenn ich mittendrinn</p>
<pre><code>mystorepointer=mypointer;
</code></pre>
<p>benutze ? Werden die malloc Infos=Größe mittransferiert auf mystorepointer und ich<br />
kann hier einen free() ausführen oder hat die Größe nur mypointer ?</p>
</blockquote>
<p>Das spielt gar keine Rolle! Der Zeiger selbst verweist auf den Speicher und ist in einem 32bit System 4Byte groß.<br />
Wichtig ist, dass Du den Sepciher eben genau einmal freigibst. Wie die Vraiable heißt spielt keine Rolle.</p>
<p>Technisch gesehen, wird einfach im Bereich Pointer-x ein Block mitgeführt in dem die Daten stehen. Wie das genau geht kannst Du einfach im CRT Sourcecode nachlesen, besonderrs interessant ist hier der Debug Code, der zusätzliche Plausis bietet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549196</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Fri, 18 Jul 2008 08:07:35 GMT</pubDate></item><item><title><![CDATA[Reply to Wie gibt man eine verkettete Struktur nach malloc frei ? on Fri, 18 Jul 2008 08:19:56 GMT]]></title><description><![CDATA[<blockquote>
<p>wird einfach im Bereich Pointer-x ein Block mitgeführt in dem die Daten stehen</p>
</blockquote>
<p>Das war mir bis jetzt eben nicht bekannt. Es werden also Informationen von malloc dort in diesen Block hineingeschrieben. Bis jetzt war ein Pointer für mich eben nur ein Zeiger = 4 Byte, der auf einen Speicherbereichanfang zeigt. Von Größeninformationen wie bei einem vector habe ich noch nichts gewusst.<br />
Man muss dann aber immer davon ausgehen, das z.B. ein char* mypointer mit 4 Charactern erzeugt mit malloc nicht 4 Byte gross ist sondern 4Byte + Informationen.</p>
<p>Free() muss dann diesen Block selbsständig finden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549200</guid><dc:creator><![CDATA[thenoname]]></dc:creator><pubDate>Fri, 18 Jul 2008 08:19:56 GMT</pubDate></item><item><title><![CDATA[Reply to Wie gibt man eine verkettete Struktur nach malloc frei ? on Fri, 18 Jul 2008 09:35:09 GMT]]></title><description><![CDATA[<p>thenoname schrieb:</p>
<blockquote>
<p>Das war mir bis jetzt eben nicht bekannt. Es werden also Informationen von malloc dort in diesen Block hineingeschrieben.</p>
</blockquote>
<p>Was dachtest Du wie der Heap organisiert wird. Er ist selbst eine Art verkette Struktur oder Baum. Zusätzlich werden oft genug Guard Bytesmit allokiert, die helfen bei der Analyse wenn Speicher über die Grenzen hinaus überschrieben wird.</p>
<p>thenoname schrieb:</p>
<blockquote>
<p>Bis jetzt war ein Pointer für mich eben nur ein Zeiger = 4 Byte, der auf einen Speicherbereichanfang zeigt.</p>
</blockquote>
<p>Nein! Es ist weitaus mehr. Wenn Du 4 Bytes allokierst gibt es IMHO 16 Bytes Overhead. Deshalb gibt ist auch eine Begrenzung nach unten. IMHO werden minimal 32 Bytes Speicher allokiert´. Aber das hängt vom Speicher Manager ab.</p>
<p>thenoname schrieb:</p>
<blockquote>
<p>Von Größeninformationen wie bei einem vector habe ich noch nichts gewusst.<br />
Man muss dann aber immer davon ausgehen, das z.B. ein char* mypointer mit 4 Charactern erzeugt mit malloc nicht 4 Byte gross ist sondern 4Byte + Informationen.</p>
</blockquote>
<p>Jupp!</p>
<p>thenoname schrieb:</p>
<blockquote>
<p>Free() muss dann diesen Block selbsständig finden.</p>
</blockquote>
<p>Nein! Du übergibst die Speicheradressse, die Du erhalten hast, -x Bytes beginnen bei einem korrekt allozierten Block eben die malloc/new Infos.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549249</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Fri, 18 Jul 2008 09:35:09 GMT</pubDate></item></channel></rss>