<?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[String literals und free() ?]]></title><description><![CDATA[<p>Hi everyone</p>
<p>In meinem momentanen Projekt existieren diverse Funktionen, welche ein Array von Strings übergeben haben möchten:</p>
<pre><code class="language-cpp">argv = (char **) realloc(argv, sizeof(char *) * 3);
argv[0] = (char *) malloc(sizeof(char) * 2);
argv[0][0] = '5', argv[0][1] = '\0';
argv[2] = (*this).get_strLpTimeStamp();
// ...

iStat = (*this).MsgSend(spReadIn, (*this).iR, argv, 3);
for(int i = 0; i &lt; 3; i++) {
   free(argv[i]);
}
free(argv);
</code></pre>
<p>Ihr merkt schon, das wird sehr schnell ganz schön umständlich und besonders weil ich bei malloc() das unangenehme Talent besitze, den free() zu vergessen, gefällt mir die Lösung ganz und gar 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="😉"
    /> .</p>
<p>Statt dessen habe ich mir also das hier ausgedacht:</p>
<pre><code class="language-cpp">char *strTmp = (*this).get_strLpTimeStamp();
char *argv[] = { &quot;5&quot;, &quot;P.01&quot;, strTmp };
free(strTmp);
</code></pre>
<p>Tja, und jetzt die Preisfrage: Nach meinem Verständnis müssten diese Daten doch jetzt eigentlich auf dem Stack alloziiert worden sein, anstatt wie zuvor auf dem Heap. Also müsste ich mir doch</p>
<pre><code class="language-cpp">for(int i = 0; i &lt; 3; i++) {
   free(argv[i]);
}
free(argv);
</code></pre>
<p>sparen können, nicht wahr?</p>
<p>Thx für eure Hilfe und greeetz<br />
Kessi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/170959/string-literals-und-free</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 09:03:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/170959.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 21 Jan 2007 13:19:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to String literals und free() ? on Sun, 21 Jan 2007 13:19:10 GMT]]></title><description><![CDATA[<p>Hi everyone</p>
<p>In meinem momentanen Projekt existieren diverse Funktionen, welche ein Array von Strings übergeben haben möchten:</p>
<pre><code class="language-cpp">argv = (char **) realloc(argv, sizeof(char *) * 3);
argv[0] = (char *) malloc(sizeof(char) * 2);
argv[0][0] = '5', argv[0][1] = '\0';
argv[2] = (*this).get_strLpTimeStamp();
// ...

iStat = (*this).MsgSend(spReadIn, (*this).iR, argv, 3);
for(int i = 0; i &lt; 3; i++) {
   free(argv[i]);
}
free(argv);
</code></pre>
<p>Ihr merkt schon, das wird sehr schnell ganz schön umständlich und besonders weil ich bei malloc() das unangenehme Talent besitze, den free() zu vergessen, gefällt mir die Lösung ganz und gar 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="😉"
    /> .</p>
<p>Statt dessen habe ich mir also das hier ausgedacht:</p>
<pre><code class="language-cpp">char *strTmp = (*this).get_strLpTimeStamp();
char *argv[] = { &quot;5&quot;, &quot;P.01&quot;, strTmp };
free(strTmp);
</code></pre>
<p>Tja, und jetzt die Preisfrage: Nach meinem Verständnis müssten diese Daten doch jetzt eigentlich auf dem Stack alloziiert worden sein, anstatt wie zuvor auf dem Heap. Also müsste ich mir doch</p>
<pre><code class="language-cpp">for(int i = 0; i &lt; 3; i++) {
   free(argv[i]);
}
free(argv);
</code></pre>
<p>sparen können, nicht wahr?</p>
<p>Thx für eure Hilfe und greeetz<br />
Kessi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213696</guid><dc:creator><![CDATA[KessiMC]]></dc:creator><pubDate>Sun, 21 Jan 2007 13:19:10 GMT</pubDate></item><item><title><![CDATA[Reply to String literals und free() ? on Mon, 22 Jan 2007 08:17:44 GMT]]></title><description><![CDATA[<p>Wenn du in der Lage bist, C++-Mittel zu nutzen, solltest du auf malloc/free komplett verzichten. Speichere dein &quot;Array von Strings&quot; lieber als std::vector<a href="std::string" rel="nofollow">std::string</a>, da brauchst du dich nicht mehr um die Speicherverwaltung kümmern.</p>
<p>Ansonsten: Ja, in deinem zweiten Beispiel liegt dein Array auf dem Stack (wo die einzelnen Array-Elemente hinzeigen, hängt vom Programm ab), also brauchst du sie nicht mehr freizugeben. Das schließt übrigens auch das <code>free(strTemp);</code> mit ein - das letzte Array-Element zeigt auf den selben Speicher wie strTemp (den get_LpTimeStamp() reserviert hat), und wenn du die Daten dort freigibst, zeigst du anschließend auf einen Müllhaufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1214215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1214215</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 22 Jan 2007 08:17:44 GMT</pubDate></item><item><title><![CDATA[Reply to String literals und free() ? on Mon, 22 Jan 2007 08:37:54 GMT]]></title><description><![CDATA[<p>Wie wäre es mit einer Hilfsklasse, die Dir die Arbeit abnimmt. So in etwa so:</p>
<pre><code class="language-cpp">class ArgCreator
{
    unsigned size;
    char** argv;
  public:
    explicit ArgCreator(unsigned size_);
    ~ArgCreator();
    void setArg(unsigned n, const char* str);
    unsigned getSize() const  { return size; }
    char** getArgv() const    { return argv; }
    operator char** () const  { return argv; } // das ist Geschmackssache
};

ArgCreator::ArgCreator(unsigned size_)
{ // TODO Allokation implementieren
}

ArgCreator::~ArgCreator()
{ // TODO Freigabe implementieren
}

void ArgCreator::setArg(unsigned n, const char* str)
{ // TODO Speicher allokieren und str kopieren
}
</code></pre>
<p>Eine Instanz der Klasse legst Du dann bei Bedarf auf den Stack. Der Destruktor wird dann automatisch aufgerufen.</p>
<p>Tntnet</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1214232</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1214232</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Mon, 22 Jan 2007 08:37:54 GMT</pubDate></item></channel></rss>