Mit static_assertkann die Verwendung des deleteSchlü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 mainFunktion tut .
Zum Beispiel mainschreibt jeder moderne C ++ - Entwickler, der den konservativen Garbage Collector Boehm-Demers-Weiser verwenden möchte, zu Beginn der Funktion:
GC_init();
Und in jeder classund structÜberlastung auf operator newdiese Weise:
void* operator new(size_t size)
{
return GC_malloc(size);
}
Und jetzt, da das operator deletenicht 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 deleteSchlüsselwort verbieten .
Ein Weg ist das Überladen auf folgende delete operatorWeise:
void operator delete(void* ptr)
{
assert(0);
}
Dies wird jedoch nicht empfohlen, da der moderne C ++ - Entwickler weiß, dass er fälschlicherweise die delete operatorOn- 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_assertam Anfang dieser Antwort gezeigten.
Natürlich kann das auch damit gemacht werden BOOST_STATIC_ASSERT, aber ich denke das static_assertist besser und sollte immer mehr bevorzugt werden.