Probleme mit new/delete



  • Irgendwie habe ich ein paar Probleme beim Überladen der Operatoren new und delete. Mein Quellcode sieht folgendermaßen aus:

    inline void * __cdecl operator new (size_t size, char const * file, int line)
    {
    	void *ptr=malloc(size);
    	printf("Allocate Memory: %s %d\n",__FILE__,__LINE__);
    	return ptr;
    }
    
    inline void __cdecl operator delete( void *ptr )
    {
    	printf("Deallocate Memory\n");
    	free(ptr);
    }
    
    #define new new(__FILE__, __LINE__)
    
    int main()
    {
    	int *p=new int;
    	delete p;
    
    	return 0;
    }
    

    Wenn ich das Programm über Erstellen->Ausführen starte, wird einmal speicher allokiert (bei new int) und dann drei mal deallokiert! Ich verstehe nicht, warum.



  • ich habe noch vergessen zu erwähnen, dass wenn ich das #include <iostream> (das wird davor inkludiert) herausnehme, dass dann alles klar läuft.



  • Also, wenn ich es so mache, dann funktioniert es fast:

    __inline void* operator new (unsigned int size)
    {
    	printf("Allocate Memory: %s %d\n",__FILE__,__LINE__);
    	return(malloc(size));
    }
    
    __inline void operator delete(void *ptr)
    {
    	printf("Deallocate Memory: %s %d\n",__FILE__,__LINE__);
    	free(ptr);
    }
    

    Aber die beiden Makros __FILE__ und __LINE__ geben immer das selbe File und die selbe Zeile aus, da sie ja nur Makros sind und deshalb vorher vom Preprocessor ersetzt werden. Und erst danach wird geinlinet(vom Compiler) Gibt es aber auch eine Funktion, die mir das File oder die Zeile zurückgibt?



  • versuch mal ohne __inline bzw. __cdecl und das Argument des new Operators als size_t Typ



  • btw. verhält sich der new operator anders, als dein Operator. new kann man nicht einfach durch malloc ersetzen, da new noch Konstruktoren aufruft

    das kannst du einfach durch Placement-New nach machen!



  • Wie sieht eigentlich die Implementation der globalen new, delete Operatoren, aus? wird da einfach malloc, free aufgerufen, oder steckt mehr dahinter?



  • Wie sieht eigentlich die Implementation der globalen new, delete Operatoren, aus?

    Ich gehe mal davon aus, dass du die globalen Funktionen operator new/operator delete meinst.
    Deren Implementation ist implementationsabhängig. Der Aufruf von malloc/free ist aber möglich.



  • Noch ne Frage:
    Ist es möglich nach dem ich die new/delete-operator Funktionen überschrieben habe, dass ich in ihnen die überschriebenen aufrufen kann.



  • void *operator new(std::size_t n) {
      return ::operator new(n);
    }
    


  • ich hab da eigentlich an globale new/delete gedacht.



  • Ist es möglich nach dem ich die new/delete-operator Funktionen überschrieben habe, dass ich in ihnen die überschriebenen aufrufen kann.

    Wenn du die globalen Versionen überschreibst, kannst du sie natürlich nicht mehr aufrufen. Schließlich haben sie ja den selben Namen.


Anmelden zum Antworten