<?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 mit Objekterstellung]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe ein Verständnisproblem mit folgendem Code:</p>
<pre><code>////// resourcemanager.h

class Texture {
public:
    int* counter;
    ~Texture();
};

class ResourceManager
{
private:
    map&lt;string, int&gt; textures;
public:
    Texture getTexture(const char* texname);
    void print();
};

////// resourcemanager.cpp

Texture::~Texture() {
	cout&lt;&lt;&quot;Destructor&quot;&lt;&lt;endl;
    (*counter)--;
}

Texture ResourceManager::getTexture(const char *texname) {
    textures[texname]++;

    Texture t;
    t.counter = &amp;textures[texname];
    return t;
}

void ResourceManager::print() {
    map&lt;string, int&gt;::iterator it;
    for(it = textures.begin(); it != textures.end(); ++it) {
        cout&lt;&lt; it-&gt;first &lt;&lt; &quot; counter = &quot; &lt;&lt; it-&gt;second &lt;&lt;endl;
    }
}

////// main.cpp

struct Triangle {
	Texture tex;
};

int main()
{
    ResourceManager rm;

    /* Version 1
	Texture t1 = rm.getTexture(&quot;bla&quot;); */

	/* Version 2
	Triangle t;
	t.tex = rm.getTexture(&quot;bla&quot;); */

    Texture t2 = rm.getTexture(&quot;blubb&quot;);

    rm.print();

    return 0;
}
</code></pre>
<p>Wenn ich Version 1 ausführe bekomme ich die gewünschte folgende Ausgabe:<br />
bla counter = 1<br />
blubb counter = 1<br />
Destructor<br />
Destructor</p>
<p>Wenn ich aber Version 2 ausführe erhalte ich diese Ausgabe:<br />
Destructor<br />
bla counter = 0<br />
blubb counter = 1<br />
Destructor<br />
Destructor</p>
<p>Wie es aussieht wurde hier irgendwie ein Objekt mehr erstellt und vor der Ausführung von &quot;rm.print();&quot; schon zerstoert. Kann mir jemand erklären warum das so ist und wie ich das gleiche Verhalten bei beiden Versionen hinbekomme? (Ich will einen Resource Manager programmieren wo ich Texturen anfordern kann und der sicherstellt, dass jede Textur genau einmal geladen wird und auch wieder zerstört wird sobald die Textur nicht mehr verwendet wird)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/309263/problem-mit-objekterstellung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 12:09:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/309263.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 18 Oct 2012 14:08:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Objekterstellung on Thu, 18 Oct 2012 14:08:21 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe ein Verständnisproblem mit folgendem Code:</p>
<pre><code>////// resourcemanager.h

class Texture {
public:
    int* counter;
    ~Texture();
};

class ResourceManager
{
private:
    map&lt;string, int&gt; textures;
public:
    Texture getTexture(const char* texname);
    void print();
};

////// resourcemanager.cpp

Texture::~Texture() {
	cout&lt;&lt;&quot;Destructor&quot;&lt;&lt;endl;
    (*counter)--;
}

Texture ResourceManager::getTexture(const char *texname) {
    textures[texname]++;

    Texture t;
    t.counter = &amp;textures[texname];
    return t;
}

void ResourceManager::print() {
    map&lt;string, int&gt;::iterator it;
    for(it = textures.begin(); it != textures.end(); ++it) {
        cout&lt;&lt; it-&gt;first &lt;&lt; &quot; counter = &quot; &lt;&lt; it-&gt;second &lt;&lt;endl;
    }
}

////// main.cpp

struct Triangle {
	Texture tex;
};

int main()
{
    ResourceManager rm;

    /* Version 1
	Texture t1 = rm.getTexture(&quot;bla&quot;); */

	/* Version 2
	Triangle t;
	t.tex = rm.getTexture(&quot;bla&quot;); */

    Texture t2 = rm.getTexture(&quot;blubb&quot;);

    rm.print();

    return 0;
}
</code></pre>
<p>Wenn ich Version 1 ausführe bekomme ich die gewünschte folgende Ausgabe:<br />
bla counter = 1<br />
blubb counter = 1<br />
Destructor<br />
Destructor</p>
<p>Wenn ich aber Version 2 ausführe erhalte ich diese Ausgabe:<br />
Destructor<br />
bla counter = 0<br />
blubb counter = 1<br />
Destructor<br />
Destructor</p>
<p>Wie es aussieht wurde hier irgendwie ein Objekt mehr erstellt und vor der Ausführung von &quot;rm.print();&quot; schon zerstoert. Kann mir jemand erklären warum das so ist und wie ich das gleiche Verhalten bei beiden Versionen hinbekomme? (Ich will einen Resource Manager programmieren wo ich Texturen anfordern kann und der sicherstellt, dass jede Textur genau einmal geladen wird und auch wieder zerstört wird sobald die Textur nicht mehr verwendet wird)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261659</guid><dc:creator><![CDATA[MaxJ]]></dc:creator><pubDate>Thu, 18 Oct 2012 14:08:21 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Objekterstellung on Thu, 18 Oct 2012 14:43:49 GMT]]></title><description><![CDATA[<p>Hallo MaxJ</p>
<p>Bei version 2 wird die Textur von getTexture erstellt und dann in das Triangle-struct kopiert, dann wird die Textur beim verlassen von getTexture gelöscht(darum der Destruktor). Bei version 1 kann diese Kopie vom Kompiler wegoptimiert werden, da die Adresse noch nicht feststeht. Du kannst version 2 optimieren indem du in getTexture die Textur erstellst und dann nur die Adressen der Texturen zurückgibst.</p>
<p>Gruss Ganesh123</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261685</guid><dc:creator><![CDATA[Ganesh123]]></dc:creator><pubDate>Thu, 18 Oct 2012 14:43:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Objekterstellung on Thu, 18 Oct 2012 15:29:11 GMT]]></title><description><![CDATA[<p>Hmm, ok also hat der Compiler da irgendwas gemacht. Danke schon mal.</p>
<p>Aber wie funktioniert das Optimieren genau was du ansprichst? Ich würde jetzt die Funktion getTexture so ändern:</p>
<pre><code>Texture* ResourceManager::getTexture(const char *texname) {
    textures[texname]++;

    Texture* t = new Texture();
    t-&gt;counter = &amp;textures[texname];
    return t;
}
</code></pre>
<p>So ähnlich habe ich es eigentlich früher auch schon gemacht, aber da habe ich ja den Nachteil dass ich im Programm auch Zeiger verwenden und am Ende immer delete aufrufen muss. (diese Lösung wäre aber für mich akzeptabel wenn es nicht auch noch anders geht)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261713</guid><dc:creator><![CDATA[MaxJ]]></dc:creator><pubDate>Thu, 18 Oct 2012 15:29:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Objekterstellung on Thu, 18 Oct 2012 15:48:15 GMT]]></title><description><![CDATA[<p>So habe ich mir getTexture vorgestellt.<br />
Du könntest Smartpointer verwenden. Die löschen das Objekt auf das sie zeigen von alleine, wenn du es nicht mehr brauchst.</p>
<p>Gruss Ganesh123</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261730</guid><dc:creator><![CDATA[Ganesh123]]></dc:creator><pubDate>Thu, 18 Oct 2012 15:48:15 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Objekterstellung on Fri, 19 Oct 2012 12:12:27 GMT]]></title><description><![CDATA[<p>Ok, danke! Ich werde mir mal Smartpointer anschauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2262054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2262054</guid><dc:creator><![CDATA[MaxJ]]></dc:creator><pubDate>Fri, 19 Oct 2012 12:12:27 GMT</pubDate></item></channel></rss>