<?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[Aufruf einer Methode vor der Initialisierung von statischen Variablen]]></title><description><![CDATA[<p>Hey hey,</p>
<p>ich habe mal eine systemnahe Frage zu C und C++.</p>
<p>Und zwar habe ich zur Zeit eine eigene Speicherverwaltung in C++ implementiert.<br />
Durch das Überladen der new und delete Operatoren werden alle Objekte, welche mit new erzeugt werden, in der Speicherverwaltung in einem statischen Speicherbereich abgelegt und durch den überladenen delete Operator werden alle<br />
angeforderten Speicherbereiche wieder freigegeben</p>
<p>Intern in der Speicherverwaltung gibt es unter anderem die Methoden &lt;allocateMem&gt; und &lt;freeMem&gt;. Bevor diese Methoden aufgerufen werden können, muss der statische Speicherbereich der Speicherverwaltung initialisiert werden. Diese Initialisierung geschieht momentan sofort nach dem Starten von &lt;main()&gt; durch das Starten einer Methode &lt;initMemHandler&gt;</p>
<p>Es ist ja nun auch möglich, statische Objekte mit new zu initialisieren. Wie ist es nun möglich, dass die Initialisierungsmethode vor dem ersten new aufgerufen wird.</p>
<p>Eine Möglichkeit ist ein Flag zu setzen und die Initialisierungsfunktion im überladenen New-Operator aufzurufen. Aber hierfür ist dann bei jedem new<br />
eine Überprüfung notwendig, was nicht wirklich optimal ist. Gibt es noch eine weitere Möglichkeit, fällt irgendeinem etwas ein?</p>
<p>Ok, Danke schonmal!<br />
Mit freundlichen Grüßen<br />
sevenWaysToLove</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/182198/aufruf-einer-methode-vor-der-initialisierung-von-statischen-variablen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 17:21:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/182198.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 22 May 2007 13:19:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Aufruf einer Methode vor der Initialisierung von statischen Variablen on Tue, 22 May 2007 13:19:52 GMT]]></title><description><![CDATA[<p>Hey hey,</p>
<p>ich habe mal eine systemnahe Frage zu C und C++.</p>
<p>Und zwar habe ich zur Zeit eine eigene Speicherverwaltung in C++ implementiert.<br />
Durch das Überladen der new und delete Operatoren werden alle Objekte, welche mit new erzeugt werden, in der Speicherverwaltung in einem statischen Speicherbereich abgelegt und durch den überladenen delete Operator werden alle<br />
angeforderten Speicherbereiche wieder freigegeben</p>
<p>Intern in der Speicherverwaltung gibt es unter anderem die Methoden &lt;allocateMem&gt; und &lt;freeMem&gt;. Bevor diese Methoden aufgerufen werden können, muss der statische Speicherbereich der Speicherverwaltung initialisiert werden. Diese Initialisierung geschieht momentan sofort nach dem Starten von &lt;main()&gt; durch das Starten einer Methode &lt;initMemHandler&gt;</p>
<p>Es ist ja nun auch möglich, statische Objekte mit new zu initialisieren. Wie ist es nun möglich, dass die Initialisierungsmethode vor dem ersten new aufgerufen wird.</p>
<p>Eine Möglichkeit ist ein Flag zu setzen und die Initialisierungsfunktion im überladenen New-Operator aufzurufen. Aber hierfür ist dann bei jedem new<br />
eine Überprüfung notwendig, was nicht wirklich optimal ist. Gibt es noch eine weitere Möglichkeit, fällt irgendeinem etwas ein?</p>
<p>Ok, Danke schonmal!<br />
Mit freundlichen Grüßen<br />
sevenWaysToLove</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1289934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1289934</guid><dc:creator><![CDATA[sevenWaysToLove]]></dc:creator><pubDate>Tue, 22 May 2007 13:19:52 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf einer Methode vor der Initialisierung von statischen Variablen on Tue, 22 May 2007 15:01:04 GMT]]></title><description><![CDATA[<p>Du könntest ein Objekt einer Klasse, die den Speicher verwaltet, als Meyers-Singleton (das Singleton ist eine funktionslokale statische Variable) implementieren. Denn funktionslokale statische Variablen werden beim ersten Aufruf der Funktion (egal von wo) konstruiert.</p>
<pre><code class="language-cpp">// MemoryManagementGuard sei eine Klasse, die im Konstruktor den Speicherbereich initialisiert

MemoryManagementGuard&amp; MemoryManagementGuard::Instance()
{
    static MemoryManagementGuard instance;
    return instance;
}

void* allocateMem(size_t length)
{
    return MemoryManagementGuard::Instance().allocateMem(length);
}
</code></pre>
<p>So wird beim ersten Aufruf von MemoryManagementGuard::Instance() ein Objekt der Klasse initialisiert. Wenn Du den Ctor, Copy-Ctor und Copy-Operator der Klasse noch private machst ist auch garantiert dass niemand sonst so ein Objekt anlegt.</p>
<p>EDIT:<br />
Worauf man noch achten sollte ist, dass in multithreaded Umgebungen die Methode Instance() mindestens einmal aufgerufen werden sollte, bevor irgendein weiterer Thread neben dem Hauptthread gestartet wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1289992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1289992</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 22 May 2007 15:01:04 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf einer Methode vor der Initialisierung von statischen Variablen on Tue, 22 May 2007 15:04:00 GMT]]></title><description><![CDATA[<p>Schreib dir doch eine Speicherverwaltungsklasse, wo du deine statischen Variablen und statische Methoden, auf die deine überschriebenen Operatoren zugreifen, drin hast. Da du nur ein Speicherverwaltungsobjekt brauchst, kann man da gut das Singleton Pattern anwenden und es bei Zugriff über die statischen Methoden ggf. einmalig initialisieren.</p>
<pre><code class="language-cpp">class MemManager 
{
private: 
 static MemManager* mng;
 MemManager() : ;  //Konstruktor privat
public:

static MemManager* getThis(){ if (!mng) mng = new MemManager(); return mng; }
static getmem()  //wird vom Überschriebenen new() aufgerufen
  {
   MemManager* m = getThis(); //...
  }
// usw.
};
</code></pre>
<p>/edit: mist, wieder zu lahm ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1289994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1289994</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 22 May 2007 15:04:00 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf einer Methode vor der Initialisierung von statischen Variablen on Tue, 22 May 2007 15:08:15 GMT]]></title><description><![CDATA[<p>Ob es so gut ist, einen Memorymanager der new und delete überschreibt, mit new zu allokieren, um sicherzustellen, dass new und delete korrekt funktionieren? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1289998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1289998</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 22 May 2007 15:08:15 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf einer Methode vor der Initialisierung von statischen Variablen on Tue, 22 May 2007 15:38:57 GMT]]></title><description><![CDATA[<p>da wird sich auch mit Sicherheit die althergebrachte Version von new nutzen lassen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290010</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 22 May 2007 15:38:57 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf einer Methode vor der Initialisierung von statischen Variablen on Tue, 22 May 2007 16:29:58 GMT]]></title><description><![CDATA[<p>Für sowas würde ich wenn dann placement new verwenden, und den Speicher z.B. mit HeapAlloc(GetProcessHeap(), ...) anfordern. Das geht immer, ohne irgendwelche Initialisierungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290035</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 22 May 2007 16:29:58 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf einer Methode vor der Initialisierung von statischen Variablen on Wed, 23 May 2007 05:51:37 GMT]]></title><description><![CDATA[<p>Hey hey,</p>
<p>die Lösung mit dem Meyers-Singleton gefällt mir richtig gut!</p>
<p>Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>MfG<br />
sevenWaysToLove</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290304</guid><dc:creator><![CDATA[sevenWaysToLove]]></dc:creator><pubDate>Wed, 23 May 2007 05:51:37 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf einer Methode vor der Initialisierung von statischen Variablen on Wed, 23 May 2007 12:34:21 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/15851">@sevenWaysToLove</a>:<br />
dir ist schon klar dass dieses &quot;meyers singleton&quot; a) nicht threadsafe ist und b) genau das gleiche wie wenn du selbst bei jedem Funktionsaufruf &quot;if (!initialized) initialize();&quot; schreibst... ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290650</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 23 May 2007 12:34:21 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf einer Methode vor der Initialisierung von statischen Variablen on Wed, 23 May 2007 12:50:35 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>...genau das gleiche wie wenn du selbst bei jedem Funktionsaufruf &quot;if (!initialized) initialize();&quot; schreibst... ?</p>
</blockquote>
<p>Wahrscheinlich gefällt es ihm deswegen so gut .... <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>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290683</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 23 May 2007 12:50:35 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf einer Methode vor der Initialisierung von statischen Variablen on Thu, 24 May 2007 08:12:09 GMT]]></title><description><![CDATA[<p>Ja, aber eine OOP-Variante ist einfach schicker ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Im Endeffekt habe ich es jetzt auch so geloest ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291232</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291232</guid><dc:creator><![CDATA[sevenWaysToLove]]></dc:creator><pubDate>Thu, 24 May 2007 08:12:09 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf einer Methode vor der Initialisierung von statischen Variablen on Thu, 24 May 2007 18:36:31 GMT]]></title><description><![CDATA[<p>Ich hatte das deswegen erwähnt:</p>
<p>sevenWaysToLove schrieb:</p>
<blockquote>
<p>Eine Möglichkeit ist ein Flag zu setzen und die Initialisierungsfunktion im überladenen New-Operator aufzurufen. Aber hierfür ist dann bei jedem new<br />
eine Überprüfung notwendig, was nicht wirklich optimal ist</p>
</blockquote>
<p>Wenn das eine nicht optimal ist, ist es das andere auch nicht, weil das eine gleich dem anderen ist. Sozusagen.<br />
Blubb.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291659</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 24 May 2007 18:36:31 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf einer Methode vor der Initialisierung von statischen Variablen on Fri, 25 May 2007 06:05:32 GMT]]></title><description><![CDATA[<p>In dem Sinne halte ich aber &quot;macht der Compiler für mich&quot; für optimal<strong>er</strong> als &quot;mach ich selbst&quot;. Und irgendwer muss sowieso prüfen ob schon initialisiert wurde <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1291916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291916</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 25 May 2007 06:05:32 GMT</pubDate></item></channel></rss>