<?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[globale new operator überladen]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>Ich möchte den globalen new und delete operator überladen, um so memoryleaks ausfindig machen zu können. Leider will der Compiler meinen Code nicht und ich weiß auch mit der Fehlermeldung jetzt nicht wirklich was anzufangen. Der Code sieht wie folgt aus:</p>
<pre><code>#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#define DEBUG_NEW new( THIS_FILE, __LINE__)
#else
#define DEBUG_NEW new
#endif
#define new DEBUG_NEW

#ifdef _DEBUG

inline void * __cdecl operator new(unsigned int size,
                                   const char *file, int line)
{
	void *ptr = (void *)malloc(size);
	AddTrack((DWORD)ptr, size, file, line);
	return(ptr);
};
inline void __cdecl operator delete(void *p)
{
	RemoveTrack((DWORD)p);
	free(p);
};

#endif
</code></pre>
<p>und der Compiler (VC++ 6.0) sagt dazu folgendes:</p>
<pre><code>error C2061: Syntaxfehler : Bezeichner 'THIS_FILE'
</code></pre>
<p>Die Fehlermeldung bezieht sich auf die Zeile mit der Deklaration des neuen new-Operators. Habt jemand eine Ahnung, wo das Problem liegt? Oder gibt es eine Möglichkeit sich die Präprozessorausgabe anzusahen?</p>
<p>Danke!<br />
Karsten</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/168037/globale-new-operator-überladen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 07:46:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/168037.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 17 Dec 2006 20:38:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to globale new operator überladen on Sun, 17 Dec 2006 20:38:56 GMT]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>Ich möchte den globalen new und delete operator überladen, um so memoryleaks ausfindig machen zu können. Leider will der Compiler meinen Code nicht und ich weiß auch mit der Fehlermeldung jetzt nicht wirklich was anzufangen. Der Code sieht wie folgt aus:</p>
<pre><code>#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#define DEBUG_NEW new( THIS_FILE, __LINE__)
#else
#define DEBUG_NEW new
#endif
#define new DEBUG_NEW

#ifdef _DEBUG

inline void * __cdecl operator new(unsigned int size,
                                   const char *file, int line)
{
	void *ptr = (void *)malloc(size);
	AddTrack((DWORD)ptr, size, file, line);
	return(ptr);
};
inline void __cdecl operator delete(void *p)
{
	RemoveTrack((DWORD)p);
	free(p);
};

#endif
</code></pre>
<p>und der Compiler (VC++ 6.0) sagt dazu folgendes:</p>
<pre><code>error C2061: Syntaxfehler : Bezeichner 'THIS_FILE'
</code></pre>
<p>Die Fehlermeldung bezieht sich auf die Zeile mit der Deklaration des neuen new-Operators. Habt jemand eine Ahnung, wo das Problem liegt? Oder gibt es eine Möglichkeit sich die Präprozessorausgabe anzusahen?</p>
<p>Danke!<br />
Karsten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193683</guid><dc:creator><![CDATA[littlejohn]]></dc:creator><pubDate>Sun, 17 Dec 2006 20:38:56 GMT</pubDate></item><item><title><![CDATA[Reply to globale new operator überladen on Sun, 17 Dec 2006 21:00:23 GMT]]></title><description><![CDATA[<p>die #defines sind im weg</p>
<pre><code class="language-cpp">inline void * __cdecl operator new(unsigned int size,
                                   const char *file, int line)
</code></pre>
<p>wird zu</p>
<pre><code class="language-cpp">inline void * __cdecl operator new( THIS_FILE, __LINE__)(unsigned int size,
                                   const char *file, int line)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1193695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193695</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 17 Dec 2006 21:00:23 GMT</pubDate></item><item><title><![CDATA[Reply to globale new operator überladen on Sun, 17 Dec 2006 21:36:35 GMT]]></title><description><![CDATA[<p>ist jetzt klar, danke! hab die defines hinter die declaration verschoben und etwas geändert. sieht jetzt so aus:</p>
<pre><code>#include &lt;string&gt;

using namespace std;

#ifdef _DEBUG

#include &lt;windows.h&gt;
#include &lt;list&gt;
#include &lt;string&gt;

void AddTrack(DWORD addr,  DWORD asize,  const char *fname, DWORD lnum);

void RemoveTrack(DWORD addr);

void DumpUnfreed();

extern int counter;

inline void * __cdecl operator new(unsigned int size,
                                   const char *file, int line, int dummy)
{
	char str[2048];
	sprintf( str, &quot;allocated: %d : %d BYTES at %s (%d)\r\n&quot;, ++counter, size, file, line );

	OutputDebugString( str );

	void *ptr = (void *)malloc(size);
	AddTrack((DWORD)ptr, size, file, line);
	return(ptr);
};

inline void __cdecl operator delete(void *p)
{
	RemoveTrack((DWORD)p);
	free(p);
};

#undef DEBUG_NEW
#define DEBUG_NEW new( __FILE__, __LINE__, 1)
#else
#define DEBUG_NEW new
#endif
#define new DEBUG_NEW
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1193712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193712</guid><dc:creator><![CDATA[littlejohn]]></dc:creator><pubDate>Sun, 17 Dec 2006 21:36:35 GMT</pubDate></item><item><title><![CDATA[Reply to globale new operator überladen on Sun, 17 Dec 2006 21:41:00 GMT]]></title><description><![CDATA[<p>Und was machst du wenn du mal die Funktion operator new für eine Klasse überladen willst? <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/1193714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193714</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sun, 17 Dec 2006 21:41:00 GMT</pubDate></item><item><title><![CDATA[Reply to globale new operator überladen on Sun, 17 Dec 2006 22:12:44 GMT]]></title><description><![CDATA[<p>Sehr schlechter Stil, bennen das Define um in etwas anderes als new.<br />
Und btw. vc bietet so ein tracking system von Haus aus an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193731</guid><dc:creator><![CDATA[lolz]]></dc:creator><pubDate>Sun, 17 Dec 2006 22:12:44 GMT</pubDate></item><item><title><![CDATA[Reply to globale new operator überladen on Mon, 18 Dec 2006 10:47:56 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10754">@David_pb</a>: falls du meinst, was ich mache wenn ich den new-Operator einer bestimmten Klasse überladen will, dann ist das nicht nötig! Alle new-Operatoren rufen irgendwann den globalen Operator auf den ich da überschreibe.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13970">@lolz</a>: ich geb dir auf jeden Fall recht, dass der Stil nicht wirklich gut ist. Das ganze soll auch nur zur schnellen Fehlerbehebung dienen. Leider kann ich die von VC bereitgestellten Trackingfunktionen nicht benutzen, da ich an einem reinen plattfromunabhängigen C++-Projekt arbeite und VC lediglich die Entwicklungsumgebung unter Windows ist. Also kein AFX-irgendwas. Kleine Frage noch: wie würdest du die defines nennen? Ich hab mal in den VC-headern geguckt und die machen das fast genau so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193891</guid><dc:creator><![CDATA[littlejohn]]></dc:creator><pubDate>Mon, 18 Dec 2006 10:47:56 GMT</pubDate></item><item><title><![CDATA[Reply to globale new operator überladen on Mon, 18 Dec 2006 11:21:42 GMT]]></title><description><![CDATA[<p>Anzumerken ist noch, dass im Debug so auch kein placement new mehr möglich ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193905</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 18 Dec 2006 11:21:42 GMT</pubDate></item><item><title><![CDATA[Reply to globale new operator überladen on Mon, 18 Dec 2006 13:16:07 GMT]]></title><description><![CDATA[<p>Nur als Idee, die mir gerade in den Sinn kommt: Diese Art von Protokollierung könnte man auch außerhalb des Operators durchführen und hat dann insoweit keine Schwierigkeiten mit placement new. Im Gegenzug werden einige andere Konstrukte damit fehlerhaft. Nähmlich solche, die unmittelbar sizeof ++,––,~,!,–,+,&amp;,* oder .* , –&gt;* auf das Ergebnis von new anwenden (wobei das Problem für die erste Gruppe durch ein paar Tricks gelöst werden kann - möglicherweise abgesehen von sizeof)</p>
<pre><code class="language-cpp">struct NewLogger
{
    NewLogger(const char* file, const char* Line) : file_( file ), line_( line ) {}
    const char* file_;
    const char* line_;
    template&lt;typename T&gt;
    T* operator%(T* p)
    {
        // Logging
        return p;
    }
};
#define new NewLogger(__FILE__,__LINE__)%new
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1193978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193978</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 18 Dec 2006 13:16:07 GMT</pubDate></item><item><title><![CDATA[Reply to globale new operator überladen on Mon, 18 Dec 2006 14:56:02 GMT]]></title><description><![CDATA[<p>Danke für die Idee mit dem NewLogger! Auch ein interessanter Ansatz.</p>
<p>da muss ich doch glatt mal ne dumme Frage stellen: was ist ein <strong>placement new</strong>? Entweder ist mir das noch nie so untergekommen, oder ich kenne es nicht. Würde mich über aufklärung freuen. Also was ist das und wann setzt man dies sinnvoller Weise ein?</p>
<p>Ausserdem hab ich noch ein Problem. Mein Logger funktioniert soweit, aber scheint nicht alles mitzubekommen, denn er spuckt weniger aus, als das was mir VC-Studio 6 anzeigt. Dummerweise bekomme ich von VC keine Informationen, wo der Speicher allociert wird. Hat jemand eine Idee, was man noch machen könnte, neben einem Logger?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194052</guid><dc:creator><![CDATA[littlejohn]]></dc:creator><pubDate>Mon, 18 Dec 2006 14:56:02 GMT</pubDate></item><item><title><![CDATA[Reply to globale new operator überladen on Mon, 18 Dec 2006 15:24:05 GMT]]></title><description><![CDATA[<p>Placement new bezeichnet die new - Form die wahrscheinlich so definiert ist:</p>
<pre><code class="language-cpp">void* operator new(size_t, void *mem)
{
   return mem;
}
</code></pre>
<p>Aufgerufen wird sie so:</p>
<pre><code class="language-cpp">new (buffer) T;
</code></pre>
<p>Ich meine alle überladen Versionen von new die einen Parameter mehr haben werden als placement new bezeichnet und die obige Version ist sogar in &lt;new&gt; mit dabei und man nennt diese den &quot;placment new&quot;...</p>
<p>Stell dir vor du hast bereits rohen Speicher bzw am Anfang deines Programmes zur Sicherheit einen Speicher-Block besorgt. Später willst du dann in diesen Speicherbereich dein Objekt Konstruieren und das geht dann mit placement new.</p>
<p>Wie du siehst tut placment new nichts anderes als den Speicher zurückzugeben.<br />
Das reicht auch völlig aus den wenn new den operator new aufruft tut er ja dies um Speicher zu bekommen und dann reicht es ja aus deinen Speicher einfach wieder zurückzugeben.</p>
<p>Du kannst dir deine eigenen placement new's konstruieren die zB auch so aussehen.</p>
<pre><code class="language-cpp">void* operator new(size_t size, ostream&amp; stream)
{
  stream &lt;&lt; ......
  return ::operator new(size); // Einfach globalen op aufrufen ( hoffe das war so richtig :) )
}
//...
new (cout) T;
</code></pre>
<p>So kannst du dir dann alles direkt protokolieren.<br />
Danach musst du aber auch placment delete benutzen da der Speicher ja nicht von newm, der sieht dann genau so aus mit einem Parameter mehr.</p>
<p>Vergiss nicht zu all deinen placement new's dann auch die richtigen placement delete's zu schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194067</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 18 Dec 2006 15:24:05 GMT</pubDate></item><item><title><![CDATA[Reply to globale new operator überladen on Mon, 18 Dec 2006 15:29:21 GMT]]></title><description><![CDATA[<p>littlejohn schrieb:</p>
<blockquote>
<p>da muss ich doch glatt mal ne dumme Frage stellen: was ist ein <strong>placement new</strong>? Entweder ist mir das noch nie so untergekommen, oder ich kenne es nicht. Würde mich über aufklärung freuen. Also was ist das und wann setzt man dies sinnvoller Weise ein?</p>
</blockquote>
<p>Zum Beispiel das hier:</p>
<pre><code class="language-cpp">new( __FILE__, __LINE__, 1) T;
</code></pre>
<p>Jeder new Ausruck, bei dem zusätzliche Argumente (in den runden Klammern) an den new-operator geliefert werden, benutzt placement-new. Die Bezeichnung ist Folge der typischen Benutzung: man möchte ein Objekt an einer bestimmten Stelle konstruieren, ohne extra Speicher anzufordern (d.h. man hat den Speicher bereits vorher angefordert). Das ist nützlich und notwendig zum Beispiel für Containerklassen. In diesem Standardfall des placement new (der als einziger auch tatsächlich von vornherein existiert) wird als zusätzliches Argument ein entsprechneder Pointer übergeben. zum Beispiel:</p>
<pre><code class="language-cpp">struct Foo {};
int main()
{
    Foo foo;          // legt ein Foo an, aber keine Initialisierung, da POD
    new(&amp;foo) Foo();  // legt ein initialisiertes Foo an
};
</code></pre>
<p>in diesem Falle nat. nicht sehr nützlich. Bei Placement new wird ein entsprechend überladener new-operator aufgerufen, der die zusätzlichen Argumente als 2.,3. usw. Argument erhält. Interessant ist dabei, dass es kein placement-delete gibt (wohl aber plcement-delete operatoren, die aber nur bei exceptions während eines placement news oder eben explicit aufgerufen werden), im Normalfall will man ja das Objekt nur zerstören und benutzt dafür einen expliziten Destruktoraufruf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194073</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 18 Dec 2006 15:29:21 GMT</pubDate></item><item><title><![CDATA[Reply to globale new operator überladen on Mon, 18 Dec 2006 15:55:43 GMT]]></title><description><![CDATA[<p>Habe nochmal aufgrund camper's Post nachgeblätter und gesehen das diese Aussage falsch war:</p>
<p>Freak_Coder schrieb:</p>
<blockquote>
<p>Danach musst du aber auch placment delete benutzen da der Speicher ja nicht von newm, der sieht dann genau so aus mit einem Parameter mehr.</p>
</blockquote>
<p>Wie camper es sagt gibts aber ein placment delete das bei nicht erfolgreicher Speichernaforderung aufgerufen wird.</p>
<p>Dein placement delete musst die selben Parameter haben wie dein p-new, damit diese im Fehlerfall aufgerufen werden können.</p>
<p>Deine Objekt musst du dann selbst destruieren und danach deinen Speicher so freigeben wie du ihn auch besorgt hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194090</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 18 Dec 2006 15:55:43 GMT</pubDate></item><item><title><![CDATA[Reply to globale new operator überladen on Mon, 18 Dec 2006 23:53:50 GMT]]></title><description><![CDATA[<p>es geht auch folgendes:</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;                                                                                                                                                       
#include &lt;iostream&gt;                                                                                                                                                      
using namespace std;                                                                                                                                                     

#if DEBUG                                                                                                                                                                         
void* operator new(size_t n) {                                                                                                                                           
    cout &lt;&lt; &quot;new of &quot; &lt;&lt; n &lt;&lt; endl;                                                                                                                                      
    void*d = malloc(n);                                                                                                                                                  
    return d;                                                                                                                                                            
}                                                                                                                                                                        
void operator delete(void * p) {                                                                                                                                         
    cout &lt;&lt; &quot;Deleting object &quot; &lt;&lt; p &lt;&lt; endl;                                                                                                                             
    free(p);                                                                                                                                                             
}                                                                                                                                                                        
void operator delete[](void * p) {                                                                                                                                       
    cout &lt;&lt; &quot;Deleting array&quot; &lt;&lt; p &lt;&lt; endl;                                                                                                                               
    free(p);                                                                                                                                                             
}                                                                                                                                                                        

#endif                                                                                                                                                                   
main() {                                                                                                                                                                 
    char* x = new char[10];                                                                                                                                              

    delete[] x;                                                                                                                                                          
}
</code></pre>
<p>man darf new und delete durch eigenes ersetzen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194387</guid><dc:creator><![CDATA[ronny]]></dc:creator><pubDate>Mon, 18 Dec 2006 23:53:50 GMT</pubDate></item><item><title><![CDATA[Reply to globale new operator überladen on Tue, 19 Dec 2006 00:39:06 GMT]]></title><description><![CDATA[<p>r0nny schrieb:</p>
<blockquote>
<p>es geht auch folgendes:</p>
<p>man darf new und delete durch eigenes ersetzen</p>
</blockquote>
<p>Das stand nicht zur Debatte. Das einfache Überladen ist für unsere Zwecke aber nutzlos, weil wir zusätzliche Daten, die nur der Aufrufer kennt, benötigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194397</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 19 Dec 2006 00:39:06 GMT</pubDate></item><item><title><![CDATA[Reply to globale new operator überladen on Tue, 19 Dec 2006 17:46:34 GMT]]></title><description><![CDATA[<p>littlejohn schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10754">@David_pb</a>: falls du meinst, was ich mache wenn ich den new-Operator einer bestimmten Klasse überladen will, dann ist das nicht nötig! Alle new-Operatoren rufen irgendwann den globalen Operator auf den ich da überschreibe.</p>
</blockquote>
<p>Sehr schlau ausgedacht. Es mag aber sein das du die Art der Speicherreservierung anders handhaben willst als bei deiner globalen <strong>Funktion</strong> operator new.</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194997</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Tue, 19 Dec 2006 17:46:34 GMT</pubDate></item></channel></rss>