Jak prawidłowo zastąpić globalne nowe i usuń operatorów
Po pierwsze, było co najmniej 4-5 tematów o podobnym temacie NA SO. Czytam każdą z nich i nie czuję, że naprawdę pomagają mi w tym konkretnym problemie. Jeśli ktoś inny znajdzie duplikat pytania, przepraszam. Zrobiłem swój udział w poszukiwaniach, zanim to opublikowałem, ponieważ wydaje się to bardzo powszechnym pytaniem.
Używam Visual Studio. NET 2003 na Windows 7.
Mam własne przeciążenia new / delete tego punktu do własnych wywołań malloc () i free () do diagnostyki. Moje nowe przeciążenia / delete znajdują się w pliku nagłówkowym, który zawarłem w kilku plikach.
Problem w tym, że baza kodu jest dość spaghetti i nie ma łatwego sposobu, aby upewnić się, że te przeciążenia zostaną wykorzystane przez wszystko. Istnieją dołączone do bibliotek stron trzecich, które są black-box. Używamy również STL wszędzie.
W moich testach odkryłem, że STL nadal miesza połączenia z moim własnym new/delete i standardowym MSVC new/delete.
Nie wydaje się realistyczne, aby uwzględnić moje plik nagłówkowy w tysiącach innych plików, To zajęłoby zbyt długo. Czy ktoś może podać jakieś wskazówki, jak prawidłowo i skutecznie przeciążać new/delete globalnie, aby wszystko korzystało z mojego niestandardowego Menedżera pamięci?
2 answers
To tak nie działa. Ty zastąpić dwa operatory, i to odbywa się w link Czas. Wszystko, co musisz zrobić, to napisać pojedynczy TU, który definiuje te operatory i połączyć je z miksem. Nikt inny nigdy nie musi o tym wiedzieć:
// optional_ops.cpp
void * operator new(std::size_t n) throw(std::bad_alloc)
{
//...
}
void operator delete(void * p) throw()
{
//...
}
Zasadniczo nie ma potrzeby, aby jakiekolwiek pliki nagłówkowe deklarowały te funkcje (operator new
, operator delete
), ponieważ deklaracje tych dwóch funkcji są już zakodowane na twardo w języku, jeśli chcesz. Jednak nazwy std
, std::bad_alloc
i std::size_t
są Nie, więc prawdopodobnie będziesz chciał dołączyć <new>
lub jakiś inny nagłówek, aby podać te nazwy.
W C++11 i nowszych, możesz alternatywnie użyć decltype(sizeof(0))
, aby uzyskać Rozmiar pierwszego parametru w sposób, który nie wymaga żadnej biblioteki. C++11 ma również prostszy model WYJĄTKÓW bez dynamicznych specyfikacji wyjątków (które zostały ostatecznie usunięte z języka całkowicie w C++17).
void * operator new(decltype(sizeof(0)) n) noexcept(false)
{
//...
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-02 17:21:51
Dodaj również te linie:
void *operator new[](std::size_t s) throw(std::bad_alloc)
{
// TODO: implement
return NULL;
}
void operator delete[](void *p) throw()
{
// TODO: implement
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-18 18:47:27