2012-10-10 8 views
6

Biblioteka środowiska wykonawczego Microsoft udostępnia wersję debugowania funkcji alokacji. Dla C++ jest to wariant debug wykonawcy nowy z podpisem:Przesłanianie nowych wersji debugowania bez uszkodzenia miejsca docelowego nowa

void *operator new(size_t size, int blockType, const char *filename, int linenumber); 

i makro jest zdefiniowany jak

#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) 

teraz instrumentu wszystkie przydziały, jeden normalnie definiuje

#if defined DEBUG_NEW 
#define new DEBUG_NEW 
#endif 

Jednak ta definicja dzieli każde miejsce, które używa nowego miejsca docelowego, ponieważ dwa zestawy argumentów kończą się błędem składni. Teraz mogę z łatwością poradzić sobie z kilkoma zastosowaniami w naszym kodzie, ale standardowa biblioteka i miejsce doładowania wykorzystują nowe miejsca w każdym miejscu. Zatem zdefiniowanie tego na całym świecie oznacza włączenie wielu elementów przed definicją i spowalnia kompilację.

Czy istnieje sposób na alokację instrumentów w naszym kodzie bez wciągania nagłówków tylko dlatego, że zawierają nowe miejsca docelowe i bez konieczności wstawiania ostatniego zdefiniowanego powyżej we wszystkich plikach lub ręcznego pisania DEBUG_NEW?

Odpowiedz

0

Ta cała sprawa DEBUG_NEW zginął w ogniu! To było tylko ledwie przydatne i nie jest użyteczne w nowoczesnym C++, ponieważ nie widzisz już new w normalnym C++.

Są lepsze opcje, takie jak DUMA, a teraz jest Dr. Memory (który działa podobnie do Valgrind, ale w systemie Windows), nie ma absolutnie żadnego sensu używanie obrzydliwości DEBUG_NEW.

3

Sposób mam rozwiązać ten historycznie jest za pomocą nagłówków skompilowane i robi coś takiego (stdafx.h, Pch.h, PreCompiled.h lub cokolwiek):

//First include all headers using placement new 
#include <boost/tuple/tuple.hpp> 
#include <vector> 

#define new MY_NEW 
#define MY_NEW new(__FILE__, __LINE__) 

a następnie upewnij się żadne pliki nie zawierają bezpośrednio nagłówków doładowania, ale tylko prekompilowany nagłówek.

+0

Prekompilowane nagłówki byłyby naprawdę trudne do utrzymania w naszej sytuacji. Będą naprawdę ogromne i złożone ze względu na różne problemy z przenośnością (baza kodu jest kompilowana na 4 bardzo różne platformy). –

+0

W jaki sposób byłyby trudne do utrzymania? Pch powinien zmieniać się bardzo rzadko. –

+0

Jeśli zawierał elementy doładowania, zmieniałby się dość często. Ale może powinienem spróbować prekompilować właśnie ten nagłówek debugowania pamięci (który dostaje wtrysk z opcją kompilatora '/ Fi'); miejsce docelowe nowe pojawia się w znacznie mniejszej liczbie miejsc. –

-1

define new DEBUG_NEW linia powinna być umieszczona w pliku źródłowym, po wszystkich liniach #include. W ten sposób zostanie zastosowany tylko do twojego własnego kodu, a nie do innych plików h, takich jak Boost. Globalna nowość w DEFUG_NEW redifinition może spowodować awarię kompilacji i należy jej unikać.

+0

Masz rację, z wyjątkiem tego, widzisz, pytanie było jednoznacznie ** BEZ ŻADNEGO ZROBIENIA **. –

+0

Dobry przykład głosowania bez czytania odpowiedzi. –

5
#pragma push_macro("new") 
#undef new 

new(pointer) my_class_t(arg1, arg2); 

#pragma pop_macro("new") 

lub

#pragma push_macro("new") 
#undef new 

#include <...> 
#include <...> 
#include <...> 

#pragma pop_macro("new") 
+0

Byłoby pomocne opisanie, w jaki sposób działają 'push_macro()' i 'pop_macro()'. Na przykład, czy oryginalny 'nowy' zostanie przywrócony po' pop_macro ("new") '. – cpburnz

0

Wiem, że to trochę późno, ale że problem może być rozwiązany za pomocą szablonu magii.

Niedawno kodowałem debuger debugger, który dodaje nowe słowo kluczowe "miejsce docelowe", które dostaje writen infront wszystkich nowych połączeń miejsc docelowych.

Można sprawdzić moje debugger tutaj: https://sourceforge.net/projects/debugnew/

Albo debug_new debuggera z nvwa tutaj: https://sourceforge.net/projects/nvwa/

+0

Czy możesz podać wyjaśnienie, jak i dlaczego to działa? –

Powiązane problemy