<?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[auto_ptr als Kennzeichnung der Objektverantwortung]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>häufig ist es ja nicht leicht zu verdeutlichen, dass der Aufrufer<br />
für das zurückgelieferte Objekt verantwortlich ist und es löschen muss.</p>
<p>Jetzt habe ich gerade in einem Beitrag von Nexus<br />
folgendes gesehen:</p>
<pre><code class="language-cpp">std::auto_ptr&lt;std::string&gt; get_encryption_key();
</code></pre>
<p>Haltet ihr sowas für stilistisch schön, oder verzichtet ihr eher drauf<br />
und macht Namenskonventionen wie get...() und create...()?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/271646/auto_ptr-als-kennzeichnung-der-objektverantwortung</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 07:51:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/271646.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 01 Aug 2010 16:24:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to auto_ptr als Kennzeichnung der Objektverantwortung on Sun, 01 Aug 2010 16:24:24 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>häufig ist es ja nicht leicht zu verdeutlichen, dass der Aufrufer<br />
für das zurückgelieferte Objekt verantwortlich ist und es löschen muss.</p>
<p>Jetzt habe ich gerade in einem Beitrag von Nexus<br />
folgendes gesehen:</p>
<pre><code class="language-cpp">std::auto_ptr&lt;std::string&gt; get_encryption_key();
</code></pre>
<p>Haltet ihr sowas für stilistisch schön, oder verzichtet ihr eher drauf<br />
und macht Namenskonventionen wie get...() und create...()?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934788</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 01 Aug 2010 16:24:24 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr als Kennzeichnung der Objektverantwortung on Sun, 01 Aug 2010 16:47:25 GMT]]></title><description><![CDATA[<p>Wenn eine Funktion ein Objekt erzeugt und zurückgibt (und dies nicht anderweitig verwaltet wird), dann fängt die bei mir meist mit create... an.</p>
<p>Da du einen auto_ptr zurückgibst, ist die Situation sowieso klar, egal wie die Funktion nun heißt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934797</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Sun, 01 Aug 2010 16:47:25 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr als Kennzeichnung der Objektverantwortung on Sun, 01 Aug 2010 17:03:14 GMT]]></title><description><![CDATA[<p>Athar schrieb:</p>
<blockquote>
<p>Da du einen auto_ptr zurückgibst, ist die Situation sowieso klar, egal wie die Funktion nun heißt.</p>
</blockquote>
<p>Meine Frage war eigentlich, ob ihr sowas zur Verdeutlichung verwedet. <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="😉"
    /> (EDIT: bzw. sollte sein)<br />
Also impliziere ich, dass es, wenn man einen auto_ptr verwendet, auch klar sein sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934800</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 01 Aug 2010 17:03:14 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr als Kennzeichnung der Objektverantwortung on Sun, 01 Aug 2010 17:11:02 GMT]]></title><description><![CDATA[<p>Wenn sich die Frage auf auto_ptr bezog:<br />
Sicher! Damit muss sich der Aufrufer nicht mehr selbst um das Löschen kümmern, er <em>kann</em> aber, da man dem auto_ptr die Kontrolle über den Zeiger auch wieder &quot;entreißen&quot; kann.</p>
<p>Edit: Den Typ schreibe ich meist auch in Headern nicht aus, stattdessen verwende ich typedefs mit einem dem Klassennamen vorangestelltem A (bzw. S bei shared_ptr).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934801</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Sun, 01 Aug 2010 17:11:02 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr als Kennzeichnung der Objektverantwortung on Sun, 01 Aug 2010 17:10:20 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>Jetzt habe ich gerade in einem Beitrag von Nexus<br />
folgendes gesehen:</p>
<pre><code class="language-cpp">std::auto_ptr&lt;std::string&gt; get_encryption_key();
</code></pre>
<p>Haltet ihr sowas für stilistisch schön, oder verzichtet ihr eher drauf<br />
und macht Namenskonventionen wie get...() und create...()?</p>
</blockquote>
<p>In dem konkreten Beispiel hätte ich den String wohl by value geliefert. Der hat schließlich schon selbst eine Speicherverwaltung.</p>
<p>Grundsätzlich aber finde ich die Rückgabe eines auto_ptr besser/schöner, als per Namenskonvention festzulegen, dass z.B. das Präfix &quot;create&quot; bedeutet, dass der Aufrufer für den Speicher verantwortlich ist. Bei Verwendung eines auto_ptr wird das Objekt garantiert entsorgt, bei Namenskonventionen gibt es zu viele Fehlermöglichkeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934802</guid><dc:creator><![CDATA[Grautvornix]]></dc:creator><pubDate>Sun, 01 Aug 2010 17:10:20 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr als Kennzeichnung der Objektverantwortung on Sun, 01 Aug 2010 17:44:57 GMT]]></title><description><![CDATA[<p>Ich gebe von meinen create_*()-Funktionen eigentlich immer Smartpointer zurück, wenn ich dem Nutzer schon den Genuss eines stinknormalen Stack-Konstruktoraufruf nicht bieten kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934812</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Sun, 01 Aug 2010 17:44:57 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr als Kennzeichnung der Objektverantwortung on Sun, 01 Aug 2010 18:13:06 GMT]]></title><description><![CDATA[<p>Ich verwende new/delete sehr selten. Im aktuellen Projekt gibt es eine Stelle, an der ich es nutze. Eine &quot;AbstractFactory&quot; liefert mir da einen auto_ptr&lt;ABC&gt; zurück. Das habe ich auch aus dem Grund gemacht, damit es klar ist, wie die &quot;Besitzverhältnisse&quot; aussehen.</p>
<p>Ich freue mich schon auf die C++0x Features. Mit &quot;move semantics&quot; sollte &quot;pass-by-value&quot; populärer werden. Außerdem kann man auto_ptr durch den sichereren und flexibleren unique_ptr ersetzen.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934818</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 01 Aug 2010 18:13:06 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr als Kennzeichnung der Objektverantwortung on Mon, 02 Aug 2010 07:34:13 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>Haltet ihr sowas für stilistisch schön, oder verzichtet ihr eher drauf<br />
und macht Namenskonventionen wie get...() und create...()?</p>
</blockquote>
<p>Das war mehr ein Beispiel, genau so habe ich <code>std::auto_ptr</code> eigentlich noch nie verwendet. Gerade für Getter gebe ich oft Werte (bei skalaren Typen und kleineren Klassen) bzw. Const-Referenzen (bei grösseren Klassen wie <code>std::string</code> ) zurück, hierbei ist ja auch keine Move-Semantik erwünscht. Für Factory-Methoden scheint mir <code>std::auto_ptr</code> aber ein durchaus gangbarer Weg zu sein. Jedoch würde ich nicht behaupten, besitzende rohe Zeiger zurückzugeben sei generell falsch. Wenn das API gut dokumentiert ist, kann man z.B. für <code>CreateXY()</code> ein <code>DestroyXY()</code> -Äquivalent anbieten. Allerdings sind Smart-Pointer oft einfach praktisch.</p>
<p>Grautvornix schrieb:</p>
<blockquote>
<p>In dem konkreten Beispiel hätte ich den String wohl by value geliefert. Der hat schließlich schon selbst eine Speicherverwaltung.</p>
</blockquote>
<p>Im <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-271638.html" rel="nofollow">anderen Thread</a> habe ich den Vorschlag für den Fall gebracht, dass RVO nicht funktioniere und die Kopie ein tatsächliches Geschwindigkeitsproblem sei. Ich habe da auch die Wert-Rückgabe favorisisert.</p>
<p>Grautvornix schrieb:</p>
<blockquote>
<p>Grundsätzlich aber finde ich die Rückgabe eines auto_ptr besser/schöner, als per Namenskonvention festzulegen, dass z.B. das Präfix &quot;create&quot; bedeutet, dass der Aufrufer für den Speicher verantwortlich ist. Bei Verwendung eines auto_ptr wird das Objekt garantiert entsorgt, bei Namenskonventionen gibt es zu viele Fehlermöglichkeiten.</p>
</blockquote>
<p>Da stimme ich zum Teil zu. Ein wichtiger Vorteil der Smart-Pointer besteht sicherlich darin, dass man ihnen die Besitzverhältnisse gut ansieht. Dadurch kann man damit Schnittstellen implizit aussagekräftiger machen. Andererseits schränkt man den Benutzer auch ein, beispielsweise geht die Möglichkeit kovarianter Rückgabewert verloren. Bei <code>shared_ptr</code> verliert man zudem die Freiheit, auf einen anderen Smart-Pointer umzusteigen, während es <code>auto_ptr::release()</code> einfacher macht. Ich habe allerdings schon ab und zu <code>shared_ptr</code> in Code gesehen, wo ein anderer Smart-Pointer (oft <code>scoped_ptr</code> oder <code>auto_ptr</code> ) sich besser eignen würde.</p>
<p>Allerdings stören mich zwei Dinge an <code>std::auto_ptr</code> , die durch eine eigene Implementierung im momentanen Standard behoben werden könnten, im Gegensatz zur von krümelkacker angesprochenen Verbesserung durch <code>std::unique_ptr</code> . Erstens ist keine Methode vorhanden, um den Zeiger auf Validität zu prüfen (z.B. Konvertierungsoperator zu <code>bool</code> -ähnlichem Typ). Dies ist zwar über die Methode <code>get()</code> möglich, allerdings ist deren Aufgabe primär, den internen Zeiger zurückzugeben. Ein Stück weit verletzt man dadurch auch die Kapselung und drückt explizit aus, dass man am konkreten Wert des Zeigers interessiert ist, und nicht nur an der Gleichheit zu <code>NULL</code> . Zweitens ist der momentane <code>std::auto_ptr</code> potentiell unsicher in der Verwendung: Wenn der Pointee-Typ <code>T</code> bei der <code>auto_ptr&lt;T&gt;</code> -Deklaration nicht vollständig definiert ist, führt der Destruktor <code>auto_ptr::~auto_ptr()</code> zu undefiniertem Verhalten, da das Objekt ohne zerstört zu sein freigegeben wird. Hingegen würden Smart-Pointer, die mit unvollständig definierten Typen umgehen können, gerade dabei helfen, Projekt-Abhängigkeiten und damit die Kompilierzeit zu verringern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934972</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 02 Aug 2010 07:34:13 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr als Kennzeichnung der Objektverantwortung on Mon, 02 Aug 2010 08:57:16 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Allerdings stören mich zwei Dinge an <code>std::auto_ptr</code> , die durch eine eigene Implementierung im momentanen Standard behoben werden könnten, im Gegensatz zur von krümelkacker angesprochenen Verbesserung durch <code>std::unique_ptr</code> .</p>
</blockquote>
<p>Was genau meinst Du? Dass auto_ptr noch verbessert werden soll? Wozu? auto_ptr ist zugunsten von unique_ptr als &quot;deprecated&quot; gekennzeichnet worden.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Erstens ist keine Methode vorhanden, um den Zeiger auf Validität zu prüfen (z.B. Konvertierungsoperator zu <code>bool</code> -ähnlichem Typ).</p>
</blockquote>
<p>std::unique_ptr bietet dafür &quot;explicit operator bool() const&quot; an.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Zweitens ist der momentane <code>std::auto_ptr</code> potentiell unsicher in der Verwendung: Wenn der Pointee-Typ <code>T</code> bei der <code>auto_ptr&lt;T&gt;</code> -Deklaration nicht vollständig definiert ist, führt der Destruktor <code>auto_ptr::~auto_ptr()</code> zu undefiniertem Verhalten, da das Objekt ohne zerstört zu sein freigegeben wird. Hingegen würden Smart-Pointer, die mit unvollständig definierten Typen umgehen können, gerade dabei helfen, Projekt-Abhängigkeiten und damit die Kompilierzeit zu verringern.</p>
</blockquote>
<p>Bei unique_ptr gibt es ja dafür die Parametrisierung des &quot;Deleters&quot;:</p>
<pre><code class="language-cpp">class foo;

struct foo_deleter {
  void operator()(foo*) const; // irgendwo anders definiert,
                             // wo foo komplett bekannt ist
};

typedef std::unique_ptr&lt;foo,foo_deleter&gt; unique_foo_ptr;
</code></pre>
<p>Schade ist jedoch, dass man hier keine Elementfunktionen deklarieren kann, ohne verraten zu müssen, wie foo aufgebaut ist. Das muss man irgendwie umgehen, wenn man die Abhängigkeiten reduzieren will.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935028</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 02 Aug 2010 08:57:16 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr als Kennzeichnung der Objektverantwortung on Mon, 02 Aug 2010 11:33:01 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Was genau meinst Du? Dass auto_ptr noch verbessert werden soll? Wozu? auto_ptr ist zugunsten von unique_ptr als &quot;deprecated&quot; gekennzeichnet worden.</p>
</blockquote>
<p>Ich meinte mehr, dass man mit C++98-Mitteln bereits Dinge verbessern kann. Also falls man sich selbst einen Smart-Pointer mit Move-Semantik baut und vielleicht noch nicht bald auf C++0x umsteigen kann.</p>
<p>Die beiden entsprechenden Neuerungen in <code>unique_ptr</code> waren mir aber in der Tat unbekannt, vielen Dank für die Erläuterung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935114</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 02 Aug 2010 11:33:01 GMT</pubDate></item></channel></rss>