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.
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. –
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
@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