<?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[Problem bei Verwendung von share_ptr oder unique_ptr]]></title><description><![CDATA[<p>Guten Abend zusammen,</p>
<p>ich baue gerade einen Texturen Manager um habe extra eine Klasse Texture. Diese Soll die Texture beinhalten und gegebenfalls auch zeichnen.</p>
<p>Nun habe ich im Texture Manager eine std::map die mir die Texture Objekte festhalten soll.</p>
<p>Zuerst dachte ich, dass wenn ich unique_ptr benutze, ich den Vorteil habe, dass ich nicht jede Texture Instanz löschen muss, wenn ich den std::map bereinigen will.</p>
<p>Das Problem bei unique_ptr ist halt das ich beschränkten Zugriff darauf habe. Hab mich dann also für shared_ptr entschieden. Da ich zwischendurch auf die Texture Instanzen zugreifen möchte.</p>
<p>Nun ist es bei shared_ptr wohl so, dass sie eine eigene Ressource haben und eine 2. besitzen können. Was mich ein wenig verwirrt.</p>
<p>Ich möchte einfach nur eine std::map haben bei der ich auf die Instanzen auch zugreifen kann. Soweit ich weiß könnte ich den shared_ptr einer temporären Variable zuordnen, aber das ist mir auch irgendwie zu doof.</p>
<p>Hier mal etwas Code.</p>
<pre><code>class TextureManager
    {
    public:
        static TextureManager *instance();
        static void delInstance();

        /*
         * load Texture
         * -----------------------------------
         * Creates a Texture Object with the Texture and puts it in m_loadedTextures as unqiue_ptr
         */
        void loadTexture(Game *game, const std::string filename);

        /*
         * Destroy Map m_loadedTextures
         * -----------------------------------
         * Destroys all Texture Objects in the map and clear it completly
         */
        void destroyLoadedTextures();

    private:
        TextureManager();
        TextureManager(const TextureManager &amp;);
        ~TextureManager();

        static TextureManager *m_Instance;

        /*
         * Textures
         * ----------------------------
         * all Textures that are loaded are here
         */
        std::map&lt;std::string, std::shared_ptr&lt;Texture&gt;&gt; m_loadedTextures;

    };
</code></pre>
<pre><code>Ghuul::TextureManager *Ghuul::TextureManager::m_Instance = nullptr;

Ghuul::TextureManager *Ghuul::TextureManager::instance()
{
    if (m_Instance == nullptr)
        m_Instance = new TextureManager();
    return m_Instance;
}

void Ghuul::TextureManager::delInstance()
{
    if (m_Instance != nullptr)
        delete m_Instance;
    m_Instance = nullptr;
}

void Ghuul::TextureManager::loadTexture(Game *game, const std::string filename)
{
    std::shared_ptr&lt;Texture&gt; texture(new Texture());
    texture-&gt;load(game, filename);
    m_loadedTextures.insert(std::pair&lt;std::string, std::shared_ptr&lt;Texture&gt;&gt;(filename, texture));
}

void Ghuul::TextureManager::destroyLoadedTextures()
{
    m_loadedTextures.erase(m_loadedTextures.begin(), m_loadedTextures.end());
}
</code></pre>
<p>Kompiliert wird das ohne Probleme. Nur muss ich wohl momentan, wenn ich auf eine Texture Instanz zugreifen will, das hier machen (nicht getestet)</p>
<pre><code>std::shared_ptr&lt;Texture&gt; texture = m_loadedTextures.at(&quot;Image&quot;);
    texture-&gt;draw();
</code></pre>
<p>Wir dort der Speicher wirklich geteilt? Wenn ich jetzt draw aufrufe, gilt das wirklich für das Objekt im std::map?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/340089/problem-bei-verwendung-von-share_ptr-oder-unique_ptr</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 15:20:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/340089.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 18 Oct 2016 23:02:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem bei Verwendung von share_ptr oder unique_ptr on Tue, 18 Oct 2016 23:02:33 GMT]]></title><description><![CDATA[<p>Guten Abend zusammen,</p>
<p>ich baue gerade einen Texturen Manager um habe extra eine Klasse Texture. Diese Soll die Texture beinhalten und gegebenfalls auch zeichnen.</p>
<p>Nun habe ich im Texture Manager eine std::map die mir die Texture Objekte festhalten soll.</p>
<p>Zuerst dachte ich, dass wenn ich unique_ptr benutze, ich den Vorteil habe, dass ich nicht jede Texture Instanz löschen muss, wenn ich den std::map bereinigen will.</p>
<p>Das Problem bei unique_ptr ist halt das ich beschränkten Zugriff darauf habe. Hab mich dann also für shared_ptr entschieden. Da ich zwischendurch auf die Texture Instanzen zugreifen möchte.</p>
<p>Nun ist es bei shared_ptr wohl so, dass sie eine eigene Ressource haben und eine 2. besitzen können. Was mich ein wenig verwirrt.</p>
<p>Ich möchte einfach nur eine std::map haben bei der ich auf die Instanzen auch zugreifen kann. Soweit ich weiß könnte ich den shared_ptr einer temporären Variable zuordnen, aber das ist mir auch irgendwie zu doof.</p>
<p>Hier mal etwas Code.</p>
<pre><code>class TextureManager
    {
    public:
        static TextureManager *instance();
        static void delInstance();

        /*
         * load Texture
         * -----------------------------------
         * Creates a Texture Object with the Texture and puts it in m_loadedTextures as unqiue_ptr
         */
        void loadTexture(Game *game, const std::string filename);

        /*
         * Destroy Map m_loadedTextures
         * -----------------------------------
         * Destroys all Texture Objects in the map and clear it completly
         */
        void destroyLoadedTextures();

    private:
        TextureManager();
        TextureManager(const TextureManager &amp;);
        ~TextureManager();

        static TextureManager *m_Instance;

        /*
         * Textures
         * ----------------------------
         * all Textures that are loaded are here
         */
        std::map&lt;std::string, std::shared_ptr&lt;Texture&gt;&gt; m_loadedTextures;

    };
</code></pre>
<pre><code>Ghuul::TextureManager *Ghuul::TextureManager::m_Instance = nullptr;

Ghuul::TextureManager *Ghuul::TextureManager::instance()
{
    if (m_Instance == nullptr)
        m_Instance = new TextureManager();
    return m_Instance;
}

void Ghuul::TextureManager::delInstance()
{
    if (m_Instance != nullptr)
        delete m_Instance;
    m_Instance = nullptr;
}

void Ghuul::TextureManager::loadTexture(Game *game, const std::string filename)
{
    std::shared_ptr&lt;Texture&gt; texture(new Texture());
    texture-&gt;load(game, filename);
    m_loadedTextures.insert(std::pair&lt;std::string, std::shared_ptr&lt;Texture&gt;&gt;(filename, texture));
}

void Ghuul::TextureManager::destroyLoadedTextures()
{
    m_loadedTextures.erase(m_loadedTextures.begin(), m_loadedTextures.end());
}
</code></pre>
<p>Kompiliert wird das ohne Probleme. Nur muss ich wohl momentan, wenn ich auf eine Texture Instanz zugreifen will, das hier machen (nicht getestet)</p>
<pre><code>std::shared_ptr&lt;Texture&gt; texture = m_loadedTextures.at(&quot;Image&quot;);
    texture-&gt;draw();
</code></pre>
<p>Wir dort der Speicher wirklich geteilt? Wenn ich jetzt draw aufrufe, gilt das wirklich für das Objekt im std::map?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2512043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2512043</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 18 Oct 2016 23:02:33 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Verwendung von share_ptr oder unique_ptr on Wed, 19 Oct 2016 05:25:07 GMT]]></title><description><![CDATA[<p>Naja, jein, würde ich sagen:<br />
Das Objekt in der map ist ja nicht Deine Textur, sondern ein Pointer darauf. Nach der Zuweisung</p>
<pre><code>std::shared_ptr&lt;Texture&gt; texture = m_loadedTextures.at(&quot;Image&quot;);
</code></pre>
<p>hast Du einen zweiten Pointer auf die entsprechende Textur.<br />
Aber brauchst Du den wirklich? Du kannst doch einfach</p>
<pre><code>m_loadedTextures.at(&quot;Image&quot;)-&gt;draw();
</code></pre>
<p>rufen?!<br />
Das geht dann übrigens auch, wenn die map unique_ptr beherbergt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2512045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2512045</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 19 Oct 2016 05:25:07 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Verwendung von share_ptr oder unique_ptr on Wed, 19 Oct 2016 05:36:17 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>Naja, jein, würde ich sagen:<br />
Das Objekt in der map ist ja nicht Deine Textur, sondern ein Pointer darauf. Nach der Zuweisung</p>
<pre><code>std::shared_ptr&lt;Texture&gt; texture = m_loadedTextures.at(&quot;Image&quot;);
</code></pre>
<p>hast Du einen zweiten Pointer auf die entsprechende Textur.<br />
Aber brauchst Du den wirklich? Du kannst doch einfach</p>
<pre><code>m_loadedTextures.at(&quot;Image&quot;)-&gt;draw();
</code></pre>
<p>rufen?!<br />
Das geht dann übrigens auch, wenn die map unique_ptr beherbergt.</p>
</blockquote>
<p>ah cool. stimmt. hatte das wohl mal probiert, aber da muss ich was falsch gemacht haben. hatte daher zuerst den Sinn von unique_ptr nicht verstanden. Aber jetzt geht es. shared_ptr brauche ich nur dann wenn ich 2 oder mehr Pointer drauf zeigen lassen will?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2512046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2512046</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 19 Oct 2016 05:36:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Verwendung von share_ptr oder unique_ptr on Wed, 19 Oct 2016 05:52:47 GMT]]></title><description><![CDATA[<p>Ich würde sagen, shared_ptr brauchst Du, wenn der Besitz, also die Verantwortung für das Löschen des Objektes hinter dem Zeiger, nicht eindeutig geklärt werden kann - ich denke, einigermaßen selten.</p>
<p>PS: Ich bin aber nicht so der Theorie-Papst, das können einige andere hier sicherlich besser auf den Punkt bringen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2512048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2512048</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 19 Oct 2016 05:52:47 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Verwendung von share_ptr oder unique_ptr on Wed, 19 Oct 2016 07:12:09 GMT]]></title><description><![CDATA[<p>Bennisen schrieb:</p>
<blockquote>
<p>Das Problem bei unique_ptr ist halt das ich beschränkten Zugriff darauf habe. Hab mich dann also für shared_ptr entschieden. Da ich zwischendurch auf die Texture Instanzen zugreifen möchte.</p>
</blockquote>
<p>da hast du irgendwas grundlegend falsch verstanden. Der Zugriff auf das enthaltene Objekt ist bei beiden Varianten gleich. Unterschiede gibt es lediglich beim Kopier- und Zuweisungsverhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2512050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2512050</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Wed, 19 Oct 2016 07:12:09 GMT</pubDate></item></channel></rss>