Mit static_assert
kann die Verwendung des delete
Schlüsselworts folgendermaßen verboten werden:
#define delete static_assert(0, "The keyword \"delete\" is forbidden.");
Jeder moderne C ++ - Entwickler möchte dies möglicherweise tun, wenn er oder sie einen konservativen Garbage Collector verwenden möchte, indem er nur Klassen und Strukturen verwendet , die den Operator new überladen , um eine Funktion aufzurufen, die Speicher auf dem konservativen Heap des konservativen Garbage Collector zuweist kann initialisiert und instanziiert werden, indem eine Funktion aufgerufen wird, die dies am Anfang der main
Funktion tut .
Zum Beispiel main
schreibt jeder moderne C ++ - Entwickler, der den konservativen Garbage Collector Boehm-Demers-Weiser verwenden möchte, zu Beginn der Funktion:
GC_init();
Und in jeder class
und struct
Überlastung auf operator new
diese Weise:
void* operator new(size_t size)
{
return GC_malloc(size);
}
Und jetzt, da das operator delete
nicht mehr benötigt wird, weil der konservative Garbage Collector von Boehm-Demers-Weiser dafür verantwortlich ist, jeden Speicherblock freizugeben und freizugeben, wenn er nicht mehr benötigt wird, möchte der Entwickler das delete
Schlüsselwort verbieten .
Ein Weg ist das Überladen auf folgende delete operator
Weise:
void operator delete(void* ptr)
{
assert(0);
}
Dies wird jedoch nicht empfohlen, da der moderne C ++ - Entwickler weiß, dass er fälschlicherweise die delete operator
On- Runtime aufgerufen hat. Dies ist jedoch besser, wenn Sie dies bald bei der Kompilierung wissen.
Die beste Lösung für dieses Szenario ist meiner Meinung nach die Verwendung der static_assert
am Anfang dieser Antwort gezeigten.
Natürlich kann das auch damit gemacht werden BOOST_STATIC_ASSERT
, aber ich denke das static_assert
ist besser und sollte immer mehr bevorzugt werden.