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?

Author: void.pointer, 2011-11-18

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 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)
{
  //...
}
 67
Author: Kerrek SB,
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
}
 33
Author: Extrunder,
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