Giddion Skrevet 6. oktober 2006 Del Skrevet 6. oktober 2006 (endret) Jeg holder på med et lite prosjekt det jeg skal prøve å overloade new og delete. Jeg har også lyst til å lage en debug version der linje og filnavn fra stedet der allokerings skjer skal bli lagret. Jeg tenkte derfor at en macro ville være perfekt som et mellom leddet mellom den ordentlige new og debug new Jeg har laget et liste test program, men det funker jo ikke helt som jeg vil det skal gjøre og vil ikke kompilere. Det virker som om macroen blir helt ignorert. Koden Skjult tekst: (Marker innholdet i feltet for å se teksten): #include <stdio.h> #include <new> class base { public: base() { printf("Constructor called\n"); } ~base(void) { printf("Destructor called\n"); } void *operator new( unsigned int num_bytes,char* file,unsigned int line) { return malloc( num_bytes); } }; #define new(num_bytes) new(__FILE__,__LINE__) void main() { base* test = new base; delete test; } takker for alle svar Endret 6. oktober 2006 av Giddion Lenke til kommentar
lnostdal Skrevet 6. oktober 2006 Del Skrevet 6. oktober 2006 Jeg holder på med et lite prosjekt det jeg skal prøve å overloade new og delete. Jeg har også lyst til å lage en debug version der linje og filnavn fra stedet der allokerings skjer skal bli lagret.Jeg tenkte derfor at en macro ville være perfekt som et mellom leddet mellom den ordentlige new og debug new Jeg har laget et liste test program, men det funker jo ikke helt som jeg vil det skal gjøre og vil ikke kompilere. Det virker som om macroen blir helt ignorert. Koden Skjult tekst: (Marker innholdet i feltet for å se teksten): #include <stdio.h> #include <new> class base { public: base() { printf("Constructor called\n"); } ~base(void) { printf("Destructor called\n"); } void *operator new( unsigned int num_bytes,char* file,unsigned int line) { return malloc( num_bytes); } }; #define new(num_bytes) new(__FILE__,__LINE__) void main() { base* test = new base; delete test; } takker for alle svar 7011999[/snapback] Tror ikke dette med __LINE__ og __FILE__ er mulig da `new' er en operator med syntax: new type mens syntaxen for macro-funksjoner ser ut som funksjonskall: someMacro(some_argument). Angående resten så ser dette ut til å fungere - uten at jeg har sett fryktelig nøye over det: #include <iostream> #include <new> #include <cstdlib> using namespace std; class base { public: base() { cout << "base::base()" << endl; } base(char const* hello) { cout << "base::base(char const*): " << hello << endl; } ~base() { cout << "~base()" << endl; } void* operator new(size_t size) throw (char const*) { cout << "base::operator new" << endl; void* mem = malloc(size); if(!mem) throw "base::operator new, failed"; return mem; } void operator delete(void* mem) { cout << "base::operator delete" << endl; free(static_cast<base*>(mem)); } }; int main() { base* test1 = new base; base* test2 = new base("hello?"); delete test1; delete test2; return 0; } lars@ibmr52:~/programming/c$ g++ -Wall -g blah.cpp -o blah && ./blah base::operator new base::base() base::operator new base::base(char const*): hello? ~base() base::operator delete ~base() base::operator delete Lenke til kommentar
Giddion Skrevet 6. oktober 2006 Forfatter Del Skrevet 6. oktober 2006 (endret) kredit for hurtig svar lnostdal Jeg fikk et annet tips om denne siden Overloading operator new hvis jeg definerer macroet slik funker alt som smurt. EDIT: Det er vel strengt tatt ikke en macro lengere. #define new new(__FILE__,__LINE__) eksempel program. #include <stdio.h> #include <new> class base { public: base() { printf("Constructor called\n"); } ~base(void) { printf("Destructor called\n"); } void *operator new( unsigned int num_bytes,char* file,unsigned int line) { printf("Minne allocket fra %s i i linje %u\n",file,line); return ::new char[num_bytes]; //global new } }; #define new new(__FILE__,__LINE__) void main() { base* test = new base; delete test; } takker for all hjelp Endret 6. oktober 2006 av Giddion Lenke til kommentar
lnostdal Skrevet 6. oktober 2006 Del Skrevet 6. oktober 2006 (endret) ah, begynner å glømme det greiene her#1 - ante ikke at new aksepterte syntax som: // output fra $ cpp blah.cpp base* test1 = new("blah.cpp",45) base; base* test2 = new("blah.cpp",46) base("hello?"); #1: jeg har i grunn ikke gjort noe betydelig koding i C++ siden 2003-4, og hakking av `new' ble ikke gjort så alt for ofte da heller (kan ikke si jeg savner noe av dette; hverken intuitivt, konsist eller pent IMHO - men ok) :} Endret 6. oktober 2006 av lnostdal Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå