<?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[Problem mit der Speicherverwaltung bei Funktionsrückgabe]]></title><description><![CDATA[<p>Bei der folgenden Funktion</p>
<pre><code class="language-cpp">char *Left(char *str, int length)
{
 	char *f;
 	f = (char*)malloc(length);
 	if (f==NULL)
 	return &quot;&quot;;
 	strncpy(f,str, length);
 	f[length] = '\0';
 	return f;		
}
</code></pre>
<p>wird zuerst für f ein Speicherblock reserviert (malloc),<br />
dieser wird dann zurückgegeben, ohne wieder freigegeben zu werden.</p>
<p>Wie kann man diese Speichervergeudung umgehen?</p>
<p>Gruß<br />
Florian</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/169143/problem-mit-der-speicherverwaltung-bei-funktionsrückgabe</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 18:16:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/169143.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 02 Jan 2007 14:04:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung bei Funktionsrückgabe on Tue, 02 Jan 2007 14:04:54 GMT]]></title><description><![CDATA[<p>Bei der folgenden Funktion</p>
<pre><code class="language-cpp">char *Left(char *str, int length)
{
 	char *f;
 	f = (char*)malloc(length);
 	if (f==NULL)
 	return &quot;&quot;;
 	strncpy(f,str, length);
 	f[length] = '\0';
 	return f;		
}
</code></pre>
<p>wird zuerst für f ein Speicherblock reserviert (malloc),<br />
dieser wird dann zurückgegeben, ohne wieder freigegeben zu werden.</p>
<p>Wie kann man diese Speichervergeudung umgehen?</p>
<p>Gruß<br />
Florian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1201165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201165</guid><dc:creator><![CDATA[C++ Programmierer]]></dc:creator><pubDate>Tue, 02 Jan 2007 14:04:54 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung bei Funktionsrückgabe on Tue, 02 Jan 2007 14:08:01 GMT]]></title><description><![CDATA[<p>Den Speicher nicht in der Funktion besorgen sondern von aussen mitgeben lassen.</p>
<p>Du könntest auch einfach std::string verwenden (C++)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1201170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201170</guid><dc:creator><![CDATA[Knuddlbaer]]></dc:creator><pubDate>Tue, 02 Jan 2007 14:08:01 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung bei Funktionsrückgabe on Tue, 02 Jan 2007 15:12:49 GMT]]></title><description><![CDATA[<p>Knuddlbaer schrieb:</p>
<blockquote>
<p>...<br />
Du könntest auch einfach std::string verwenden ...</p>
</blockquote>
<p>... und damit Deinem Nickname gerecht werden. <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>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1201209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201209</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 02 Jan 2007 15:12:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung bei Funktionsrückgabe on Tue, 02 Jan 2007 15:24:09 GMT]]></title><description><![CDATA[<p>Und dann schau mal ob eine der Funktionen von Boost String nicht genau das macht, was du vorhast. <a href="http://www.boost.org/doc/html/string_algo/quickref.html" rel="nofollow">http://www.boost.org/doc/html/string_algo/quickref.html</a> (zB <a href="http://www.boost.org/doc/html/find_head.html" rel="nofollow">find_head()</a> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1201220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201220</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Tue, 02 Jan 2007 15:24:09 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung bei Funktionsrückgabe on Tue, 02 Jan 2007 15:30:17 GMT]]></title><description><![CDATA[<p>Danke!<br />
Ich habe bisher mein ganzes Projekt mit char programmiert, welche vorteile hätte das, wenn ich es auf string umschreibe (außer, dass einige Standardfunktionen schon da wären)?<br />
Das mit der Funktion Left war eigentlich nur eine Frage zur Speicherverwaltung, da ich in meinem ganzen Projekt solche Funktionen habe, die ganz gemein Speicher fressen, indem sie eben die Variable zurückgeben, anstatt sie mit zu übergeben :(.</p>
<p>Gruß<br />
Florian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1201228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201228</guid><dc:creator><![CDATA[C++ Programmierer]]></dc:creator><pubDate>Tue, 02 Jan 2007 15:30:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung bei Funktionsrückgabe on Tue, 02 Jan 2007 15:30:42 GMT]]></title><description><![CDATA[<p>Man könnte auch einfach std::string::substr verwenden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1201229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201229</guid><dc:creator><![CDATA[Knuddlbaer]]></dc:creator><pubDate>Tue, 02 Jan 2007 15:30:42 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung bei Funktionsrückgabe on Tue, 02 Jan 2007 15:36:49 GMT]]></title><description><![CDATA[<p>C++ Programmierer schrieb:</p>
<blockquote>
<p>.. welche vorteile hätte das, wenn ich es auf string umschreibe ..</p>
</blockquote>
<p>Dass sie die Speicherverwaltung selbst machen <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/1201234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201234</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Tue, 02 Jan 2007 15:36:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung bei Funktionsrückgabe on Tue, 02 Jan 2007 16:11:18 GMT]]></title><description><![CDATA[<p>C++ Programmierer schrieb:</p>
<blockquote>
<p>...welche vorteile hätte das, wenn ich es auf string umschreibe (außer, dass einige Standardfunktionen schon da wären)? ...</p>
</blockquote>
<p>Ganz einfach: Du wärst z.B. Probleme wie das Obigen und das Folgende auf einen Schlag los:</p>
<p>C++ Programmierer schrieb:</p>
<blockquote>
<p>...<br />
...da ich in meinem ganzen Projekt solche Funktionen habe, die ganz gemein Speicher fressen, indem sie eben die Variable zurückgeben, anstatt sie mit zu übergeben :(....</p>
</blockquote>
<p><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>Außerdem sind es mehr als &quot;ein paar Standardfunktionen&quot;, die Du mit std::string verwenden kannst. Z.B. steht Dir die ganze STL zur Verfügung.<br />
Insgesamt wirst Du Dich mehr auf die tatsächliche Arbeit des Programms konzentrieren können, weil Du Dich nicht mehr mit der Verwaltung von Zeichenketten und Speicher rumschlagen musst.</p>
<p>Übrigens: Ich habe in Deinem Code nicht ein einziges C++-Konstrukt entdeckt - es ist lupenreines C. Kann man machen, aber wenn man C++ nutzen kann, vereinfacht es Vieles, wenn man es auch tut.</p>
<p>Nun aber zu Deiner ursprünglichen Frage:</p>
<p>C++ Programmierer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">char *Left(char *str, int length)
{
 	char *f;
 	f = (char*)malloc(length);
 	if (f==NULL)
 	return &quot;&quot;;
 	strncpy(f,str, length);
 	f[length] = '\0';
 	return f;		
}
</code></pre>
<p>...</p>
</blockquote>
<p>(Hast Du schon gemerkt) Speicher wird angelegt und Du musst für die Freigabe sorgen. Prinzipiell ist die Frage: Wem soll der Speicher gehören ? Und eine übliche (wenn auch nicht zwingende) Antwort ist: Wer Speicher reserviert, muss ihn auch freigeben. Hier soll der Aufrufer diesen Speicher noch nutzten können, also muß er ihn auch bereitstellen:</p>
<pre><code class="language-cpp">void Left(char const *inStr, size_t inLength, char* outStr, size_t outLen ) {
// Konsistenzchecks spare ich mir hier....
    strncpy(outStr,inStr, inLength);
}

int main() {
    char outStackStr[100];
    char *outHeapStr = new char[100];
    char inStr[] = &quot;Teste mich&quot;;

    Left(inStr, strlen(inStr), &amp;outStackStr, sizeof(outStackStr));

    Left(inStr, strlen(inStr), outHeapStr, 100);
// daran denken, dass exceptions fliegen können !!
    delete[] outHeapStr;
}
</code></pre>
<p>Hoppla ! Left() brauche ich ja gar nicht mehr - kann ja direkt strncpy() aufrufen !!! <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="😉"
    /> (OK, war ja nur ein Beispiel)</p>
<p>Alternativ der &quot;häßliche-Entlein-Weg&quot;:</p>
<pre><code class="language-cpp">char* Left(char const *inStr, size_t inLength) {
// Konsistenzchecks spare ich mir hier....
    char outStr = new char[inLength];
    strncpy(outStr,inStr, inLength);
    return outStr;
}

int main() {
    char *outHeapStr;
    char inStr[] = &quot;Teste mich&quot;;

    outHeapStr = Left(inStr, strlen(inStr), outHeapStr);
    // Stack-Variante geht jetzt nicht mehr !
    // daran denken, dass exceptions fliegen können !!
    delete[] outHeapStr;
}
</code></pre>
<p>IMO handelt man sich damit mehr Probleme als Vorteile ein, aber gehen &quot;tut es&quot;.</p>
<p>Ach ja: In C++ hieße das:</p>
<pre><code class="language-cpp">int main() {
    std::string outStr;
    std::string inStr = &quot;Teste mich&quot;;

    outStr = inStr;
// oder
    outStr = inStr.substr(0,10);
}
</code></pre>
<p>Schon kürzer und übersichtlicher, oder ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1201243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201243</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 02 Jan 2007 16:11:18 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung bei Funktionsrückgabe on Tue, 02 Jan 2007 16:36:47 GMT]]></title><description><![CDATA[<p>Ja, sehr viel schöner und übersichtlicher <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="🙂"
    /> Danke für die tolle Erläuterung!</p>
<p>Also werde ich wohl mein Projekt auf die string Klasse umschreiben.</p>
<p>Ich weiß, dass ist eigentlich nicht die Foren Sektion dafür, aber wenn ich jetzt mit Strings aus der string Klasse Funktionen der Windows API aufrufen will muss ich doch buffer.c_str() aufrufen, und wenn die Größe von dem buffer verlangt wird sizeof(buffer), oder?</p>
<p>Gruß<br />
Florian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1201286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201286</guid><dc:creator><![CDATA[C++ Programmierer]]></dc:creator><pubDate>Tue, 02 Jan 2007 16:36:47 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung bei Funktionsrückgabe on Tue, 02 Jan 2007 16:48:18 GMT]]></title><description><![CDATA[<p>Ja, c_str ist schon korrekt. Aber sizeof falsch. Die String-Klasse hat hat eine eigene size-Methode.</p>
<p><a href="http://www.cppreference.com/cppstring/index.html" rel="nofollow">http://www.cppreference.com/cppstring/index.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1201298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201298</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Tue, 02 Jan 2007 16:48:18 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung bei Funktionsrückgabe on Tue, 02 Jan 2007 16:53:25 GMT]]></title><description><![CDATA[<p>Ok, danke!</p>
<p>dann also buffer.max_size()</p>
<p>Gruß<br />
Florian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1201305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201305</guid><dc:creator><![CDATA[C++ Programmierer]]></dc:creator><pubDate>Tue, 02 Jan 2007 16:53:25 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung bei Funktionsrückgabe on Tue, 02 Jan 2007 17:15:42 GMT]]></title><description><![CDATA[<p>C++ Programmierer schrieb:</p>
<blockquote>
<p>...<br />
Also werde ich wohl mein Projekt auf die string Klasse umschreiben....</p>
</blockquote>
<p>gute Entscheidung ! <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="👍"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
<p>C++ Programmierer schrieb:</p>
<blockquote>
<p>...<br />
wenn ich jetzt mit Strings aus der string Klasse Funktionen der Windows API aufrufen will muss ich doch buffer.c_str() aufrufen...</p>
</blockquote>
<p>Jain ! <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>
<ul>
<li>buffer.size() liefert die Anzahl der Zeichen im String zurück.</li>
<li>c_str() liefert nur einen <strong>const-Zeiger</strong> ! Wenn die aufgerufene Funktion da auch reinschreiben will, kommst Du nicht drum herum, die Daten in ein char-Array zu kopieren. Ist aber auch kein Drama (s.u.).</li>
</ul>
<pre><code class="language-cpp">string buffer = &quot;Hier steht mein Kram drin&quot;;

// Nicht-Verändernde Funktion aufrufen: Easy: Nix zu tun
changeNothingInCString(buffer.c_str(), buffer.size());

// hinkopieren (Annahme: Funktion hängt nichts an !)
char * cStringBuffer = new char[buffer.size()];
buffer.copy(cStringBuffer, buffer.size());

// Verändernde Funktion aufrufen
changeSomethingInCString(cStringBuffer, buffer.size());

// zurückkopieren
buffer = cStringBuffer;
delete[] cStringBuffer;
</code></pre>
<p>Prinzipiell kannst Du die Kopiererei auch in eine eigene Wrapperfunktion auslegen - ob sich das lohnt, musst Du aber selbst entscheiden.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1201322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201322</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 02 Jan 2007 17:15:42 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung bei Funktionsrückgabe on Tue, 02 Jan 2007 17:17:18 GMT]]></title><description><![CDATA[<p>C++ Programmierer schrieb:</p>
<blockquote>
<p>Ok, danke!</p>
<p>dann also buffer.max_size()</p>
<p>Gruß<br />
Florian</p>
</blockquote>
<p>Vorweg: das std::string::max_size() vergiss einstweilen mal wieder. Die Funktion die die Länge des Strings zurückliefert ist std::string::size.</p>
<p>Und du solltest std::string nicht verwenden wenn du eine API Funktion aufrufen willst die einen non-const char Pointer will - dafür verwende lieber einen std::vector&lt;char&gt;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1201331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201331</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 02 Jan 2007 17:17:18 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung bei Funktionsrückgabe on Mon, 12 Nov 2007 11:19:09 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>mein erster Post <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>Ich hätte mal eine Frage zu folgender Funktion:</p>
<pre><code>string tuwas()
{
  string s;

  s+=&quot;Hallo&quot;;

  return s;
}

...
string g = tuwas();
...
</code></pre>
<p>Besteht hier bei string das gleiche Problem, wie wenn man es (wie oben) mit char * machen würde? Sollte man also auch bei Verwendung von &quot;string&quot; die Stringvariable vor Aufruf der Funktion anlegen, oder wird hier eine Kopie des strings zurückgegeben?</p>
<p>Mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401786</guid><dc:creator><![CDATA[Firewall]]></dc:creator><pubDate>Mon, 12 Nov 2007 11:19:09 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung bei Funktionsrückgabe on Mon, 12 Nov 2007 11:25:04 GMT]]></title><description><![CDATA[<p>Nein, bei string besteht das Problem nicht, weil der den Speicher selber verwaltet - und einen vernünftige Copy-Ctor, der sich um die Speicherverwaltung kümmert.</p>
<p>(aus Geschwindigkeitsgründen kann es trotzdem vorteilhaft sein, unnötige Kopien einzusparen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401788</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 12 Nov 2007 11:25:04 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung bei Funktionsrückgabe on Wed, 14 Nov 2007 07:42:50 GMT]]></title><description><![CDATA[<p>Danke für die Info! <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/1402872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402872</guid><dc:creator><![CDATA[Firewall]]></dc:creator><pubDate>Wed, 14 Nov 2007 07:42:50 GMT</pubDate></item></channel></rss>