<?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[char* aus funktionsrueckgabewert]]></title><description><![CDATA[<p>Hey!</p>
<p>Wie kann ich einen char* aus 'ner funktion zurueckgeben?<br />
Das ganze sieht wie folgt aus:</p>
<pre><code class="language-cpp">const char* fun()
{
  //calculate len
  const char *c = new char[len];
  // fill c

  return c;
}
</code></pre>
<p>Hier gibts jetzt gleich 2 Probleme:</p>
<ol>
<li>Es wird ein pointer auf nicht existierenden speicher zurueckgegeben</li>
<li>Es entsteht ein leak, da niemals delete [] c aufgerufen wird.</li>
</ol>
<p>Wie kann ich das ohne nutzung von std::string loesen?<br />
Waere folgende loesung mit std::string korrekt?</p>
<pre><code class="language-cpp">const strC fun()
{
  //calculate len
  const char *c = new char[len];
  // fill c
  string strC(c);
  delete [] c;

  return strC;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/298473/char-aus-funktionsrueckgabewert</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 19:50:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/298473.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 20 Jan 2012 19:40:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 19:40:11 GMT]]></title><description><![CDATA[<p>Hey!</p>
<p>Wie kann ich einen char* aus 'ner funktion zurueckgeben?<br />
Das ganze sieht wie folgt aus:</p>
<pre><code class="language-cpp">const char* fun()
{
  //calculate len
  const char *c = new char[len];
  // fill c

  return c;
}
</code></pre>
<p>Hier gibts jetzt gleich 2 Probleme:</p>
<ol>
<li>Es wird ein pointer auf nicht existierenden speicher zurueckgegeben</li>
<li>Es entsteht ein leak, da niemals delete [] c aufgerufen wird.</li>
</ol>
<p>Wie kann ich das ohne nutzung von std::string loesen?<br />
Waere folgende loesung mit std::string korrekt?</p>
<pre><code class="language-cpp">const strC fun()
{
  //calculate len
  const char *c = new char[len];
  // fill c
  string strC(c);
  delete [] c;

  return strC;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2170626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170626</guid><dc:creator><![CDATA[com_ptr&amp;lt;T&amp;gt;]]></dc:creator><pubDate>Fri, 20 Jan 2012 19:40:11 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 20:11:41 GMT]]></title><description><![CDATA[<p>Wenn man kein RAII zur Verfügung hat, bekommt man normalerweise einen Zeiger auf freien Speicher übergeben:</p>
<pre><code class="language-cpp">void foo(char* buf)
{
  ..
}
</code></pre>
<p>Dass man Zeiger auf den automatischen Speicher der Funktion (Stack) nicht zurückgeben sollte, weißt du ja bereits. Und einen Zeiger auf Speicher vom Heap zurückgeben ist eine ähnlich schlechte Idee, solange man nicht gerade eine Factory oder Ähnliches schreibt. ( = Es für der Nutzer den Funktion ersichtlich ist, dass er sich um die Freigabe kümmern muss.)</p>
<p>Edit: Wozu das Geraffel mit new[] und delete[], in der std::string Version?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170629</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 20 Jan 2012 20:11:41 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 19:55:58 GMT]]></title><description><![CDATA[<p>Entweder du machst deine eigene Stringklasse, die Besitz vom Speicher übernehmen kann, oder du gibst einen std::unique_ptr&lt;char[]&gt; zurück. Die Variante mit std::string ist zwar korrekt, erstellt aber leider eine Kopie. Ich hoffe, dass die da in Zukunft noch was machen, um sowas ohne Kopie zu ermöglichen.</p>
<p>Edit: Warum brauchst du eigentlich ein rohes char-Array? Warum nicht direkt einen std::string anlegen und den zurückgeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170631</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 20 Jan 2012 19:55:58 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 19:56:53 GMT]]></title><description><![CDATA[<p>com_ptr&lt;T&gt; schrieb:</p>
<blockquote>
<p>Wie kann ich einen char* aus 'ner funktion zurueckgeben?<br />
Das ganze sieht wie folgt aus:</p>
<pre><code class="language-cpp">const char* fun()
{
  //calculate len
  const char *c = new char[len];
  // fill c

  return c;
}
</code></pre>
<p>Hier gibts jetzt gleich 2 Probleme:</p>
<ol>
<li>Es wird ein pointer auf nicht existierenden speicher zurueckgegeben</li>
<li>Es entsteht ein leak, da niemals delete [] c aufgerufen wird.</li>
</ol>
</blockquote>
<p>Das mit (1) musst Du mir nochmal erklären.<br />
Und ob da ein Leak entsteht, hängt ja davon ab, wie das restliche Programm aussieht.</p>
<p>com_ptr&lt;T&gt; schrieb:</p>
<blockquote>
<p>Wie kann ich das ohne nutzung von std::string loesen?</p>
</blockquote>
<p>Definiere das Problem bitte genauer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170632</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 20 Jan 2012 19:56:53 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 20:15:07 GMT]]></title><description><![CDATA[<blockquote>
<p>Edit: Wozu das Geraffel mit new[] und delete[], in der std::string Version?</p>
</blockquote>
<p>Naja, weil der String ne dynamische laenge hat? <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="😃"
    /><br />
Ansonsten find ich das nen sehr guten ansatz, mit dem char* uebergeben.</p>
<blockquote>
<p>Edit: Warum brauchst du eigentlich ein rohes char-Array? Warum nicht direkt einen std::string anlegen und den zurückgeben?</p>
</blockquote>
<p>Ich lese eine binaere datei ein, und habe das gefuehl, dass bei der konvertierung etwas &quot;abgeschnitten&quot; wird/werden koennte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170636</guid><dc:creator><![CDATA[com_ptr&amp;lt;T&amp;gt;]]></dc:creator><pubDate>Fri, 20 Jan 2012 20:15:07 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 20:16:25 GMT]]></title><description><![CDATA[<p>Die komplette Funktion zum Laden der binaeren datei sieht nun so aus:</p>
<pre><code>const std::string ShaderManager::loadCompiledShader(const std::string&amp; name)
{
	ifstream in(name.c_str(), ios::in || ios::binary);

	in.seekg(0, ios::end);
	std::streamoff length = in.tellg();
	in.seekg(0, ios::beg);

	char *buffer = new char[static_cast&lt;unsigned int&gt;(length)];
	in.read(buffer, length);
	in.close();

	string strBuffer(buffer);
	delete [] buffer;

	return strBuffer;
}
</code></pre>
<p>Was sagt ihr dazu?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170638</guid><dc:creator><![CDATA[com_ptr&amp;lt;T&amp;gt;]]></dc:creator><pubDate>Fri, 20 Jan 2012 20:16:25 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 20:19:31 GMT]]></title><description><![CDATA[<p>Dass man von std::string keinen Zeiger bekommen kann, über den man den String modifizieren <em>darf</em>, ist bedauerlich.</p>
<p>In vielen Fällen mann man den operator [] statt dessen verwenden, denn die einzelnen Zeichen in einem String zu verändern ist ja schliesslich nicht verboten.<br />
In vielen Fällen kann man aber auch nicht ausweichen, und muss kopieren.</p>
<p>@com_ptr&lt;T&gt;<br />
Deine Funktion ist vollkommen korrekt. Sie verlangt bloss vom Aufrufer, dass dieser den Speicher mit delete [] wieder freigibt.<br />
Und natürlich vorausgesetzt, dass zwischen dem new[] und dem return keine Exceptions fliegen können. Sonst hättest du nämlich wirklich ein Leak.</p>
<p>Die Variante von cooky451 ist vielleicht besser, da der Aufrufer dann entscheiden kann wie er den Speicher verwaltet.<br />
Nur solltest du die Funktion dann um einen Parameter erweitern, in dem der Aufrufer die Länge des Puffers übergibt. Um zu verhindern, dass die Funktion nen Pufferüberlauf macht.<br />
Natürlich muss man dann wieder irgendwie den Fall behandeln, dass der Puffer zu klein ist, was die Sache wieder etwas lästig macht. Vor allem auf Seite des Aufrufers, der dann u.U. dynamisch den Puffer vergrössern muss.</p>
<p>com_ptr&lt;T&gt; schrieb:</p>
<blockquote>
<p>Waere folgende loesung mit std::string korrekt?</p>
<pre><code class="language-cpp">const strC fun()
{
  //calculate len
  const char *c = new char[len];
  // fill c
  string strC(c);
  delete [] c;

  return strC;
}
</code></pre>
</blockquote>
<p>Wenn man den offensichtlichen Flüchtigkeitsfehler mal ignoriert (&quot;const strC fun()&quot; muss &quot;std::string fun()&quot; heissen), dann ja.<br />
Bzw. gibt es hier wieder das selbe Problem mit Exceptions.<br />
Gegenvorschlag:</p>
<pre><code class="language-cpp">std::string fun()
{
    // calculate len

    std::vector&lt;char&gt; buffer(len);
    const char* c = &amp;buffer[0];

    // fill c

    return std::string(buffer.begin(), buffer.end());
}
</code></pre>
<p>Das ist das, was ich immer mache, wenn ich Strings von z.B. OS Funktionen zurückgegeben bekomme, die ich dann als std::string brauche.</p>
<p>Man kann das ganze auch noch etwas optimieren, wenn man eine Obergrenze für &quot;len&quot; Kennt, die in den meisten Fällen ausreichen wird:</p>
<pre><code class="language-cpp">std::string fun()
{
    static size_t const stackBufferSize = 512;

    size_t len = ...;

    char const* c;
    char stackBuffer[stackBufferSize];
    std::vector&lt;char&gt; buffer;

    if (len &lt;= stackBufferSize)
        c = stackBuffer;
    else
    {
        buffer.resize(len);
        c = &amp;buffer[0];
    }

    // fill c

    return std::string(c, c + len);
}
</code></pre>
<p>Wenn man sowas häufiger braucht, kann man sich eine kleine Helper-Klasse basteln, wodurch man dann etwas in der Art schreiben kann:</p>
<pre><code class="language-cpp">std::string fun()
{
    size_t len = ...;

    SmartBuffer&lt;char, 512&gt; buffer(len);
    char const* c = buffer.begin();

    // fill c

    return std::string(buffer.begin(), buffer.end()); // oder gleich buffer.ToString()
}
</code></pre>
<p>EDIT: nachdem du aus einer Datei liest, vergiss die Optimierung. Der Dateizugriff ist um ein vielfaches langsamer, als die unnötige Speicheranforderung in std::vector&lt;&gt;. D.h. es zahlt sich nicht aus die wegzuoptimieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170639</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 20 Jan 2012 20:19:31 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 20:20:34 GMT]]></title><description><![CDATA[<p>com_ptr&lt;T&gt; schrieb:</p>
<blockquote>
<ol>
<li>Es wird ein pointer auf nicht existierenden speicher zurueckgegeben</li>
</ol>
</blockquote>
<p>Nein, der Speicher wurde ja mit &quot;new&quot; angefordert. Wenn das fehlschlägt, wirft C++ IMHO eine bad_alloc-Exception.</p>
<p>com_ptr&lt;T&gt; schrieb:</p>
<blockquote>
<ol start="2">
<li>Es entsteht ein leak, da niemals delete [] c aufgerufen wird.</li>
</ol>
</blockquote>
<p>Der Aufrufer kann &quot;delete&quot; auf den Rückgabewert der Funktionen anwenden und würde den Speicher damit freigeben.</p>
<p>Btw, funktionieren würde es so, allerdings bezweifle ich, dass dein Code dem entspricht, was gemeinhin als &quot;guter C++-Stil&quot; verstanden wird.<br />
^^ Worum ich mich persönlich aber auch nie schere. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2170640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170640</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 20 Jan 2012 20:20:34 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 20:24:05 GMT]]></title><description><![CDATA[<p>Was für Daten liest du denn aus der Datei und was passiert danach mit dem String?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170641</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 20 Jan 2012 20:24:05 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 20:26:48 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23275">@314159265358979</a></p>
<p>Na, ich lese ne binaere datei ein. Fakt ist, dass ich wenn ich mit obiger funktion<br />
die datei lade, seh ich, dass im debugger nen andrer string ist, als den, den die datei tatsaechlich beinhaltet. Also muss da was krumm sein.<br />
Ich konvertiere den zurueckgegebenen std::string wieder in einen const char* mittels std::string::c_str(), was hier aber nicht weiter von bedeutung ist. Denn der &quot;falsche&quot; wert ist ja bereits im std::string vorhanden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170642</guid><dc:creator><![CDATA[com_ptr&amp;lt;T&amp;gt;]]></dc:creator><pubDate>Fri, 20 Jan 2012 20:26:48 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 20:28:29 GMT]]></title><description><![CDATA[<p>Naja, ich bezweifle mal, dass du die Daten intern binär brauchst. Du wirst sie doch sicherlich in andere Datentypen wie ints, floats, doubles o.ä. zerlegen, oder? In diesem Fall könntest du dir den Umweg über den String nämlich sparen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170643</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 20 Jan 2012 20:28:29 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 20:32:44 GMT]]></title><description><![CDATA[<p>Im konkreten handelt es sich um<br />
diese: <a href="http://dl.dropbox.com/u/6559846/com_ptrT.bin" rel="nofollow">http://dl.dropbox.com/u/6559846/com_ptrT.bin</a><br />
Datei, die ich lesen moechte.</p>
<p>Debugging zeigt, dass die datei ~1500 bytes enthaelt.<br />
Interessanterweise werden aber nur 21 gelesen (Laenge des std::strings).<br />
Gelesen wird: &quot;DXBCB÷”=}¤óUý&lt;)íœæ’&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170645</guid><dc:creator><![CDATA[com_ptr&amp;lt;T&amp;gt;]]></dc:creator><pubDate>Fri, 20 Jan 2012 20:32:44 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 20:33:48 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23275">@314159265358979</a><br />
Nein, natuerlich brauche ich sie in binaer, sonst wuerd ich sie ja nicht binaer lesen, und das noch in nen char*, oder? *hehe*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170646</guid><dc:creator><![CDATA[com_ptr&amp;lt;T&amp;gt;]]></dc:creator><pubDate>Fri, 20 Jan 2012 20:33:48 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 20:35:28 GMT]]></title><description><![CDATA[<p>Enthält die Datei 0-Bytes? In diesem Fall würde der std::string nämlich nicht alles kopieren, wenn du den char const* ctor nimmst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170648</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 20 Jan 2012 20:35:28 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 20:37:23 GMT]]></title><description><![CDATA[<blockquote>
<p>Enthält die Datei 0-Bytes? In diesem Fall würde der std::string nämlich nicht alles kopieren, wenn du den char const* ctor nimmst.</p>
</blockquote>
<p>Yep, das war auch meine 1. Vermutung. Leider kann ich das nicht sagen, da es eine generierte datei ist. Wie loese ich das Problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170652</guid><dc:creator><![CDATA[com_ptr&amp;lt;T&amp;gt;]]></dc:creator><pubDate>Fri, 20 Jan 2012 20:37:23 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 20:39:06 GMT]]></title><description><![CDATA[<p>Indem du den Range-Konstruktor verwendest:</p>
<pre><code class="language-cpp">std::string s(ptr, ptr + len);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2170654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170654</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 20 Jan 2012 20:39:06 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 20:47:21 GMT]]></title><description><![CDATA[<p>Wenn das sowieso kein &quot;Test-String&quot; ist, dann wäre vermutlich <code>std::vector&lt;char&gt;</code> der passendere Rückgabe<s>wert</s>typ.<br />
Alternativ kannst du den Template-Konstruktor von std::string verwenden, der ein Iterator-Paar (begin, end) übergeben bekommt. Damit kann man in std::string auch wunderbar 0-Zeichen reintun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170655</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 20 Jan 2012 20:47:21 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 20:46:58 GMT]]></title><description><![CDATA[<p>Habe nun mal folgendes versucht:</p>
<pre><code class="language-cpp">const std::string ShaderManager::loadCompiledShader(const std::string&amp; name)
{
	ifstream in(name.c_str(), ios::in || ios::binary);

	in.seekg(0, ios::end);
	std::streamoff length = in.tellg();
	in.seekg(0, ios::beg);

	vector&lt;char&gt; buffer(length);	
	in.read(&amp;buffer[0], length);
	in.close();

	string strBuffer(buffer.cbegin(), buffer.cend());

	return strBuffer;
}
</code></pre>
<p>Problem: Bereits das eingelesene ist &quot;gecutted&quot; (= nur 21 zeichen).<br />
Hat es jemand mal mit der geposteten datei versucht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170659</guid><dc:creator><![CDATA[com_ptr&amp;lt;T&amp;gt;]]></dc:creator><pubDate>Fri, 20 Jan 2012 20:46:58 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 20:48:36 GMT]]></title><description><![CDATA[<p><code>ios::in || ios::binary</code> - da ist ein | zuviel.<br />
Flags verknüpft man mit <code>|</code> , nicht mit <code>||</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170661</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 20 Jan 2012 20:48:36 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 20:55:18 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960"><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a></a>:</p>
<p>Danke, sehr guter Punkt.<br />
Geht nun! <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>Vielen Dank nochmal an <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960"><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a></a> und 314159265358979!</p>
<p>Hoffe es ist nicht &lt;zu&gt; tragisch, dass wir etwas vom Thema abgeschweift sind.<br />
Aber man sieht immer wieder, was fuer ein &quot;riesen Rattenschwanz&quot; hinter vermeintlich &quot;einfachen&quot; fragen liegt. <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="😃"
    /> Euch noch einen schoenen Abend!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170666</guid><dc:creator><![CDATA[com_ptr&amp;lt;T&amp;gt;]]></dc:creator><pubDate>Fri, 20 Jan 2012 20:55:18 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 20:58:18 GMT]]></title><description><![CDATA[<p>Wie wärs mit dem:</p>
<pre><code class="language-cpp">const std::string ShaderManager::loadCompiledShader(const std::string&amp; name)
{
  std::ifstream in(name.c_str(), ios::in | ios::binary);
  return std::string((std::istreambuf_iterator&lt;char&gt;(in)),
                     std::istreambuf_iterator&lt;char&gt;());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2170669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170669</guid><dc:creator><![CDATA[rattenschwanz]]></dc:creator><pubDate>Fri, 20 Jan 2012 20:58:18 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 21:03:23 GMT]]></title><description><![CDATA[<p><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/2170671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170671</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 20 Jan 2012 21:03:23 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 21:36:05 GMT]]></title><description><![CDATA[<p><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>
<p>rattenschwanz schrieb:</p>
<blockquote>
<p>Wie wärs mit dem:</p>
<pre><code class="language-cpp">const std::string ShaderManager::loadCompiledShader(const…
</code></pre>
</blockquote>
<p>Ich habe nur eine Sache anzumeckern: Das <code>const</code> beim Rückgabetyp sollte weg.</p>
<p>(Wenn Du mir jetzt mit &quot;Aber Scott Meyers schreibt, dass...&quot; kommst, dann kann ich Dich beruhigen. Der würde das heute, zu Zeiten von C++2011 auch nicht mehr vorschlagen. Das gibt es sogar quasi Schwarz auf Weiß irgendwo in einer der englischen C++ Usenet Gruppen. Ich bin nur zu faul, es rauszusuchen…) <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>Warum macht das const dort heute noch weniger Sinn als früher? Weil es &quot;move semantics&quot; verhindert und zu unnötigen Kopien führen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170685</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 20 Jan 2012 21:36:05 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 21:53:34 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Ich habe nur eine Sache anzumeckern: Das <code>const</code> beim Rückgabetyp sollte weg.</p>
</blockquote>
<p>Die Funktionssignatur hab ich so von com_ptr&lt;T&gt; übernommen, ich selber würde das nie in eine Memberfunktion stecken.</p>
<p>Aber kannst du mir erklären, wieso das const move semantics verhindert?</p>
<p>Ich habs mit dem GCC getestet und das Objekt wird genau einmal erzeugt (also genau ein Destruktoraufruf). Schreibe ich return std::move(std::string(...)) hin, gibt es zwei Destruktoraufrufe (einmal Movekonstruktor), aber unabhängig vom const.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170694</guid><dc:creator><![CDATA[rattenschwanz]]></dc:creator><pubDate>Fri, 20 Jan 2012 21:53:34 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 22:10:27 GMT]]></title><description><![CDATA[<p>Der Move-Konstruktor sieht ganz einfach so aus:</p>
<pre><code class="language-cpp">string::string(string&amp;&amp;);
</code></pre>
<p>Und weil das keine Referenz-auf-const ist als Parameter, kann der move-ctor auch nicht verwendet werden, wenn Du ein &quot;const string&quot; als Quelle hast.</p>
<p>Dass da u.U. &quot;nur einmal&quot; etwas erzeugt wird, kann daran liegen, dass der GCC &quot;copy elisions&quot; durchführt, sofern möglich -- also die Notwendigkeit eines Kopierens bzw Movens minimiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170698</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 20 Jan 2012 22:10:27 GMT</pubDate></item><item><title><![CDATA[Reply to char* aus funktionsrueckgabewert on Fri, 20 Jan 2012 22:57:30 GMT]]></title><description><![CDATA[<p>Der Unterschied wird offenbar, wenn zugewiesen wird.<br />
(Man könnte auf die Idee kommen, einen Zuweisungsoperator der Form foo&amp; operator(foo) zu verwenden, dann ist move immer möglich... seit der Einführung von noexcept ist das allerdings eine sehr schlechte Idee, da move dann möglicherweise Exceptions wirft, und die Standardbibliothek darauf allergisch reagieren könnte...</p>
<p>Und auch ohne noexcept sollte eine Klasse mit so einem Zuweisungsoperator besser nicht als Member einer anderen Klasse eingesetzt werden, <em>die</em> kann dann nämlich ebenfalls nicht ordentlich gemoved werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170704</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 20 Jan 2012 22:57:30 GMT</pubDate></item></channel></rss>