<?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[Reihenfolge von globalen Objekten]]></title><description><![CDATA[<p>Abend,</p>
<p>ich habe den globalen operator new überschrieben. Vereinfacht, so:</p>
<pre><code class="language-cpp">void* operator new(size_t size) {
    return g_Allocator.alloc(size);
}
</code></pre>
<p>g_Allocator ist ein globales Objekt (mein Allokator, der per malloc() etc. speicher allokiert).</p>
<p>Nur bin ich mir nicht sicher, ob das funktioniert falls es irgendwo andere globale Objekte geben sollte, die im Ctor new benutzen. Z.B. sowas:</p>
<pre><code class="language-cpp">class Foo {
public:
   int* p;
   Foo() { p = new int; } 
};

...
Foo g_Foo; // globales Foo
</code></pre>
<p>Die Reihenfolge, in der globale Objekte erzeugt werden, ist ja undefiniert. Es könnte jetzt ja sein, dass g_Foo VOR meinem Allokator erzeugt wird. D.h. operator new() wird aufgerufen und dann g_Allocator.alloc(), obwohl g_Allocator noch NICHT erzeugt wurde.</p>
<ol>
<li>Kann das passieren? Oder hab ich was übersehen und kann dieses Szenario garnicht auftreten?</li>
<li>Wenn es passiert kann, was passiert dann? Sprich was passiert wenn g_Allocator.alloc() aufgerufen, obwohl g_Allocator noch nicht erzeugt wurde. Segmanation fault?</li>
<li>Wie könnte ich das lösen?</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/topic/287504/reihenfolge-von-globalen-objekten</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 10:26:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/287504.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 29 May 2011 20:15:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Reihenfolge von globalen Objekten on Sun, 29 May 2011 20:15:56 GMT]]></title><description><![CDATA[<p>Abend,</p>
<p>ich habe den globalen operator new überschrieben. Vereinfacht, so:</p>
<pre><code class="language-cpp">void* operator new(size_t size) {
    return g_Allocator.alloc(size);
}
</code></pre>
<p>g_Allocator ist ein globales Objekt (mein Allokator, der per malloc() etc. speicher allokiert).</p>
<p>Nur bin ich mir nicht sicher, ob das funktioniert falls es irgendwo andere globale Objekte geben sollte, die im Ctor new benutzen. Z.B. sowas:</p>
<pre><code class="language-cpp">class Foo {
public:
   int* p;
   Foo() { p = new int; } 
};

...
Foo g_Foo; // globales Foo
</code></pre>
<p>Die Reihenfolge, in der globale Objekte erzeugt werden, ist ja undefiniert. Es könnte jetzt ja sein, dass g_Foo VOR meinem Allokator erzeugt wird. D.h. operator new() wird aufgerufen und dann g_Allocator.alloc(), obwohl g_Allocator noch NICHT erzeugt wurde.</p>
<ol>
<li>Kann das passieren? Oder hab ich was übersehen und kann dieses Szenario garnicht auftreten?</li>
<li>Wenn es passiert kann, was passiert dann? Sprich was passiert wenn g_Allocator.alloc() aufgerufen, obwohl g_Allocator noch nicht erzeugt wurde. Segmanation fault?</li>
<li>Wie könnte ich das lösen?</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2070687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070687</guid><dc:creator><![CDATA[MichiU]]></dc:creator><pubDate>Sun, 29 May 2011 20:15:56 GMT</pubDate></item><item><title><![CDATA[Reply to Reihenfolge von globalen Objekten on Sun, 29 May 2011 20:19:32 GMT]]></title><description><![CDATA[<ol>
<li>Ja, kann passieren, wenn die Objekte in verschiedenen Übersetzungseinheiten liegen.</li>
<li>Undefiniertes Verhalten - das heißt von Speicherlecks bis zu einem Bluescreen ist alles möglich</li>
<li>vermeide globale Variablen (eine Alternative sind Singletons).</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2070691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070691</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sun, 29 May 2011 20:19:32 GMT</pubDate></item><item><title><![CDATA[Reply to Reihenfolge von globalen Objekten on Sun, 29 May 2011 20:23:43 GMT]]></title><description><![CDATA[<p>Danke für die Antwort!</p>
<p>Naja, da operator new() eine globale Funktion ist, MUSS auch mein Allokator global sein.<br />
Meinst du mit Singleton statt dem hier:</p>
<pre><code class="language-cpp">void* operator new(size_t size) {
    return g_Allocator.alloc(size);
}
</code></pre>
<p>das:</p>
<pre><code class="language-cpp">static Allocator&amp; Allocator::getInstance() {
   static Allocator a;
   return a;
}

void* operator new(size_t size) {
    return Allocator::getInstance().alloc(size);
}
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070692</guid><dc:creator><![CDATA[MichiU]]></dc:creator><pubDate>Sun, 29 May 2011 20:23:43 GMT</pubDate></item><item><title><![CDATA[Reply to Reihenfolge von globalen Objekten on Sun, 29 May 2011 20:27:52 GMT]]></title><description><![CDATA[<p>MichiU schrieb:</p>
<blockquote>
<p>Danke für die Antwort!</p>
<p>Naja, da operator new() eine globale Funktion ist, MUSS auch mein Allokator global sein.</p>
</blockquote>
<p>Wer sagt das? Wichtig ist nur, daß der Allokator dort erreichbar ist, wo du ihn benötigst.</p>
<blockquote>
<p>Meinst du mit Singleton statt dem hier:</p>
<pre><code class="language-cpp">void* operator new(size_t size) {
    return g_Allocator.alloc(size);
}
</code></pre>
<p>das:</p>
<pre><code class="language-cpp">static Allocator&amp; Allocator::getInstance() {
   static Allocator a;
   return a;
}

void* operator new(size_t size) {
    return Allocator::getInstance().alloc(size);
}
</code></pre>
<p>?</p>
</blockquote>
<p>Vereinfacht gesagt: Ja.</p>
<p>PS: Hast du eigentlich einen tieferen Grund, warum du die C++ Speicherverwaltung selber übernehmen willst? Und hast du auch daran gedacht, den operator delete und die Array-Versionen von new/delete zu überladen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070694</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sun, 29 May 2011 20:27:52 GMT</pubDate></item><item><title><![CDATA[Reply to Reihenfolge von globalen Objekten on Sun, 29 May 2011 20:42:08 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Wer sagt das? Wichtig ist nur, daß der Allokator dort erreichbar ist, wo du ihn benötigst.</p>
</blockquote>
<p>Öhh, wie sollte ich denn in operator new() sonst meinen Allokator erreichen, wenn er nicht global ist?</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Vereinfacht gesagt: Ja.</p>
</blockquote>
<p>Klingt so, als wäre das noch immer problematisch?</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>PS: Hast du eigentlich einen tieferen Grund, warum du die C++ Speicherverwaltung selber übernehmen willst? Und hast du auch daran gedacht, den operator delete und die Array-Versionen von new/delete zu überladen?</p>
</blockquote>
<p>Ich mach es vor allem aus Debug/Tracing Gründen. Und ja, alle anderen operator new/delete sind auch überladen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070701</guid><dc:creator><![CDATA[MichiU]]></dc:creator><pubDate>Sun, 29 May 2011 20:42:08 GMT</pubDate></item><item><title><![CDATA[Reply to Reihenfolge von globalen Objekten on Sun, 29 May 2011 20:54:22 GMT]]></title><description><![CDATA[<p>MichiU schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Wer sagt das? Wichtig ist nur, daß der Allokator dort erreichbar ist, wo du ihn benötigst.</p>
</blockquote>
<p>Öhh, wie sollte ich denn in operator new() sonst meinen Allokator erreichen, wenn er nicht global ist?</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Vereinfacht gesagt: Ja.</p>
</blockquote>
<p>Klingt so, als wäre das noch immer problematisch?</p>
</blockquote>
<p>Das Fragment selber ist nicht problematisch, du mußt nur darauf achten, daß der Rest des Singleton auch in Ordnung ist (sprich: getInstance() ist die einzige Methode, die in der Lage ist einen Allokator anzulegen).<br />
Und in den Code hast du auch schon den Trick angewendet, wie man ein nicht-globales Objekt erreichen kann <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>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>PS: Hast du eigentlich einen tieferen Grund, warum du die C++ Speicherverwaltung selber übernehmen willst? Und hast du auch daran gedacht, den operator delete und die Array-Versionen von new/delete zu überladen?</p>
</blockquote>
<p>Ich mach es vor allem aus Debug/Tracing Gründen. Und ja, alle anderen operator new/delete sind auch überladen.</p>
</blockquote>
<p>Dann hoffe ich aber auch, daß die alloc()-Methode ihren Speicher nicht selber per new/delete besorgt (sowohl den von außen angeforderten als auch die eigenen Zusatzinfos).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070708</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sun, 29 May 2011 20:54:22 GMT</pubDate></item></channel></rss>