Gå til innhold

operator new med macro[løst]


Anbefalte innlegg

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 av Giddion
Lenke til kommentar
Videoannonse
Annonse
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

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 av Giddion
Lenke til kommentar

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 av lnostdal
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...