<?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 operator new]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein verzwicktes Problem. Alle meine Heapallokationen laufen über eine Singleton Klasse MemoryManager. Der MemoryManager hat (aus Debug/Trackgründen) eine std::map als private Member. Vereinfacht gesagt:</p>
<pre><code class="language-cpp">class MemoryManager {
private:
    std::map&lt;void*, AllocInfo&gt;	mAllocMap;

    MemoryManager() { }
    MemoryManager(const MemoryManager&amp; rhs) { }
    MemoryManager&amp; operator=(const MemoryManager&amp; rhs) { }
   ~MemoryManager() { }

public:
    static MemoryManager&amp; MemoryManager::getInstance() {
        static MemoryManager instance;
        return instance;
    }

    void* allocate(size_t size);
    void  deallocate(void* p);

    void addLogEntry(...);
};
</code></pre>
<p>Mein operator new sieht (vereinfacht) so aus:</p>
<pre><code class="language-cpp">void* operator new(size_t size) {
    void* p = MemoryManager::getInstance().allocate(size);
    MemoryManager::getInstance().addLogEntry(...); // Zeile A
    return p;
}
</code></pre>
<p>So, wenn ich jetzt in meinem main() ein new Foo; mache, dann stürzt er in Zeile A ab.<br />
Meine Vermutung (!) ist, dass das der Grund ist: new -&gt; operator new wird aufgerufen -&gt; MemoryManager::getInstance() wird aufgerufen -&gt; in getInstance() wird ein statisches lokales Objekt vom Typ MemoryManager angelegt, ergo wird der MemoryManager Ctor aufgerufen. Der ist zwar leer, aber da MemoryManager als Member eine std::map hat, wird der std::map Ctor aufgerufen und der macht offenbar ein new. Jetzt landen wir wieder in meinem operator new -&gt; er holt sich die eine Singleton Instanz (die aber noch nicht fertig initialisiert ist!) und crasht dann beim Methodenaufruf (da MemoryManager noch nicht fertig intialisiert ist).</p>
<ol>
<li>Ist meine Analyse richtig? Ist das das Problem?</li>
<li>Wie kann ich das fixen? Das ist irgendwie ein Teufelskreis. MemoryManager Ctor ruft std::map Ctor auf und der benutzt new, was wiederrum meinen MemoryManager braucht, der aber noch nicht fertig ist. Wie löse ich das?</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/topic/287753/problem-mit-operator-new</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 07:46:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/287753.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 03 Jun 2011 12:29:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 12:29:29 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein verzwicktes Problem. Alle meine Heapallokationen laufen über eine Singleton Klasse MemoryManager. Der MemoryManager hat (aus Debug/Trackgründen) eine std::map als private Member. Vereinfacht gesagt:</p>
<pre><code class="language-cpp">class MemoryManager {
private:
    std::map&lt;void*, AllocInfo&gt;	mAllocMap;

    MemoryManager() { }
    MemoryManager(const MemoryManager&amp; rhs) { }
    MemoryManager&amp; operator=(const MemoryManager&amp; rhs) { }
   ~MemoryManager() { }

public:
    static MemoryManager&amp; MemoryManager::getInstance() {
        static MemoryManager instance;
        return instance;
    }

    void* allocate(size_t size);
    void  deallocate(void* p);

    void addLogEntry(...);
};
</code></pre>
<p>Mein operator new sieht (vereinfacht) so aus:</p>
<pre><code class="language-cpp">void* operator new(size_t size) {
    void* p = MemoryManager::getInstance().allocate(size);
    MemoryManager::getInstance().addLogEntry(...); // Zeile A
    return p;
}
</code></pre>
<p>So, wenn ich jetzt in meinem main() ein new Foo; mache, dann stürzt er in Zeile A ab.<br />
Meine Vermutung (!) ist, dass das der Grund ist: new -&gt; operator new wird aufgerufen -&gt; MemoryManager::getInstance() wird aufgerufen -&gt; in getInstance() wird ein statisches lokales Objekt vom Typ MemoryManager angelegt, ergo wird der MemoryManager Ctor aufgerufen. Der ist zwar leer, aber da MemoryManager als Member eine std::map hat, wird der std::map Ctor aufgerufen und der macht offenbar ein new. Jetzt landen wir wieder in meinem operator new -&gt; er holt sich die eine Singleton Instanz (die aber noch nicht fertig initialisiert ist!) und crasht dann beim Methodenaufruf (da MemoryManager noch nicht fertig intialisiert ist).</p>
<ol>
<li>Ist meine Analyse richtig? Ist das das Problem?</li>
<li>Wie kann ich das fixen? Das ist irgendwie ein Teufelskreis. MemoryManager Ctor ruft std::map Ctor auf und der benutzt new, was wiederrum meinen MemoryManager braucht, der aber noch nicht fertig ist. Wie löse ich das?</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2072768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072768</guid><dc:creator><![CDATA[Karya22]]></dc:creator><pubDate>Fri, 03 Jun 2011 12:29:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 13:06:06 GMT]]></title><description><![CDATA[<p>Anstatt hier groß zu spekulieren: Solchen Fehler kommt man recht leicht mit Hilfe eines Debuggers auf die Spur.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072788</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 03 Jun 2011 13:06:06 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 13:50:27 GMT]]></title><description><![CDATA[<p>Okay, war nicht richtig... habs mir gerade nochmal angeschaut... Sorry.<br />
Ich mache das normallerweise etwas anderst, aber so ists fast schöner... =)...</p>
<p>L.g.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072792</guid><dc:creator><![CDATA[AlexanderKiebler]]></dc:creator><pubDate>Fri, 03 Jun 2011 13:50:27 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 13:32:03 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Anstatt hier groß zu spekulieren: Solchen Fehler kommt man recht leicht mit Hilfe eines Debuggers auf die Spur.</p>
</blockquote>
<p>Das sagt sich so leicht. So leicht ist der Output auch nicht zu interpretieren:</p>
<blockquote>
<p>App.exe!std::_Tree&lt;std::_Tmap_traits&lt;void * __ptr64,ple::MemManager::AllocInfo,std::less&lt;void * __ptr64&gt;,std::allocator&lt;std::pair&lt;void * __ptr64 const,ple::MemManager::AllocInfo&gt; &gt;,0&gt; &gt;::_Lbound(void * const &amp; _Keyval=0x0000000001c078b0) Line 1742 + 0xa bytes C++<br />
App.exe!std::_Tree&lt;std::_Tmap_traits&lt;void * __ptr64,ple::MemManager::AllocInfo,std::less&lt;void * __ptr64&gt;,std::allocator&lt;std::pair&lt;void * __ptr64 const,ple::MemManager::AllocInfo&gt; &gt;,0&gt; &gt;::lower_bound(void * const &amp; _Keyval=0x0000000001c078b0) Line 1450 + 0xf bytes C++<br />
&gt; App.exe!std::map&lt;void * __ptr64,ple::MemManager::AllocInfo,std::less&lt;void * __ptr64&gt;,std::allocator&lt;std::pair&lt;void * __ptr64 const,ple::MemManager::AllocInfo&gt; &gt; &gt;::operator[](void * const &amp; _Keyval=0x0000000001c078b0) Line 211 + 0x1a bytes C++<br />
App.exe!ple::MemManager::createAllocInfo(void * p=0x0000000001c078b0, unsigned int size=16, const char * desc=0x000000013f996c4f, MEM_TYPE memType=MEM_EXT, bool isArray=false, const char * srcFilename=0x000000013f996c4e, int line=-1) Line 73 + 0x77 bytes C++<br />
App.exe!operator new(unsigned <strong>int64 size=16) Line 225 C++<br />
App.exe!std::_Allocate<a href="std::%5C_Container%5C_proxy" rel="nofollow">std::\_Container\_proxy</a>(unsigned __int64 _Count=1, std::_Container_proxy * __formal=0x0000000000000000) Line 36 + 0x22 bytes C++<br />
App.exe!std::allocator<a href="std::%5C_Container%5C_proxy" rel="nofollow">std::\_Container\_proxy</a>::allocate(unsigned __int64 _Count=1) Line 188 C++<br />
App.exe!std::_Tree_nod&lt;std::_Tmap_traits&lt;void * __ptr64,ple::MemManager::AllocInfo,std::less&lt;void * __ptr64&gt;,std::allocator&lt;std::pair&lt;void * __ptr64 const,ple::MemManager::AllocInfo&gt; &gt;,0&gt; &gt;::_Tree_nod&lt;std::_Tmap_traits&lt;void * __ptr64,ple::MemManager::AllocInfo,std::less&lt;void * __ptr64&gt;,std::allocator&lt;std::pair&lt;void * __ptr64 const,ple::MemManager::AllocInfo&gt; &gt;,0&gt; &gt;(const std::less&lt;void *&gt; &amp; _Parg=less, std::allocator&lt;std::pair&lt;void * const,ple::MemManager::AllocInfo&gt; &gt; * _Al=0x000000000016f760) Line 492 + 0xf bytes C++<br />
App.exe!std::_Tree_val&lt;std::_Tmap_traits&lt;void * __ptr64,ple::MemManager::AllocInfo,std::less&lt;void * __ptr64&gt;,std::allocator&lt;std::pair&lt;void * __ptr64 const,ple::MemManager::AllocInfo&gt; &gt;,0&gt; &gt;::_Tree_val&lt;std::_Tmap_traits&lt;void * __ptr64,ple::MemManager::AllocInfo,std::less&lt;void * __ptr64&gt;,std::allocator&lt;std::pair&lt;void * __ptr64 const,ple::MemManager::AllocInfo&gt; &gt;,0&gt; &gt;(const std::less&lt;void *&gt; &amp; _Parg=less, std::allocator&lt;std::pair&lt;void * const,ple::MemManager::AllocInfo&gt; &gt; * _Al=0x000000000016f7b0) Line 542 + 0x5c bytes C++<br />
App.exe!std::_Tree&lt;std::_Tmap_traits&lt;void * __ptr64,ple::MemManager::AllocInfo,std::less&lt;void * __ptr64&gt;,std::allocator&lt;std::pair&lt;void * __ptr64 const,ple::MemManager::AllocInfo&gt; &gt;,0&gt; &gt;::_Tree&lt;std::_Tmap_traits&lt;void * __ptr64,ple::MemManager::AllocInfo,std::less&lt;void * __ptr64&gt;,std::allocator&lt;std::pair&lt;void * __ptr64 const,ple::MemManager::AllocInfo&gt; &gt;,0&gt; &gt;(const std::less&lt;void *&gt; &amp; _Parg=less, const std::allocator&lt;std::pair&lt;void * const,ple::MemManager::AllocInfo&gt; &gt; &amp; _Al={...}) Line 699 C++<br />
App.exe!std::map&lt;void * __ptr64,ple::MemManager::AllocInfo,std::less&lt;void * __ptr64&gt;,std::allocator&lt;std::pair&lt;void * __ptr64 const,ple::MemManager::AllocInfo&gt; &gt; &gt;::map&lt;void * __ptr64,ple::MemManager::AllocInfo,std::less&lt;void * __ptr64&gt;,std::allocator&lt;std::pair&lt;void * __ptr64 const,ple::MemManager::AllocInfo&gt; &gt; &gt;() Line 107 C++<br />
App.exe!ple::MemManager::MemManager() Line 32 C++<br />
App.exe!ple::MemManager::getInstance() Line 22 + 0x28 bytes C++<br />
App.exe!operator new(unsigned __int64 size=104, const char * desc=0x000000013f99696d, MEM_TYPE memType=MEM_OBJ, const char * srcFilename=0x000000013f996960, int line=43) Line 187 + 0x5 bytes C++<br />
App.exe!WinMain(HINSTANCE</strong> * hInstance=0x000000013f8f0000, HINSTANCE__ * hPrevInstance=0x0000000000000000, char * szCmdLine=0x0000000000303ab0, int iCmdShow=1) Line 43 + 0x26 bytes C++</p>
</blockquote>
<p>So wie ich das sehe stürzt er beim map operator[] in dieser Funktion ab:</p>
<pre><code class="language-cpp">void MemManager::createAllocInfo(void* p, unsigned int size, const char* desc, MEM_TYPE memType, bool isArray, const char* srcFilename, int line) {

   if(mLockCount &gt; 0)
      return;

    MemManager::AllocLock lock(*this); // Disable alloc tracking
    mAllocMap[p] = AllocInfo(desc, memType, isArray, size, srcFilename, line); // hier stürzt er ab
}
</code></pre>
<p>Kann es sein, dass die Map noch garnicht fertig initialisiert ist an der Stelle, an der ich map::operator[] aufrufe?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22053">@AlexanderKiebler</a>: Keine Ahnung was du meinst. Das ist einfach ein Meyer Singleton und ich will definitiv keinen Zeiger benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072802</guid><dc:creator><![CDATA[Karya22]]></dc:creator><pubDate>Fri, 03 Jun 2011 13:32:03 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 13:44:16 GMT]]></title><description><![CDATA[<p>(Nicht hübsch:) Du kannst der map einen Allokator mitgeben. Da baust Du einen, der halt nur malloc benutzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072807</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 03 Jun 2011 13:44:16 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 14:26:10 GMT]]></title><description><![CDATA[<p>Spontan fällt mir nur ein: Der std::map kann man einen Allocator mit auf den Weg geben. Dort müsste man einen entsprechenden übergeben. Weiß allerdings nicht ob es schon geeignete vordefinierte Allocatoren dafür gibt - sonst selber einen backen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072831</guid><dc:creator><![CDATA[tunichtgut]]></dc:creator><pubDate>Fri, 03 Jun 2011 14:26:10 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 14:50:49 GMT]]></title><description><![CDATA[<p>Hm, das gefällt mir alles nicht.</p>
<p>Könnte mir dennoch jemand mal sagen, ob meine Einschätzung richtig ist? Ich würde nämlich auch gerne was aus dem Problem lernen und wissen WIESO er abstürzt beim map::operator[].</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072843</guid><dc:creator><![CDATA[Karya22]]></dc:creator><pubDate>Fri, 03 Jun 2011 14:50:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 15:39:14 GMT]]></title><description><![CDATA[<p>Karya22 schrieb:</p>
<blockquote>
<p>Hm, das gefällt mir alles nicht.</p>
<p>Könnte mir dennoch jemand mal sagen, ob meine Einschätzung richtig ist? Ich würde nämlich auch gerne was aus dem Problem lernen und wissen WIESO er abstürzt beim map::operator[].</p>
</blockquote>
<p>Weil du auf den []-Operator der map zugreifst, bevor diese fertig konstruiert ist.<br />
Das ist ein prinzipielles Problem: mit der map speicherst du Metadaten in einem separaten Speicherbereich. Das setzt aber veraus dass dieser separate Speicherbereich nicht auch noch verwaltet wird, andernfalls hast du ein Rekursionsproblem. Je nachdem wie die map implementiert ist, entweder bei der Konstruktion oder spätestens wenn du zum ersten mal eine Allokation durchführst.</p>
<p>Die Lösung besteht entweder in einem map-Allokator, der deine eigene Speicherverwaltung umgeht, oder in einem anderem Design, das die Metadaten eben nicht in einem gesonderten Bereich ablegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072877</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 03 Jun 2011 15:39:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 15:44:34 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Karya22 schrieb:</p>
<blockquote>
<p>Hm, das gefällt mir alles nicht.</p>
<p>Könnte mir dennoch jemand mal sagen, ob meine Einschätzung richtig ist? Ich würde nämlich auch gerne was aus dem Problem lernen und wissen WIESO er abstürzt beim map::operator[].</p>
</blockquote>
<p>Weil du auf den []-Operator der map zugreifst, bevor diese fertig konstruiert ist.<br />
Das ist ein prinzipielles Problem: mit der map speicherst du Metadaten in einem separaten Speicherbereich. Das setzt aber veraus dass dieser separate Speicherbereich nicht auch noch verwaltet wird, andernfalls hast du ein Rekursionsproblem. Je nachdem wie die map implementiert ist, entweder bei der Konstruktion oder spätestens wenn du zum ersten mal eine Allokation durchführst.</p>
<p>Die Lösung besteht entweder in einem map-Allokator, der deine eigene Speicherverwaltung umgeht, oder in einem anderem Design, das die Metadaten eben nicht in einem gesonderten Bereich ablegt.</p>
</blockquote>
<p>Danke für die hilfreiche Antwort! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Aber ein eigener Map Alloaktor geht doch dann nur für die map. Ich will ja ALLE new's kontrollieren, auch ein new int, oder new string etc.<br />
Hast du vllt einen kontreten Vorschlag, wie das ohne &quot;gesonderten Bereich&quot; aussehen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072885</guid><dc:creator><![CDATA[Karya22]]></dc:creator><pubDate>Fri, 03 Jun 2011 15:44:34 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 15:49:50 GMT]]></title><description><![CDATA[<p>Einen eigenen map-Allokator kannst du ja für <strong>genau diese</strong> eine map festlegen.</p>
<p>Und die Lösung besteht ja darin, daß du einen Allokator ohne Verwendung von new nimmst und deine mAllocMap damit ausstattest - d.h. alle new-Aufrufe <strong>außer</strong> aus dieser Map werden durch deinen operator new geleitet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072887</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 03 Jun 2011 15:49:50 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 16:01:03 GMT]]></title><description><![CDATA[<p>Kann es sein, dass es saukompliziert ist, so einen eigenen Allocator zu schreiben.<br />
Hab gerade das hier ergoogelt: <a href="http://www.codeproject.com/KB/cpp/allocator.aspx" rel="nofollow">http://www.codeproject.com/KB/cpp/allocator.aspx</a></p>
<p>und mal ernsthaft: WTF?! Der schreibt da zig Klassen mit Traits und Policies und was weiß ich noch alles. Muss das so komplex sein?:(</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072894</guid><dc:creator><![CDATA[Karya22]]></dc:creator><pubDate>Fri, 03 Jun 2011 16:01:03 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 16:05:06 GMT]]></title><description><![CDATA[<p>Ja, man kann es wirklich bis zum Extrem treiben - aber für dich dürfte die erste Version ausreuchen. Du mußt nur die Methoden allocate() und deallocate() anpassen, so daß sie mit malloc() bzw. free() arbeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072897</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 03 Jun 2011 16:05:06 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 17:07:30 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Ja, man kann es wirklich bis zum Extrem treiben - aber für dich dürfte die erste Version ausreuchen. Du mußt nur die Methoden allocate() und deallocate() anpassen, so daß sie mit malloc() bzw. free() arbeiten.</p>
</blockquote>
<p>Danke!</p>
<p>Hab mir jetzt mal schnell einen simplen Allocator geschrieben. Das hier sind wohl die wichtigsten Methode:</p>
<pre><code class="language-cpp">inline pointer allocate(size_type cnt,  typename std::allocator&lt;void&gt;::const_pointer = 0) { 
    return reinterpret_cast&lt;pointer&gt;(malloc(cnt * sizeof(T))); 
}

inline void deallocate(pointer p, size_type) { 
    free(p);
}

inline size_type max_size() const { 
    return std::numeric_limits&lt;size_type&gt;::max() / sizeof(T);
}

inline void construct(pointer p, const T&amp; t) { new(p) T(t); }
inline void destroy(pointer p) { p-&gt;~T(); }
</code></pre>
<p>Sieht das ok aus? Meine einzige Frage dazu: In construct() benutze ich new(p). Aber das ruft ja NICHT meinen globalen operator new(size_t s) auf, sondern das ist ein placement new, das operator new(size_t s, void* p) aufruft, oder?</p>
<p>Noch was: Wenn ich in meinem MemoryManager jetzt die Map mit meinem Custom Allocator erzeugen will:</p>
<pre><code class="language-cpp">typedef MemManagerMapAllocator&lt; std::pair&lt;void*, AllocInfo&gt; &gt; MapAllocator;
std::map&lt;void*, AllocInfo, std::less&lt;void*&gt;, MapAllocator&gt;	mAllocMap;
</code></pre>
<p>kriege ich folgende kryptische Fehlermeldung:</p>
<blockquote>
<blockquote>
<p>D:\Microsoft Visual Studio 10.0\VC\include\xtree(698): error C2664: 'std::_Tree_val&lt;_Traits&gt;::_Tree_val(const std::less&lt;_Ty&gt; &amp;,ple::MemManagerMapAllocator&lt;T&gt;)' : cannot convert parameter 2 from 'const ple::MemManagerMapAllocator&lt;T&gt;' to 'ple::MemManagerMapAllocator&lt;T&gt;'<br />
1&gt; with<br />
1&gt; [<br />
1&gt; _Traits=std::_Tmap_traits&lt;void *,ple::MemManager::AllocInfo,std::less&lt;void *&gt;,ple::MemManager::MapAllocator,false&gt;,<br />
1&gt; _Ty=void *,<br />
1&gt; T=std::pair&lt;void *const ,ple::MemManager::AllocInfo&gt;<br />
1&gt; ]<br />
1&gt; and<br />
1&gt; [<br />
1&gt; T=std::pair&lt;void *const ,ple::MemManager::AllocInfo&gt;<br />
1&gt; ]<br />
1&gt; and<br />
1&gt; [<br />
1&gt; T=std::pair&lt;void *const ,ple::MemManager::AllocInfo&gt;<br />
1&gt; ]<br />
1&gt; Constructor for class 'ple::MemManagerMapAllocator&lt;T&gt;' is declared 'explicit'<br />
1&gt; with<br />
1&gt; [<br />
1&gt; T=std::pair&lt;void *const ,ple::MemManager::AllocInfo&gt;<br />
1&gt; ]<br />
1&gt; D:\Microsoft Visual Studio 10.0\VC\include\xtree(695) : while compiling class template member function 'std::_Tree&lt;_Traits&gt;::_Tree(const std::less&lt;_Ty&gt; &amp;,const ple::MemManagerMapAllocator&lt;T&gt; &amp;)'<br />
1&gt; with<br />
1&gt; [<br />
1&gt; _Traits=std::_Tmap_traits&lt;void *,ple::MemManager::AllocInfo,std::less&lt;void *&gt;,ple::MemManager::MapAllocator,false&gt;,<br />
1&gt; _Ty=void *,<br />
1&gt; T=std::pair&lt;void *const ,ple::MemManager::AllocInfo&gt;<br />
1&gt; ]<br />
1&gt; D:\Microsoft Visual Studio 10.0\VC\include\map(81) : see reference to class template instantiation 'std::_Tree&lt;_Traits&gt;' being compiled<br />
1&gt; with<br />
1&gt; [<br />
1&gt; _Traits=std::_Tmap_traits&lt;void *,ple::MemManager::AllocInfo,std::less&lt;void *&gt;,ple::MemManager::MapAllocator,false&gt;<br />
1&gt; ]<br />
1&gt; E:\Programmieren\C++\MemManager.h(174) : see reference to class template instantiation 'std::map&lt;_Kty,_Ty,_Pr,_Alloc&gt;' being compiled<br />
1&gt; with<br />
1&gt; [<br />
1&gt; _Kty=void *,<br />
1&gt; _Ty=ple::MemManager::AllocInfo,<br />
1&gt; _Pr=std::less&lt;void *&gt;,<br />
1&gt; _Alloc=ple::MemManager::MapAllocator<br />
1&gt; ]</p>
</blockquote>
</blockquote>
<p>Was ist der Fehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072915</guid><dc:creator><![CDATA[Karya22]]></dc:creator><pubDate>Fri, 03 Jun 2011 17:07:30 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 17:20:37 GMT]]></title><description><![CDATA[<p>Karya22 schrieb:</p>
<blockquote>
<p>Sieht das ok aus? Meine einzige Frage dazu: In construct() benutze ich new(p). Aber das ruft ja NICHT meinen globalen operator new(size_t s) auf, sondern das ist ein placement new, das operator new(size_t s, void* p) aufruft, oder?</p>
</blockquote>
<p>Ja, diese Methoden sehen auf den ersten Blick OK aus, also liegt der Fehler vermutlich woanders. Und ja, construct*( verwendet nicht deinen operator new, sondern das placement new.</p>
<blockquote>
<p>Noch was: Wenn ich in meinem MemoryManager jetzt die Map mit meinem Custom Allocator erzeugen will:</p>
<pre><code class="language-cpp">typedef MemManagerMapAllocator&lt; std::pair&lt;void*, AllocInfo&gt; &gt; MapAllocator;
std::map&lt;void*, AllocInfo, std::less&lt;void*&gt;, MapAllocator&gt;	mAllocMap;
</code></pre>
<p>kriege ich folgende kryptische Fehlermeldung:</p>
</blockquote>
<p>Das sieht so aus, als hättest du irgendwo ein const zu viel oder zu wenig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072923</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 03 Jun 2011 17:20:37 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 17:36:49 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<blockquote>
<p>Noch was: Wenn ich in meinem MemoryManager jetzt die Map mit meinem Custom Allocator erzeugen will:</p>
<pre><code class="language-cpp">typedef MemManagerMapAllocator&lt; std::pair&lt;void*, AllocInfo&gt; &gt; MapAllocator;
std::map&lt;void*, AllocInfo, std::less&lt;void*&gt;, MapAllocator&gt;	mAllocMap;
</code></pre>
<p>kriege ich folgende kryptische Fehlermeldung:</p>
</blockquote>
<p>Das sieht so aus, als hättest du irgendwo ein const zu viel oder zu wenig.</p>
</blockquote>
<p>Hm ja. Ich versteh nur nicht wo. Er bringt auch nicht irgend eine Zeile, in der der Fehler ist. Wenn ich auf die Fehlermeldung doppelt klicke, springt VS in diesen Code (Datei xtree):</p>
<pre><code class="language-cpp">explicit _Tree(const key_compare&amp; _Parg,
		const allocator_type&amp; _Al)
		: _Mybase(_Parg, _Al)
		{	// construct empty tree
		}
</code></pre>
<p>Zur Vollständigkeit hier mein Allocator:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class MemManagerMapAllocator {
public : 
    typedef T value_type;
    typedef value_type* pointer;
    typedef const value_type* const_pointer;
    typedef value_type&amp; reference;
    typedef const value_type&amp; const_reference;
    typedef std::size_t size_type;
    typedef std::ptrdiff_t difference_type;

public : 
    template&lt;typename U&gt;
    struct rebind {
        typedef MemManagerMapAllocator&lt;U&gt; other;
    };

public : 
    inline explicit MemManagerMapAllocator() {}
    inline ~MemManagerMapAllocator() {}
    inline explicit MemManagerMapAllocator(MemManagerMapAllocator const&amp;) {}
    template&lt;typename U&gt;
    inline explicit MemManagerMapAllocator(MemManagerMapAllocator&lt;U&gt; const&amp;) {}

    inline pointer address(reference r) { return &amp;r; }
    inline const_pointer address(const_reference r) { return &amp;r; }

    inline pointer allocate(size_type cnt,  typename std::allocator&lt;void&gt;::const_pointer = 0) { 
     return reinterpret_cast&lt;pointer&gt;(malloc(cnt * sizeof(T))); 
}

    inline void deallocate(pointer p, size_type) { 
        free(p); 
    }

    inline size_type max_size() const { 
        return std::numeric_limits&lt;size_type&gt;::max() / sizeof(T);
 }

    inline void construct(pointer p, const T&amp; t) { new(p) T(t); }
    inline void destroy(pointer p) { p-&gt;~T(); }

    inline bool operator==(MemManagerMapAllocator const&amp;) { return true; }
    inline bool operator!=(MemManagerMapAllocator const&amp; a) { return !operator==(a); }
};
</code></pre>
<p>Jemand eine Idee, wo da mein Fehler ist? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072933</guid><dc:creator><![CDATA[Karya22]]></dc:creator><pubDate>Fri, 03 Jun 2011 17:36:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 17:57:08 GMT]]></title><description><![CDATA[<p>Lass das explizit weg. Wie kommt man eigentlich auf die Idee, das routinemäßig zu machen, insbes. mit Kopierkonstruktoren?<br />
allocate sollte static_cast benutzen:</p>
<pre><code class="language-cpp">inline pointer allocate(size_type cnt, const_pointer = 0) { 
     return static_cast&lt;pointer&gt;(malloc(cnt * sizeof(T)));
}
</code></pre>
<p>construct sollte einen cast enthalten:</p>
<pre><code class="language-cpp">inline void construct(pointer p, const T&amp; t) { new(static_cast&lt;void*&gt;(p)) T(t); }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2072943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072943</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 03 Jun 2011 17:57:08 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 19:27:57 GMT]]></title><description><![CDATA[<p>Vielen Dank! Die Fehler sind weg!</p>
<p>Äh noch was. Hab mir 3 Beispielcodes für Custom Allocators ergoogelt und irgendwie machen alle 3 recht unterschiedliche Sachen. Offenbar ist das noch immer so ein bißchen ein Mysterium. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Einer hat z.B. von public std::allocator&lt;T&gt; abgeleitet. Sollte man das machen? Bringt das irgendwas?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2073002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2073002</guid><dc:creator><![CDATA[Karya22]]></dc:creator><pubDate>Fri, 03 Jun 2011 19:27:57 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 19:32:09 GMT]]></title><description><![CDATA[<p>Tja, da sieht man mal wieder, daß viele Wege nach Rom führen können <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>Karya22 schrieb:</p>
<blockquote>
<p>Einer hat z.B. von public std::allocator&lt;T&gt; abgeleitet. Sollte man das machen? Bringt das irgendwas?</p>
</blockquote>
<p>Normalerweise hast du im Allokator ziemlich viele Sachen, die sich nicht groß bei verschiedenen Implementationen unterscheiden (construct(), destroy(), die ganzen typedef's). In std::allokator&lt;&gt; sind die alle schon enthalten, also würdest du dir damit ein wenig der Arbeit einsparen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2073004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2073004</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 03 Jun 2011 19:32:09 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 20:27:55 GMT]]></title><description><![CDATA[<p>Entscheidend ist nicht die Definition des Standardallokators sondern die allgemeinen Anforderungen an Allokatoren (20.1.5)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2073016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2073016</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 03 Jun 2011 20:27:55 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Fri, 03 Jun 2011 23:51:36 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">construct(pointer p, const T&amp; t) { new(static_cast&lt;void*&gt;(p)) T(t); }
</code></pre>
</blockquote>
<p>Nach void* kann implizit gecastet werden, daher ist dieser Cast nicht nötig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2073095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2073095</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 03 Jun 2011 23:51:36 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Sat, 04 Jun 2011 00:03:16 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">construct(pointer p, const T&amp; t) { new(static_cast&lt;void*&gt;(p)) T(t); }
</code></pre>
</blockquote>
<p>Nach void* kann implizit gecastet werden, daher ist dieser Cast nicht nötig.</p>
</blockquote>
<p>&quot;impliziter cast&quot; ist schon mal ein Widerspruch in sich. Ein Cast ist immer explizit, schließlich handelt es sich um eine bestimmte grammatikalische Form.<br />
Ein Konvertierung kann implizit sein, und natürlich können Objektzeiger implizit in void* konvertiert werden.<br />
Der Cast hier dient dazu, garantiert die Standardversion des placement new (die nicht ersetzt werden darf) aufzurufen. Schließlich wäre es denkbar, dass für ein T eine placement-new-Funktion etwa der Signatur</p>
<pre><code class="language-cpp">operator new(size_t,T*)
</code></pre>
<p>existiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2073100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2073100</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 04 Jun 2011 00:03:16 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Sat, 04 Jun 2011 00:35:59 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23275">@314159265358979</a>:<br />
Tip: wenn camper was schreibt, macht es tendenziell eher Sinn zu fragen was der Sinn ist, als zu behaupten dass es unnötig wäre <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/2073103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2073103</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 04 Jun 2011 00:35:59 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit operator new on Sat, 04 Jun 2011 07:22:27 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Tip: wenn camper was schreibt, macht es tendenziell eher Sinn zu fragen was der Sinn ist, als zu behaupten dass es unnötig wäre <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>An manchen Stellen, wo ich nicht sicher bin was der Standard vorschreibt/verbietet, würd ich im Code einfach gerne folgendes schreiben:</p>
<pre><code class="language-cpp">using std::camper;
</code></pre>
<p><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/2073122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2073122</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sat, 04 Jun 2011 07:22:27 GMT</pubDate></item></channel></rss>