2009-09-08 10 views
5

Próbuję napisać profiler pamięci i jak dotąd udało mi się przekonać moje niestandardowe funkcje do pracy nad malloc, free, new i delete. Próbowałem użyć __FILE__ i __LINE__, aby zarejestrować autora wewnątrz przeciążonej nowej metody, ale (zgodnie z oczekiwaniami) to po prostu podaje szczegóły miejsca, w którym jest przeciążona funkcja. Czy istnieje sposób uzyskania szczegółowych informacji o inicjatorze na przeciążonych funkcjach bez wprowadzania żadnych zmian w istniejącym kodzie testowanego komponentu (np. #define for malloc)?Zastępowanie "nowego" i zapisywanie danych o dzwoniącym

Funkcja używam to:

void* operator new (size_t size) 
{ 
    if(b_MemProfStarted) 
    { 
     b_MemProfStarted = false; 
     o_MemLogFile << "NEW: " << "| Caller: "<< __FILE__ << ":" 
       << __LINE__ << endl; 
     b_MemProfStarted = true; 
    } 

    void *p=malloc(size); 
    if (p==0) // did malloc succeed? 
    throw std::bad_alloc(); // ANSI/ISO compliant behavior 

    return p; 
} 

BOOL b_MemProfStarted służy do uniknięcia rekurencyjnych wywołań na ofstream i map.insert.

Odpowiedz

3

Możesz napisać

new(foo, bar) MyClass; 

W tym przypadku następująca funkcja nazywa

void*operator new(std::size_t, Foo, Bar){ 
    ... 
} 

Teraz można nazwać

new(__LINE__, __FILE__) MyClass; 

i wykorzystać dane z

void*operator new(std::size_t, unsigned line, const char*file){ 
    ... 
} 

Dodanie makro

#define new new(__LINE__, __FILE__) 

do kodu monitorowanego złapie najwięcej wywołania bez konieczności zmiany kodu źródłowego.

Nie jest to idealne rozwiązanie, ponieważ można na przykład wywołać bezpośrednio operatora. W takim przypadku preprocesor zmieni Twój kod w śmieci. Nie znam jednak lepszej drogi.

+0

Jako 'new' jest słowem kluczowym, próbuje ponownie zdefiniować to z makrem jest niezdefiniowanym zachowaniem (wyjątkiem są rozszerzenia specyficzne dla kompilatora). Wolę warunkowe zdefiniować makro DEBUG_NEW_PLACEMENT dla "normalnych" 'nowych' i pozostawić jawne 'operator new' i specjalne miejsce docelowe' nowe '. To wciąż nie jest ładne rozwiązanie. –

+0

void * operator new (std :: size_t, unsigned line, const char * file) zakończyłoby się niepowodzeniem, ponieważ "new" po prostu zajmuje size_t. Nie można użyć "#define new new (__ LINE__, __FILE__)" i operator zastępują razem, ponieważ spróbuje zastąpić "nowy" w definicji funkcji przesłonięcia. void * operator new (std :: size_t) -> void * operator new (__ LINE__, __FILE __)/* rekursywny? */(Std :: size_t) – Gayan

+0

@Charles Bailey - Czy mógłbyś rozwinąć? Nie jestem zaznajomiony z DEBUG_NEW_PLACEMENT Próbowałem "#define new (size) My_New (size, __FILE__, __LINE__)", ale nie wydaje się być wywoływany podczas robienia "nowego" – Gayan

Powiązane problemy