<?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[Wann wird das Objekt zerstört? Und noch eine Stilfrage]]></title><description><![CDATA[<p>Hi</p>
<p>Ich versuche mich gerade an einer polyalphabetischen Verschlüsselung. Ich habe in meinem Programm eine Funktion zum Verschlüsseln, bei der ich nicht ganz sicher bin, ob ich den string mit new erzeugen muss, wenn ich ihn als Referenz zurückgebe.</p>
<p>Im Moment sieht meine Funktion so aus:</p>
<pre><code class="language-cpp">std::string &amp; encrypt( const std::string &amp; text_to_encrypt )
	{

		std::string * encrypted_text = new std::string;

		// Miscellaneous

		return *encrypted_text;
	}
</code></pre>
<p>Hier bin ich mir sicher, dass encrypted_text auch nach Beendigung der Funktion bestehen bleibt.</p>
<p>Meine Frage ist nun, ob es auch ohne new gehen würde, so:</p>
<pre><code class="language-cpp">std::string &amp; encrypt( const std::string &amp; text_to_encrypt )
	{

		std::string * encrypted_text;

		// Miscellaneous

		return *encrypted_text;
	}
</code></pre>
<p>Meiner Meinung nach geht das nicht weil die Variable gelöscht wird und man eine Referenz auf den gelöschten Speicher hat ==&gt; undefined behavior.</p>
<p>Dann habe ich noch eine kleine Stilfrage:<br />
Wenn ihr über einen Funktionsaufruf z.B. den Schlüssel für die Verschlüsselung bekommen wollt. Welche Funktionsdeklaration bevorzugt ihr oder was ist das übliche in C++?</p>
<ol>
<li></li>
</ol>
<pre><code class="language-cpp">void get_encryption_key( std::string &amp; key );
</code></pre>
<ol start="2">
<li></li>
</ol>
<pre><code class="language-cpp">std::string &amp; get_encryption_key();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/271638/wann-wird-das-objekt-zerstört-und-noch-eine-stilfrage</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 09:22:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/271638.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 01 Aug 2010 13:51:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wann wird das Objekt zerstört? Und noch eine Stilfrage on Sun, 01 Aug 2010 13:51:59 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Ich versuche mich gerade an einer polyalphabetischen Verschlüsselung. Ich habe in meinem Programm eine Funktion zum Verschlüsseln, bei der ich nicht ganz sicher bin, ob ich den string mit new erzeugen muss, wenn ich ihn als Referenz zurückgebe.</p>
<p>Im Moment sieht meine Funktion so aus:</p>
<pre><code class="language-cpp">std::string &amp; encrypt( const std::string &amp; text_to_encrypt )
	{

		std::string * encrypted_text = new std::string;

		// Miscellaneous

		return *encrypted_text;
	}
</code></pre>
<p>Hier bin ich mir sicher, dass encrypted_text auch nach Beendigung der Funktion bestehen bleibt.</p>
<p>Meine Frage ist nun, ob es auch ohne new gehen würde, so:</p>
<pre><code class="language-cpp">std::string &amp; encrypt( const std::string &amp; text_to_encrypt )
	{

		std::string * encrypted_text;

		// Miscellaneous

		return *encrypted_text;
	}
</code></pre>
<p>Meiner Meinung nach geht das nicht weil die Variable gelöscht wird und man eine Referenz auf den gelöschten Speicher hat ==&gt; undefined behavior.</p>
<p>Dann habe ich noch eine kleine Stilfrage:<br />
Wenn ihr über einen Funktionsaufruf z.B. den Schlüssel für die Verschlüsselung bekommen wollt. Welche Funktionsdeklaration bevorzugt ihr oder was ist das übliche in C++?</p>
<ol>
<li></li>
</ol>
<pre><code class="language-cpp">void get_encryption_key( std::string &amp; key );
</code></pre>
<ol start="2">
<li></li>
</ol>
<pre><code class="language-cpp">std::string &amp; get_encryption_key();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1934738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934738</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sun, 01 Aug 2010 13:51:59 GMT</pubDate></item><item><title><![CDATA[Reply to Wann wird das Objekt zerstört? Und noch eine Stilfrage on Sun, 01 Aug 2010 14:07:00 GMT]]></title><description><![CDATA[<p>Deine Referenzen bringen gar nix. Du holst dir da nen richtig schönen MemoryLeak...</p>
<pre><code class="language-cpp">std::string encrypt( const std::string &amp; text_to_encrypt )
    {

        std::string encrypted_text;

        // Miscellaneous

        return encrypted_text;
    }
</code></pre>
<p>Und gut ist. Hast zwar eine Kopie, aber dafür bist du safe unterwegs.<br />
Wenn du unbedingt diese Kopie vermeiden willst, dann gib gleich den Pointer zurück, und schreib bei der Doku dazu &quot;the user is responsible for destruction&quot;.<br />
Die zweite Variante ist genau die gleiche wie die erste, nur dass du den Pointer nicht initialisierst...</p>
<p>Zur Stilfrage:<br />
wenn du nen getter hast, gib doch was zurück. Die Variante &quot;return über Parameter&quot; nimmt man hauptsächlich dann, wenn man mehrere return values hat (soll schonmal vorkommen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934741</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sun, 01 Aug 2010 14:07:00 GMT</pubDate></item><item><title><![CDATA[Reply to Wann wird das Objekt zerstört? Und noch eine Stilfrage on Sun, 01 Aug 2010 14:08:09 GMT]]></title><description><![CDATA[<p>Da encrypted_text ein Zeiger im automatischen Speicher ist, bleibt der natürlich NICHT nach Beendigung der Funktion weiter bestehen. Aber das, worauf dieser Zeiger zeigt(e), hast du ja selbst per new angelegt und muss daher auch irgendwann per delete wieder gelöscht werden.</p>
<p>Ohne new geht es natürlich auch und so solltest Du es machen:</p>
<pre><code class="language-cpp">string encrypt(string in)
{
  string out;
  out.swap(in);
  // out in-place verändern
  return out;
}
</code></pre>
<p>(dies kann ganz besonders gut von modernen Compilern optimiert werden, so dass kein unnötiges Kopieren anfällt).</p>
<p>Antwort zur Stilfrage:<br />
DRITTENS. Nämlich Rückgabe von std::string (keine Referenz, kein Zeiger!)</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934742</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 01 Aug 2010 14:08:09 GMT</pubDate></item><item><title><![CDATA[Reply to Wann wird das Objekt zerstört? Und noch eine Stilfrage on Sun, 01 Aug 2010 14:09:13 GMT]]></title><description><![CDATA[<p>die meisten compiler sind auch in der lage, die unnötige kopie wegzuoptimieren - also über die geschwindigkeit solltest du dir da keine gedanken machen.</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934743</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 01 Aug 2010 14:09:13 GMT</pubDate></item><item><title><![CDATA[Reply to Wann wird das Objekt zerstört? Und noch eine Stilfrage on Sun, 01 Aug 2010 14:09:24 GMT]]></title><description><![CDATA[<p>icarus2 schrieb:</p>
<blockquote>
<p>Meiner Meinung nach geht das nicht weil die Variable gelöscht wird und man eine Referenz auf den gelöschten Speicher hat ==&gt; undefined behavior.</p>
</blockquote>
<p>Das hängt davon ab, was in <code>// Miscellanous</code> passiert. Du darfst ohnehin keinen nicht initialisierten Zeiger dereferenzieren, daher müsstest du ihn entweder auf den Parameter zeigen lassen oder dynamisch Speicher anfordern. In dem Falle wäre es okay. Aber warum benutzt du nicht den automatischen Speicher, also sowas?</p>
<pre><code class="language-cpp">std::string encrypted_text;
</code></pre>
<p>icarus2 schrieb:</p>
<blockquote>
<p>Wenn ihr über einen Funktionsaufruf z.B. den Schlüssel für die Verschlüsselung bekommen wollt. Welche Funktionsdeklaration bevorzugt ihr oder was ist das übliche in C++?</p>
</blockquote>
<p>Keins von beiden, sondern so:</p>
<pre><code class="language-cpp">std::string get_encryption_key();
</code></pre>
<p>Und wenn dein Compiler kein RVO kann und die Kopie <strong>wirklich</strong> ein Problem darstellen sollte, kannst du immer noch die Version mit dem Output-Parameter oder</p>
<pre><code class="language-cpp">std::auto_ptr&lt;std::string&gt; get_encryption_key();
</code></pre>
<p>nehmen.</p>
<p>Allerdings würde ich eine Methode, die nichts zurückgibt, nicht &quot;get&quot; nennen. Der Output-Parameter macht ausserdem die Verwendung in anderen Ausdrücken komplizierter.</p>
<pre><code class="language-cpp">save_string(get_encryption_key());
</code></pre>
<p>vs.</p>
<pre><code class="language-cpp">std::string key;
compute_encryption_key(key);
save_string(key);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1934744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934744</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 01 Aug 2010 14:09:24 GMT</pubDate></item><item><title><![CDATA[Reply to Wann wird das Objekt zerstört? Und noch eine Stilfrage on Sun, 01 Aug 2010 14:10:54 GMT]]></title><description><![CDATA[<p>Jap, ich glaube ich werde die Kopie nehmen. Ist sicherer.</p>
<p>Mir ist das mit dem Rückgabetyp auch lieber. Werd ich ab jetzt so machen.</p>
<p>Danke für eure Antworten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934745</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sun, 01 Aug 2010 14:10:54 GMT</pubDate></item></channel></rss>