static_assert
Mogą być wykorzystane do zabrania używania delete
słów kluczowych w ten sposób:
#define delete static_assert(0, "The keyword \"delete\" is forbidden.");
Każdy współczesny programista C ++ może chcieć to zrobić, jeśli chce użyć konserwatywnego modułu odśmiecania pamięci, używając tylko klas es i struktur, które przeciążają operator new, aby wywołać funkcję, która przydziela pamięć na konserwatywnym stercie konserwatywnego modułu odśmiecania pamięci, który można zainicjować i utworzyć instancję, wywołując jakąś funkcję, która robi to na początku main
funkcji.
Na przykład każdy współczesny programista C ++, który chce użyć konserwatywnego garbage collectora Boehm-Demersa-Weisera, na początku main
funkcji napisze:
GC_init();
I w każdym class
i struct
przeciążaj w operator new
ten sposób:
void* operator new(size_t size)
{
return GC_malloc(size);
}
A teraz, gdy operator delete
nie jest już potrzebny, ponieważ konserwatywny moduł odśmiecania Boehm-Demers-Weiser jest odpowiedzialny zarówno za zwalnianie, jak i zwalnianie każdego bloku pamięci, gdy nie jest już potrzebny, programista chce zabronićdelete
słowa kluczowego.
Jednym ze sposobów jest przeciążenie w delete operator
ten sposób:
void operator delete(void* ptr)
{
assert(0);
}
Nie jest to jednak zalecane, ponieważ współczesny programista C ++ będzie wiedział, że omyłkowo wywołał plik delete operator
czas wykonywania, ale lepiej to wiedzieć wkrótce w czasie kompilacji.
Więc moim zdaniem najlepszym rozwiązaniem tego scenariusza jest użycie static_assert
co pokazano na początku tej odpowiedzi.
Oczywiście można to również zrobić BOOST_STATIC_ASSERT
, ale myślę, że static_assert
jest to lepsze i zawsze powinno być preferowane.