static_assert
можно использовать для запрета использования ключевого слова delete
следующим образом:
#define delete static_assert(0, "The keyword \"delete\" is forbidden.");
Каждый современный разработчик C++ может захотеть сделать это, если он или она хочет использовать консервативный сборщик мусора, используя только классы и структуры, которые перегружают оператор new для вызова функции, которая выделяет память в консервативной куче консервативного сборщика мусора, который можно инициализировать и создать экземпляр, вызвав некоторую функцию, которая делает это в начале функции main
.
Например, каждый современный разработчик C++, который хочет использовать консервативный сборщик мусора Boehm-Demers-Weiser, напишет в начале функции main
:
GC_init();
И в каждом class
и struct
перегружайте operator new
таким образом:
void* operator new(size_t size)
{
return GC_malloc(size);
}
И теперь, когда operator delete
больше не нужен, поскольку консервативный сборщик мусора Boehm-Demers-Weiser отвечает как за освобождение, так и за освобождение каждого блока памяти, когда он больше не нужен, разработчик хочет запретить ключевое слово delete
.
Один из способов — перегрузить delete operator
следующим образом:
void operator delete(void* ptr)
{
assert(0);
}
Но это не рекомендуется, потому что современный разработчик C++ будет знать, что он/она по ошибке вызвал delete operator
во время выполнения, но лучше узнать об этом как можно скорее во время компиляции.
Поэтому, на мой взгляд, лучшим решением для этого сценария является использование static_assert
, как показано в начале этого ответа.
Конечно, это можно сделать и с BOOST_STATIC_ASSERT
, но я думаю, что static_assert
лучше и ему всегда следует отдавать предпочтение.
person
user11962338
schedule
23.08.2019