<?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[Speicherbefreiung nach curl-Funktion]]></title><description><![CDATA[<p>Hallo liebe Forum-User,</p>
<p>ich habe immer noch nicht ganz kapiert, wie man Speicher ordentlich befreit. Ich rufe mit libcurl dateien aus dem www ab und muss diese dann weiterverarbeiten. Alle 10sek, also immer wenn die Datei abgerufen wird, wird der vom Programm genutzte Speicher größer (laut Task Manager). Also wird es wohl irgendwo am folgenden Code liegen. Ich räume aber curl schon ordentlich auf (mit curl_easy_cleanup(ctx); und curl_global_cleanup) - und beim Rest weiss ich leider nicht, wie er aufgeräumt wird.</p>
<p>Es wäre super, wenn mir jemand helfen würde - vielen Dank!</p>
<pre><code>datenAbrufer();

void datenAbruferMatch(void)
{
	curl_global_init (CURL_GLOBAL_ALL);
	CURL* ctx = curl_easy_init();
	curl_easy_setopt(ctx, CURLOPT_URL, &quot;http://meineurl.de/test.txt&quot;);
	curl_easy_setopt(ctx, CURLOPT_NOPROGRESS, true);
	curl_easy_setopt(ctx, CURLOPT_WRITEFUNCTION, sortMatchData);
	curl_easy_setopt(ctx, CURLOPT_WRITEDATA, sortMatchData);
	const CURLcode rc = curl_easy_perform( ctx ) ;
	curl_easy_cleanup(ctx);
	curl_global_cleanup();
}

size_t sortMatchData(void *buffer, size_t size, size_t nmemb, void *userp)
	{
		string allesZusammen = (char * )buffer;
		char *test[4000]; char *test2[20];
		string super; string vergleich;	
		string m1s; string m2s;

		int i; int j;
		int anzahl2 = 0;
		for (i=0; i&lt;2000; i++)
		{
			test[i] = &quot;&quot;;
		}
		int anzahl = split ('\n', (char*)buffer, test);

		for (i=0; i&lt;200; i++)
		{
			if (NULL != test[i]) {
				super = (char*)test[i];
				anzahl2 = split('|', (char*)super.c_str(), test2);

				// Etwas herauslesen
				vergleich = &quot;testzeile&quot;;
				if ((char*)test2[0] == vergleich) { glTestVar = (char*)test2[1]; }
			}
		}

		*test = 0;
		*test2 = 0;
		return 1;
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/150212/speicherbefreiung-nach-curl-funktion</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 14:32:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/150212.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 Jun 2006 08:38:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherbefreiung nach curl-Funktion on Wed, 14 Jun 2006 08:38:46 GMT]]></title><description><![CDATA[<p>Hallo liebe Forum-User,</p>
<p>ich habe immer noch nicht ganz kapiert, wie man Speicher ordentlich befreit. Ich rufe mit libcurl dateien aus dem www ab und muss diese dann weiterverarbeiten. Alle 10sek, also immer wenn die Datei abgerufen wird, wird der vom Programm genutzte Speicher größer (laut Task Manager). Also wird es wohl irgendwo am folgenden Code liegen. Ich räume aber curl schon ordentlich auf (mit curl_easy_cleanup(ctx); und curl_global_cleanup) - und beim Rest weiss ich leider nicht, wie er aufgeräumt wird.</p>
<p>Es wäre super, wenn mir jemand helfen würde - vielen Dank!</p>
<pre><code>datenAbrufer();

void datenAbruferMatch(void)
{
	curl_global_init (CURL_GLOBAL_ALL);
	CURL* ctx = curl_easy_init();
	curl_easy_setopt(ctx, CURLOPT_URL, &quot;http://meineurl.de/test.txt&quot;);
	curl_easy_setopt(ctx, CURLOPT_NOPROGRESS, true);
	curl_easy_setopt(ctx, CURLOPT_WRITEFUNCTION, sortMatchData);
	curl_easy_setopt(ctx, CURLOPT_WRITEDATA, sortMatchData);
	const CURLcode rc = curl_easy_perform( ctx ) ;
	curl_easy_cleanup(ctx);
	curl_global_cleanup();
}

size_t sortMatchData(void *buffer, size_t size, size_t nmemb, void *userp)
	{
		string allesZusammen = (char * )buffer;
		char *test[4000]; char *test2[20];
		string super; string vergleich;	
		string m1s; string m2s;

		int i; int j;
		int anzahl2 = 0;
		for (i=0; i&lt;2000; i++)
		{
			test[i] = &quot;&quot;;
		}
		int anzahl = split ('\n', (char*)buffer, test);

		for (i=0; i&lt;200; i++)
		{
			if (NULL != test[i]) {
				super = (char*)test[i];
				anzahl2 = split('|', (char*)super.c_str(), test2);

				// Etwas herauslesen
				vergleich = &quot;testzeile&quot;;
				if ((char*)test2[0] == vergleich) { glTestVar = (char*)test2[1]; }
			}
		}

		*test = 0;
		*test2 = 0;
		return 1;
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1077368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1077368</guid><dc:creator><![CDATA[garnichtgut]]></dc:creator><pubDate>Wed, 14 Jun 2006 08:38:46 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbefreiung nach curl-Funktion on Wed, 14 Jun 2006 09:54:20 GMT]]></title><description><![CDATA[<p>Hm...</p>
<pre><code class="language-cpp">char *test[4000]; char *test2[20];
</code></pre>
<p>Wofür brauchst du denn ein Array mit Char-Zeigern...?<br />
...emm ja...: Was macht die Funktion split() ?<br />
bzw. wie lautet der Prototyp ? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1077436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1077436</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Wed, 14 Jun 2006 09:54:20 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbefreiung nach curl-Funktion on Wed, 14 Jun 2006 14:03:15 GMT]]></title><description><![CDATA[<p>Hallo CodeFinder,</p>
<p>danke für deine Mühe! Split soll den String nach Trennzeichen zerlegen. Die Funktion habe ich gefunden (ich glaube in diesem Forum). Sie funktioniert auch sehr gut... und das mit den Zeigern hing alles irgendwie damit zusammen, dass ich den Text aus dem Buffer herausholen und der Split-Funktion übergeben musste. Leider bin ich noch in der mieserablen Lage, mehr zu &quot;raten&quot; als zu coden... Ich arbeite aber dran! Nur: Bei so einigen Fragen helfen die meisten Bücher nicht weiter...</p>
<pre><code>int split( char Sep, char *Source, char *Dest[]) 
{ 
   int count = 0; // Anzahl der gefunden TeilStrings 
   char *buffer = (char*) calloc( lstrlen( Source) + 1, sizeof(char)); // buffer max. so lang wie Source 

   for( int i=0, length=0; i&lt;strlen(Source)+1; i++, length++) 
   { 
      if( Source[i] == Sep || Source[i] == '\0') 
      { 
         i+=1; // damit das Seperator-Zeichen übersprungen wird 
         Dest[count] = (char*) calloc( length + 1, sizeof(char)); // speicher reservieren 
         strncpy( Dest[count], buffer, length); // buffer in Destination kopieren 
         count++; // Anzahl erhöhen 
         length=0;   // buffer länge wieder auf 0 setzen 
         memset( buffer, 0, lstrlen( Source) + 1); // buffer inhalt wieder auf null (&quot;&quot;) sezten 
      } 
      buffer[length] = Source[i];   // Zeichen in buffer umkopieren umkopieren 
   } 

   return count; // Anzahl zurück geben (+1, da bei 0 angefangen wurde zu zählen) 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1077641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1077641</guid><dc:creator><![CDATA[garnichtgut]]></dc:creator><pubDate>Wed, 14 Jun 2006 14:03:15 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbefreiung nach curl-Funktion on Wed, 14 Jun 2006 14:23:43 GMT]]></title><description><![CDATA[<blockquote>
<p>mehr zu &quot;raten&quot; als zu coden</p>
</blockquote>
<p>LOL <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>so...: Dann will ich mal versuchen, das Rätsel zu lösen <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="😉"
    /> ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
<pre><code class="language-cpp">char *buffer = (char*) calloc( lstrlen( Source) + 1, sizeof(char)); // buffer max. so lang wie Source
</code></pre>
<p>Hier reservierst du Speicher der <strong>nie</strong> freigegeben wird, damit ist das Problem jawohl klar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1077659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1077659</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Wed, 14 Jun 2006 14:23:43 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbefreiung nach curl-Funktion on Wed, 14 Jun 2006 14:24:21 GMT]]></title><description><![CDATA[<p>Gut gemeinter Rat: Schmeiss es weg und stell auf std::string um oder lass dich ins C Forum (danach siehts nämlich aus) verschieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1077660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1077660</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Wed, 14 Jun 2006 14:24:21 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbefreiung nach curl-Funktion on Wed, 14 Jun 2006 14:31:11 GMT]]></title><description><![CDATA[<p>jop, da hatta FireFlow Rescht...und noch n guten Rat, wenn du dir schon die Funktionen zusammen suchst und nur kopierst, dann würd wenigstens versuchen, sie zu verstehen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1077669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1077669</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Wed, 14 Jun 2006 14:31:11 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbefreiung nach curl-Funktion on Wed, 14 Jun 2006 14:32:50 GMT]]></title><description><![CDATA[<p>wenn ich calloc sehe, weiß ich sofort, dass ich in C land bin :p diese ganze buffer-kopier-umkopieraktion ist doch ein bisschen umständlich. und fehlerhaft, da ist schon mal ein leck in split - es fehlt ein free(buffer) vor dem return.</p>
<p>split zerlegt den input in einzelne C-strings, die du selbst wieder freigeben musst. also</p>
<pre><code class="language-cpp">int x = split( sep, src, dest );
// ... verarbeitung des ergebnisses
for ( int i = 0; i &lt; x; ++i )
    free( dest[i] );
</code></pre>
<p>oder, weil wir hier in C++ land sind</p>
<pre><code class="language-cpp">for_each( dest, dest + x, free );
</code></pre>
<p>andererseits, eben weil wir hier in C++ land sind, machen wir das ganze lieber mit richtigen strings und vergessen den calloc-mist</p>
<pre><code class="language-cpp">std::vector&lt;std::string&gt; split(char sep, const std::string&amp; src)
{
    std::vector&lt;std::string&gt; result;
    if ( src.empty() )
        return result;
    std::string::size_type pos = 0;
    for ( ;; )
    {
        std::string::size_type pos2 = src.find( sep, pos );
        if ( pos2 == std::string::npos )
            break;
        result.push_back( src.substr( pos, pos2 - pos - 1 );
        pos = pos2 + 1;
    }
    result.push_back( src.substr( pos ) );
    return result;
}
</code></pre>
<p>noch nicht wirklich effizient, abre zumindest keine probleme mit der speicherfreigabe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1077670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1077670</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 14 Jun 2006 14:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbefreiung nach curl-Funktion on Thu, 15 Jun 2006 11:16:40 GMT]]></title><description><![CDATA[<p>Großartig, danke! Alles funktioniert!</p>
<p>Ich komme von PHP und VB und war einfach froh, dass ich irgendwo eine String Split Funktion gefunden hatte. - Dass die nicht so optimal war, hätte ich nie gemerkt, danke!</p>
<p>Wo finde ich denn eine Übersicht darüber, welche Variablen und Objekte man nach Benutzung wieder löschen muss und welche nicht? - Manche Objekte haben ein -&gt;release(), manche haben gar keine Methoden. Delete scheint nur für mit &quot;new&quot; erstellte Objekte in Frage zu kommen und &quot;free&quot; ist eine veralteter C-Baustein?!</p>
<p>Ich Anfänger baue ein Programm und sehe mir dann hinterher im Task-Manager an, ob der genutzte Speicher mehr wird. Ich kann mir aber gut vorstellen, dass ihr Profis so etwas schon beim Erstellen des Codes bemerkt. Nach welchen Regeln richtet ihr euch?</p>
<p>Nochmal danke an alle für die schnelle Hilfe, war wirklich super!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1078097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1078097</guid><dc:creator><![CDATA[garnichtgut]]></dc:creator><pubDate>Thu, 15 Jun 2006 11:16:40 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbefreiung nach curl-Funktion on Thu, 15 Jun 2006 15:54:54 GMT]]></title><description><![CDATA[<p>Wenn Du fremde Klassen nutzt musst du halt in der Doku schauen ob du eine Methode der Klasse zum Freigeben von Speicher aufrufen musst. Wenn es da keine Methode gibt, dann wird das meist über den Destruktur der Klasse realisiert.</p>
<p>Diese spezielle Methode die jede Klasse hat wird automatisch aufgerufen wenn ein Objekt z.B durch Verlassen eines Anweisungsblocks &quot;{&quot; und &quot;}&quot; gelöscht wird oder wenn du DELETE nach einem NEW auf dem Zeiger des Objekts anwendest. Wenn Du eigene Klassen schreibst solltest Du in Deiner Destruktor Methode dafür sorgen dass der Speicher den Deine Klasse benutzt hat wieder freigegeben wird.</p>
<pre><code class="language-cpp">{
meinObjekt MeineKlasse;
meinObjekt.meineMethode();
} &lt;-- hier wird automatisch der Destruktor aufgerufen
</code></pre>
<pre><code class="language-cpp">meinObjekt = new MeineKlasse();
meinObjekt-&gt;meineMethode();

delete meinObjekt; &lt;-- hier wieder Aufruf des Destruktors
</code></pre>
<p>Gruß Chris</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1078324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1078324</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 15 Jun 2006 15:54:54 GMT</pubDate></item></channel></rss>