<?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[Memory Manager - Ideen?]]></title><description><![CDATA[<p>Hi! Ich arbeite gerade an einem Projekt, in dem ich sehr oft Speicher selbst allokieren und wieder freigeben muss.</p>
<p>Die Speicherblöcke werden teilweise in Arrays, teilweise in Structs, teilweise in Arrays voll structs die Arrays haben usw... gespeichert</p>
<p>So ungefähr:</p>
<pre><code class="language-cpp">class Obj
{
	vector&lt;double&gt;* ptr_to_vec;
	AStruct* st;

};

struct AStruct
{
	vector&lt;string&gt;* ptr_to_str;
};
</code></pre>
<p>Kurzum, am ende habe ich alle Speicherobjekte irgendwie untergebracht, und zwar so dass alle im endeffekt über eine art &quot;Destruktorkette&quot; alle gelöscht werden.</p>
<p>So, mein Problem ist folgendes:<br />
Es kann passieren, dass diese sequenz unterbrochen wird, und die &quot;Destruktorkette&quot; eine lücke aufweist, das beudeutet dann ein Speicherleck.</p>
<p>Bis jetzt habe ich es so geregelt, dass jeder Typ, der dynamisch allokiert wird, eine eigene Templateinstanz einer Klasse hat, die sich alle allokierten Zeiger merkt und bei Störungen alle darin enthaltenen zeiger löscht.</p>
<p>so ungefähr:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class memory_manager
{
	static std::vector&lt;T*&gt; currently_registered;
public:
	// Neuen zeiger registrieren
	static T* register_new(T* ptr);

	// Zeiger wieder &quot;entregistrieren&quot;
	static T* unregister(T* ptr);

	// alle registrierten Loescchen
	static void delete_all();
};

//Verwendung
double* a_pointer = memory_manager&lt;double&gt; register_new( new double );

// entregistrieren
memory_manager&lt;double&gt;::unregister(a_pointer);

// alle loeschen
memory_manager&lt;double&gt;::delete_all();
</code></pre>
<p>Die Nachteile bei meiner Variante sind folgendes:<br />
Ich muss jeden Zeiger nach dem allokieren sozusagen &quot;Registrieren&quot;, und zwar bei dieser Templateinstanz. (Dadurch wird das Template automatisch für diesen Typ instanzieert). Wenn ich den Zeiger dann in die &quot;Sichere Zone&quot; übergebe, muss ich ihn wieder &quot;Entregistrieren&quot;. Das ist ziemlich unbequem, denn nichts hindert mich daran eines der beiden zu vergessen.<br />
Zweitens muss ich mir merken, welche typen ich alle Instanzieert habe, um dann alle explizit von hand selbst zu löschen. Das ist wieder ziemlich unbequem, weil ich da wieder ganz leicht etwas vergessen kann.</p>
<p>So, nun wollte ich mal fragen ob ihr schon mal so ne art &quot;Memory Manager&quot; geschrieben habt, und wie das design dazu aussieht, oder ob ihr an meiner Version etwas zu verbessern habt.</p>
<p>Also, ich hoffe ihr könnt mir da ein bisschen weiterhelfen.<br />
mfg, DrPhil_Guth</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/211873/memory-manager-ideen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 13:19:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/211873.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 Apr 2008 17:48:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Memory Manager - Ideen? on Mon, 28 Apr 2008 17:48:00 GMT]]></title><description><![CDATA[<p>Hi! Ich arbeite gerade an einem Projekt, in dem ich sehr oft Speicher selbst allokieren und wieder freigeben muss.</p>
<p>Die Speicherblöcke werden teilweise in Arrays, teilweise in Structs, teilweise in Arrays voll structs die Arrays haben usw... gespeichert</p>
<p>So ungefähr:</p>
<pre><code class="language-cpp">class Obj
{
	vector&lt;double&gt;* ptr_to_vec;
	AStruct* st;

};

struct AStruct
{
	vector&lt;string&gt;* ptr_to_str;
};
</code></pre>
<p>Kurzum, am ende habe ich alle Speicherobjekte irgendwie untergebracht, und zwar so dass alle im endeffekt über eine art &quot;Destruktorkette&quot; alle gelöscht werden.</p>
<p>So, mein Problem ist folgendes:<br />
Es kann passieren, dass diese sequenz unterbrochen wird, und die &quot;Destruktorkette&quot; eine lücke aufweist, das beudeutet dann ein Speicherleck.</p>
<p>Bis jetzt habe ich es so geregelt, dass jeder Typ, der dynamisch allokiert wird, eine eigene Templateinstanz einer Klasse hat, die sich alle allokierten Zeiger merkt und bei Störungen alle darin enthaltenen zeiger löscht.</p>
<p>so ungefähr:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class memory_manager
{
	static std::vector&lt;T*&gt; currently_registered;
public:
	// Neuen zeiger registrieren
	static T* register_new(T* ptr);

	// Zeiger wieder &quot;entregistrieren&quot;
	static T* unregister(T* ptr);

	// alle registrierten Loescchen
	static void delete_all();
};

//Verwendung
double* a_pointer = memory_manager&lt;double&gt; register_new( new double );

// entregistrieren
memory_manager&lt;double&gt;::unregister(a_pointer);

// alle loeschen
memory_manager&lt;double&gt;::delete_all();
</code></pre>
<p>Die Nachteile bei meiner Variante sind folgendes:<br />
Ich muss jeden Zeiger nach dem allokieren sozusagen &quot;Registrieren&quot;, und zwar bei dieser Templateinstanz. (Dadurch wird das Template automatisch für diesen Typ instanzieert). Wenn ich den Zeiger dann in die &quot;Sichere Zone&quot; übergebe, muss ich ihn wieder &quot;Entregistrieren&quot;. Das ist ziemlich unbequem, denn nichts hindert mich daran eines der beiden zu vergessen.<br />
Zweitens muss ich mir merken, welche typen ich alle Instanzieert habe, um dann alle explizit von hand selbst zu löschen. Das ist wieder ziemlich unbequem, weil ich da wieder ganz leicht etwas vergessen kann.</p>
<p>So, nun wollte ich mal fragen ob ihr schon mal so ne art &quot;Memory Manager&quot; geschrieben habt, und wie das design dazu aussieht, oder ob ihr an meiner Version etwas zu verbessern habt.</p>
<p>Also, ich hoffe ihr könnt mir da ein bisschen weiterhelfen.<br />
mfg, DrPhil_Guth</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1499885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499885</guid><dc:creator><![CDATA[DrPhil_Guth]]></dc:creator><pubDate>Mon, 28 Apr 2008 17:48:00 GMT</pubDate></item><item><title><![CDATA[Reply to Memory Manager - Ideen? on Mon, 28 Apr 2008 18:03:49 GMT]]></title><description><![CDATA[<p>Um konkrete Vorschläge zu machen, musst du erstmal konkreter werden: Was hast du für Ansprüche an den Memory-Manager? Liegt das Augenmerk auf Schnelligkeit, möglichst wenig Fragmentation, soll er die Garbage-Collection übernehmen oder was erwartest du von ihm?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1499907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499907</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Mon, 28 Apr 2008 18:03:49 GMT</pubDate></item><item><title><![CDATA[Reply to Memory Manager - Ideen? on Tue, 29 Apr 2008 00:44:57 GMT]]></title><description><![CDATA[<ol>
<li>
<p>Wieso hantierst du überhaupt soviel mit Zeigern rum? Ich brauche sowas nicht SO oft. Vielleicht könntest du mal ein wenig Code herzeigen (1:1 aus deinem Projekt, eine Stelle die verständlich macht warum du so viel Speicher &quot;mit Hand&quot; anforderst und freigibst).</p>
</li>
<li>
<p>Guck dir boost::shared_ptr&lt;&gt; an, das könnte man als eine Art &quot;Memory Manager&quot; bezeichnen. Ist viel einfacher zu verwenden als das was du gebastelt hast. Alternativ guck dir auch boost::intrusive_ptr&lt;&gt; an.</p>
</li>
</ol>
<p><a href="http://www.boost.org" rel="nofollow">http://www.boost.org</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1500144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1500144</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 29 Apr 2008 00:44:57 GMT</pubDate></item><item><title><![CDATA[Reply to Memory Manager - Ideen? on Tue, 29 Apr 2008 04:38:56 GMT]]></title><description><![CDATA[<p><a href="http://cplus.kompf.de/artikel/autoptr.html" rel="nofollow">http://cplus.kompf.de/artikel/autoptr.html</a></p>
<p><a href="http://cplus.kompf.de/artikel/refcnt.html" rel="nofollow">http://cplus.kompf.de/artikel/refcnt.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1500156</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1500156</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Tue, 29 Apr 2008 04:38:56 GMT</pubDate></item><item><title><![CDATA[Reply to Memory Manager - Ideen? on Tue, 29 Apr 2008 07:01:47 GMT]]></title><description><![CDATA[<p>Ich denke <a href="http://www.boost.org" rel="nofollow">boost::pool</a> oder <a href="http://pocoproject.org" rel="nofollow">Poco::MemoryPool</a> könnte was für Dich sein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1500215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1500215</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Tue, 29 Apr 2008 07:01:47 GMT</pubDate></item></channel></rss>