<?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[GC artiges Verhalten]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich brauche die Möglichkeit erzeugte Objekte in einer List verwalten zu können. Dazu gibt es die Funktionen Register und UnRegister. Um das Freigeben der Objekte soll sich der Programmierer nicht kümmern müssen.</p>
<pre><code class="language-cpp">class Manager
{
public:
	static void Register(const shared_ptr&lt;Object&gt; &amp;object)
	{
		objects.push_front(object);
	}

	static void UnRegister(const shared_ptr&lt;Object&gt; &amp;object)
	{
		objects.remove(object);
	}

private:
	static list&lt;shared_ptr&lt;Object&gt; &gt; objects;
};

class Object
{
public:
	void Lock()
	{
		Manager::Register(...?);
	}

	void Unlock()
	{
		Manager::UnRegister(...?);
	}
};

void func()
{
	shared_ptr&lt;Object&gt; obj(new Object());
	obj-&gt;Lock();
}
</code></pre>
<p>Auf ein Lock muss nicht innerhalb der selben Funktion ein Unlock folgen, wodurch Objecte im Manager gespeichert sind, bei denen dieser Methoden aufrufen kann. Da nicht garantiert ist, dass obj nach Unlock nicht mehr verwendet wird (zB erneutes Lock), kann ich in UnRegister nicht einfach den Speicher freigeben. Jetzt stellt sich mir die Frage, wie ich den shared_ptr in die Liste bekomme. Ein shared_from_this in der Lock Funktion scheidet ja aus, da es dann 2 unterschiedliche shared_ptr's gäbe.</p>
<p>Was ich mir überlegt hab:</p>
<pre><code class="language-cpp">class Object
{
public:
	void Lock(const shared_ptr&lt;Object&gt; &amp;instance)
	{
		Manager::Register(instance);
	}
};
</code></pre>
<p>hier müsste man obj-&gt;Lock(obj); aufrufen, was zwar irgendwie doof ist, mir aber im Vergleich zu</p>
<pre><code class="language-cpp">class Object
{
public:
	static shared_ptr&lt;Object&gt; Create()
	{
		shared_ptr&lt;Object&gt; obj(new Object());
		instance = obj;
		return obj;
	}

	void Lock()
	{
		Manager::Register(instance);
	}

private:
	shared_ptr&lt;Object&gt; instance;
};
</code></pre>
<p>besser gefällt, weil in dem Fall das Object wohl nie gelöscht werden würde, da es eine Referenz auf sich selbst hält, die verhindert, dass sie gelöscht werden kann.</p>
<p>Welche Möglichkeiten gibt es noch?</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/293579/gc-artiges-verhalten</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 07:24:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/293579.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Oct 2011 11:38:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to GC artiges Verhalten on Thu, 06 Oct 2011 11:38:39 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich brauche die Möglichkeit erzeugte Objekte in einer List verwalten zu können. Dazu gibt es die Funktionen Register und UnRegister. Um das Freigeben der Objekte soll sich der Programmierer nicht kümmern müssen.</p>
<pre><code class="language-cpp">class Manager
{
public:
	static void Register(const shared_ptr&lt;Object&gt; &amp;object)
	{
		objects.push_front(object);
	}

	static void UnRegister(const shared_ptr&lt;Object&gt; &amp;object)
	{
		objects.remove(object);
	}

private:
	static list&lt;shared_ptr&lt;Object&gt; &gt; objects;
};

class Object
{
public:
	void Lock()
	{
		Manager::Register(...?);
	}

	void Unlock()
	{
		Manager::UnRegister(...?);
	}
};

void func()
{
	shared_ptr&lt;Object&gt; obj(new Object());
	obj-&gt;Lock();
}
</code></pre>
<p>Auf ein Lock muss nicht innerhalb der selben Funktion ein Unlock folgen, wodurch Objecte im Manager gespeichert sind, bei denen dieser Methoden aufrufen kann. Da nicht garantiert ist, dass obj nach Unlock nicht mehr verwendet wird (zB erneutes Lock), kann ich in UnRegister nicht einfach den Speicher freigeben. Jetzt stellt sich mir die Frage, wie ich den shared_ptr in die Liste bekomme. Ein shared_from_this in der Lock Funktion scheidet ja aus, da es dann 2 unterschiedliche shared_ptr's gäbe.</p>
<p>Was ich mir überlegt hab:</p>
<pre><code class="language-cpp">class Object
{
public:
	void Lock(const shared_ptr&lt;Object&gt; &amp;instance)
	{
		Manager::Register(instance);
	}
};
</code></pre>
<p>hier müsste man obj-&gt;Lock(obj); aufrufen, was zwar irgendwie doof ist, mir aber im Vergleich zu</p>
<pre><code class="language-cpp">class Object
{
public:
	static shared_ptr&lt;Object&gt; Create()
	{
		shared_ptr&lt;Object&gt; obj(new Object());
		instance = obj;
		return obj;
	}

	void Lock()
	{
		Manager::Register(instance);
	}

private:
	shared_ptr&lt;Object&gt; instance;
};
</code></pre>
<p>besser gefällt, weil in dem Fall das Object wohl nie gelöscht werden würde, da es eine Referenz auf sich selbst hält, die verhindert, dass sie gelöscht werden kann.</p>
<p>Welche Möglichkeiten gibt es noch?</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2128001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2128001</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Thu, 06 Oct 2011 11:38:39 GMT</pubDate></item><item><title><![CDATA[Reply to GC artiges Verhalten on Thu, 06 Oct 2011 12:07:11 GMT]]></title><description><![CDATA[<p>Wozu soll das gut sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2128009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2128009</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 06 Oct 2011 12:07:11 GMT</pubDate></item><item><title><![CDATA[Reply to GC artiges Verhalten on Thu, 06 Oct 2011 12:13:08 GMT]]></title><description><![CDATA[<p>KN4CK3R schrieb:</p>
<blockquote>
<p>Welche Möglichkeiten gibt es noch?</p>
</blockquote>
<p>Dazu müsste man wohl erst mal das Problem verstehen, was Du zu lösen versuchst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2128013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2128013</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 06 Oct 2011 12:13:08 GMT</pubDate></item><item><title><![CDATA[Reply to GC artiges Verhalten on Thu, 06 Oct 2011 12:28:00 GMT]]></title><description><![CDATA[<p>sagen wir die Klasse Object hat noch eine Update Methode und die wird über den Manager in regelmäßigen Abständen aufgerufen, dazu muss der Manager wissen, welche Objekte geradet gelockt sind, damit er bei diesen Update aufrufen kann. Wenn sich ein Object wieder UnRegister't dann soll dort auch nicht mehr Update aufgerufen werden.</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2128022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2128022</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Thu, 06 Oct 2011 12:28:00 GMT</pubDate></item></channel></rss>