Während bei Legacy-Code suchen fand ich etwas ähnlich den folgenden CodeOverloading Betreiber neue und Ausnahme Korrektheit
void* legacy_type::operator new(size_t size) {
return pool_alloc(size);
}
pool_alloc bekannt ist nie 0 im Fall des Scheiterns zu werfen und zurück.
Es gibt keine Überlastung für die Variante std :: nothrow von new hier.
Ich frage mich, ob dieser Code semantisch korrekt ist und wohldefiniertes Verhalten hat.
Sollte new (std::nothrow) legacy_type;
benutzerdefinierte pool_alloc verwenden? In meinem Compiler kompiliert es überhaupt nicht. Ist es wohldefiniertes Verhalten?
Sollte der Konstruktor wegen this==0
laufen und abstürzen, wenn er überlastet wird? operator new
gibt Null zurück? In meinem Compiler läuft es (und stürzt bei der Member-Initialisierung ab). Ist es ein normal definiertes Verhalten?
Der Konstruktor sollte nicht aufgerufen werden, wenn der 'operator new' einen Nullzeiger zurückgibt, und dann der gesamte' new' Ausdruck einen Nullzeiger selbst zurückgibt. – Simple
Es ist ein akzeptables Verhalten in C++, aber es stürzt ab, wenn die Klasse eine virtuelle Tabelle oder einen Konstruktor hat, der 'this == 0' nicht testet, bevor er auf variable Mitglieder zugreift. Es ist offensichtlich nicht üblich und sollte wahrscheinlich vermieden werden. Sie können versuchen, nur diese Definition zu löschen und zu sehen, was passiert ... –