<?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[Einfacher shared_ptr-Ersatz?]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe hier fertigen Code, der auch auf einem Embedded-Board laufen soll. Die Portierung ist fast fertig, ich hänge nur an einem letzten Problem: ich benötige einen einfachen Ersatz für einen shared_ptr. Boost kann ich nicht verwenden, da der Compiler für dieses Board ziemlich antik ist.</p>
<p>Also benötige ich eine eigene Implementierung. Templates sind nicht notwendig, da dieser eigene shared_ptr mit genau einem Datentyp funktionieren soll.</p>
<p>Hat jemand einen Tipp, wo man so eine _getestete_ Ersatzimplementierung finden kann?</p>
<p>!Zurg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/314749/einfacher-shared_ptr-ersatz</link><generator>RSS for Node</generator><lastBuildDate>Sat, 01 Aug 2026 00:31:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/314749.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 12 Mar 2013 18:16:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Einfacher shared_ptr-Ersatz? on Tue, 12 Mar 2013 18:16:32 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe hier fertigen Code, der auch auf einem Embedded-Board laufen soll. Die Portierung ist fast fertig, ich hänge nur an einem letzten Problem: ich benötige einen einfachen Ersatz für einen shared_ptr. Boost kann ich nicht verwenden, da der Compiler für dieses Board ziemlich antik ist.</p>
<p>Also benötige ich eine eigene Implementierung. Templates sind nicht notwendig, da dieser eigene shared_ptr mit genau einem Datentyp funktionieren soll.</p>
<p>Hat jemand einen Tipp, wo man so eine _getestete_ Ersatzimplementierung finden kann?</p>
<p>!Zurg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306222</guid><dc:creator><![CDATA[Zurg]]></dc:creator><pubDate>Tue, 12 Mar 2013 18:16:32 GMT</pubDate></item><item><title><![CDATA[Reply to Einfacher shared_ptr-Ersatz? on Tue, 12 Mar 2013 18:43:33 GMT]]></title><description><![CDATA[<p>Du schreibst dir eine Klasse, die als Datenmember einen size_t count; und einen typ *data; hat.<br />
Im Konstruktor wird Speicher angefordert und count erhöht. Im Destruktor wird count erniedrigt und wenn count 0 ist, der Speicher freigegeben. Im Copy-Konstruktor/Zuweisung wird count erhöht und kopiert. Flache Kopie beim Pointer!<br />
Dann schreibst du dir noch die getter/setter, die du brauchst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306227</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Tue, 12 Mar 2013 18:43:33 GMT</pubDate></item><item><title><![CDATA[Reply to Einfacher shared_ptr-Ersatz? on Tue, 12 Mar 2013 18:46:24 GMT]]></title><description><![CDATA[<p>Über wie antik reden wir? Kennt er überhaupt Templates?</p>
<p>Es gibt <a href="http://www.boost.org/doc/libs/1_53_0/tools/bcp/doc/html/index.html" rel="nofollow">BCP</a> zum Extrahieren einzelner Codeteile von Boost, wenn dir die gesamte Bibliothek zu groß ist. Ansonsten sehe ich eher schwarz für dich, da die Anforderungen doch schon etwas speziell sind. Andererseits, auch wenn du diese Antwort nicht haben willst, ist ein shared_ptr für genau eine Klasse kein Hexenwerk, wenn du nur einen Referenzzähler und einen operator* anzubieten brauchst. Schwieriger wirds erst bei Multithreading und das brauchst du nicht, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306229</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Tue, 12 Mar 2013 18:46:24 GMT</pubDate></item><item><title><![CDATA[Reply to Einfacher shared_ptr-Ersatz? on Tue, 12 Mar 2013 18:49:58 GMT]]></title><description><![CDATA[<p>Ich würde einen selber schreiben. &quot;Echte&quot; <code>shared_ptr</code> sind auf Multithreading ausgelegt und deswegen langsam. Wenn du weisst, dass alles in einem Thread passiert, kannst du ruhig eine naive Implementierung selber vornehmen. <code>weak_ptr</code> brauchst du vermutlich auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306231</guid><dc:creator><![CDATA[malti]]></dc:creator><pubDate>Tue, 12 Mar 2013 18:49:58 GMT</pubDate></item><item><title><![CDATA[Reply to Einfacher shared_ptr-Ersatz? on Tue, 12 Mar 2013 19:31:00 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Über wie antik reden wir? Kennt er überhaupt Templates?</p>
</blockquote>
<p>Im Prinzip ja, aber da würde ich auf keine vollständig funktionierende Implementierung hoffen. Aber das ist ja auch kein Problem, da mein shared_ptr ja auch nur mit genau einem Datentypen umgehen können muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306247</guid><dc:creator><![CDATA[Zurg]]></dc:creator><pubDate>Tue, 12 Mar 2013 19:31:00 GMT</pubDate></item><item><title><![CDATA[Reply to Einfacher shared_ptr-Ersatz? on Tue, 12 Mar 2013 19:48:56 GMT]]></title><description><![CDATA[<p>Zurg schrieb:</p>
<blockquote>
<p>Michael E. schrieb:</p>
<blockquote>
<p>Über wie antik reden wir? Kennt er überhaupt Templates?</p>
</blockquote>
<p>Im Prinzip ja, aber da würde ich auf keine vollständig funktionierende Implementierung hoffen. Aber das ist ja auch kein Problem, da mein shared_ptr ja auch nur mit genau einem Datentypen umgehen können muss.</p>
</blockquote>
<p>Naja, ein Problem ist es insofern, dass praktisch jede Implementierung Templates benutzen dürfte, d.h. du darfst sowieso nochmal Hand anlegen. Dann würde ich wirklich selbst implementieren und drei Tests dazu schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306259</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Tue, 12 Mar 2013 19:48:56 GMT</pubDate></item><item><title><![CDATA[Reply to Einfacher shared_ptr-Ersatz? on Tue, 12 Mar 2013 19:51:58 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Du schreibst dir eine Klasse, die als Datenmember einen size_t count; und einen typ *data; hat.<br />
Im Konstruktor wird Speicher angefordert und count erhöht. Im Destruktor wird count erniedrigt und wenn count 0 ist, der Speicher freigegeben. Im Copy-Konstruktor/Zuweisung wird count erhöht und kopiert. Flache Kopie beim Pointer!<br />
Dann schreibst du dir noch die getter/setter, die du brauchst.</p>
</blockquote>
<p>So schwierig ist der nun auch wieder nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306261</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Tue, 12 Mar 2013 19:51:58 GMT</pubDate></item><item><title><![CDATA[Reply to Einfacher shared_ptr-Ersatz? on Tue, 12 Mar 2013 20:27:42 GMT]]></title><description><![CDATA[<p>OK, prinzipiell funktioniert es. Aber: Bei Shared Pointer Objekten kann ich mit</p>
<pre><code>if (mySharedPtr)
 ...
</code></pre>
<p>auf Gültigkeit des gekapselten Pointers überprüfen. Wie implementiere ich das denn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306277</guid><dc:creator><![CDATA[Zurg]]></dc:creator><pubDate>Tue, 12 Mar 2013 20:27:42 GMT</pubDate></item><item><title><![CDATA[Reply to Einfacher shared_ptr-Ersatz? on Tue, 12 Mar 2013 20:32:10 GMT]]></title><description><![CDATA[<p>du musst operator (bool) implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306279</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Tue, 12 Mar 2013 20:32:10 GMT</pubDate></item><item><title><![CDATA[Reply to Einfacher shared_ptr-Ersatz? on Wed, 13 Mar 2013 10:55:48 GMT]]></title><description><![CDATA[<p>Maxi schrieb:</p>
<blockquote>
<p>du musst operator (bool) implementieren.</p>
</blockquote>
<p>Bei einem alten Compiler dann doch lieber das &quot;Safe-Bool-Idiom&quot; verwenden (siehe z.B. <a href="http://www.artima.com/cppsource/safebool.html" rel="nofollow">hier</a>)</p>
<p>Naiv den operator bool zu überladen kann unerwartete Ergebnisse hervorbringen <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>In C++11 wurde das durch explicit gefixt (siehe <a href="http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_conversion_operators" rel="nofollow">Wikipedia</a>)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306368</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Wed, 13 Mar 2013 10:55:48 GMT</pubDate></item><item><title><![CDATA[Reply to Einfacher shared_ptr-Ersatz? on Wed, 13 Mar 2013 14:19:51 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Du schreibst dir eine Klasse, die als Datenmember einen size_t count; und einen typ *data; hat.<br />
Im Konstruktor wird Speicher angefordert und count erhöht. Im Destruktor wird count erniedrigt und wenn count 0 ist, der Speicher freigegeben. Im Copy-Konstruktor/Zuweisung wird count erhöht und kopiert. Flache Kopie beim Pointer!<br />
Dann schreibst du dir noch die getter/setter, die du brauchst.</p>
</blockquote>
<p>Das ist aber falsch. Wenn Du eine Kopie des shared pointers machst, dann muss die Kopie auf den selben Zähler zeigen. So hast Du eine Kopie des Zählers. Beide shares pointer haben einen Zählerstand von 2 und wenn der eine gelöscht wird, dekrementiert er seinen auf 1 und löscht das Objekt nicht und wenn der andere gelöscht wird, dekrementiert er eben seinen auf 1 und löscht das Objekt ebenfalls nicht.</p>
<p>Du musst beim Erzeugen eines shared pointers einen Zähler separat alloziieren und darauf verweisen. Beim kopieren verweisen dann beide auf den selben Zähler. Wird der Zähler bei löschen des shared pointers 0, muss der shared pointer sowohl das Objekt als auch den Zähler löschen.</p>
<p>Es gibt verschiedene Varianten, wie man auf die zusätzliche Allokation verzichten kann, aber das macht die Sache meist komplizierter. Im einfachsten Fall kannst Du allerdings das Objekt, welches referenziert wird, um einem Referenzzähler erweitern. Dann wird das sogar noch robuster.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306415</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Wed, 13 Mar 2013 14:19:51 GMT</pubDate></item><item><title><![CDATA[Reply to Einfacher shared_ptr-Ersatz? on Wed, 13 Mar 2013 14:43:36 GMT]]></title><description><![CDATA[<p>Oh stimmt ja.<br />
Beide brauchen den gleichen Zähler.<br />
Sry, mein Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306419</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 13 Mar 2013 14:43:36 GMT</pubDate></item><item><title><![CDATA[Reply to Einfacher shared_ptr-Ersatz? on Wed, 13 Mar 2013 14:47:18 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Es gibt verschiedene Varianten, wie man auf die zusätzliche Allokation verzichten kann, aber das macht die Sache meist komplizierter.</p>
</blockquote>
<p>Das Problem tritt ja bei</p>
<pre><code>std::shared_ptr&lt;T&gt; ptr(new T(args));
</code></pre>
<p>auf, wo wir für das Objekt und für den Reference Counter zwei Mal <code>new</code> brauchen. Darum gibts auch das sehr elegante</p>
<pre><code>auto ptr = std::make_shared&lt;T&gt;(args);
</code></pre>
<p>Wenn du deinen Shared-Pointer auf genau einen Typen auslegst, musst du den Konstruktor mit einem <code>T*</code> gar nicht anbieten, sondern kannst direkt dessen Konstruktorargumente übergeben. Damit hast du wiederum die Möglichkeit, das Objekt intern zu erstellen, und zwar gleich zusammen mit dem Reference Counter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306420</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 13 Mar 2013 14:47:18 GMT</pubDate></item><item><title><![CDATA[Reply to Einfacher shared_ptr-Ersatz? on Wed, 13 Mar 2013 22:20:52 GMT]]></title><description><![CDATA[<p>Zurg schrieb:</p>
<blockquote>
<p>Hat jemand einen Tipp, wo man so eine _getestete_ Ersatzimplementierung finden kann?</p>
</blockquote>
<p>Hallo Zurg,</p>
<p>ich hatte vor Jahren mal so was gebaut ... das sollte auch funktionieren:</p>
<pre><code>template&lt; typename T &gt;
    class shared_ptr
    {
    public:
        explicit shared_ptr( T* p = 0 )
            : m_ptr( p )
            , m_ref_count( new int(1) )
        {}
        shared_ptr( const shared_ptr&amp; b )
            : m_ptr( b.m_ptr )
            , m_ref_count( b.m_ref_count )
        {
            ++*m_ref_count;
        }
        ~shared_ptr()
        {
            if( --*m_ref_count == 0 )
            {
                delete m_ref_count;
                delete m_ptr;
            }
        }

        shared_ptr&amp; operator=( const shared_ptr&amp; b )
        {
            shared_ptr tmp( b );
            swap( tmp );
            return *this;
        }

        void swap( shared_ptr&amp; b )
        {
            std::swap( m_ptr, b.m_ptr );
            std::swap( m_ref_count, b.m_ref_count );
        }

        void reset( T* p = 0 )
        {
            shared_ptr tmp( p );
            swap( tmp );
        }

        // --   Pointer Access
        T* operator-&gt;() const
        {
            assert( m_ptr );
            return m_ptr;
        }
        T&amp; operator*() const
        {
            assert( m_ptr );
            return *m_ptr;
        }
        T* get() const
        {
            return m_ptr;
        }
        operator const void*() const
        {
            return m_ptr? this: 0;
        }
        bool operator!() const
        {
            return m_ptr == 0;
        }

    private:
        T* m_ptr;
        int* m_ref_count;
    };

    template&lt; typename T &gt;
    void swap( shared_ptr&lt; T &gt;&amp; a, shared_ptr&lt; T &gt;&amp; b )
    {
        a.swap( b );
    }
</code></pre>
<p>benötigt includes &lt;cassert&gt; und &lt;algorithm&gt; - für std::swap.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306518</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 13 Mar 2013 22:20:52 GMT</pubDate></item></channel></rss>