Im folgenden Code aufgerufen wird, wenn ptr
gelöscht wird, wird der Destruktor für Base
genannt, aber nicht den destructor für Derived
(wegen destructor von Base
nicht virtuell sind).Zerstörung der Klassenmitglieder, wenn destructor nicht
class Base
{
int b;
};
class Derived : public Base
{
int d;
};
int main(void)
{
Base * ptr = new Derived();
delete ptr;
return 0;
}
Valgrind berichtet, dass das Programm keine Speicherlecks enthält, die ich in dem Sinne wahr Vermutung ist, dass alle newed Daten in diesem speziellen Fall gelöscht. Meine Frage ist - vorausgesetzt, dass der (Standard) Destruktor von Derived
nicht aufgerufen wird, wann und wie ist der Speicher für d
freigegeben oder zurückgefordert?
Ich glaube, der Speicher wird aufgrund 'delete ptr' zurückgefordert, es wird nur kein Destruktor aufgerufen, was ein * potentielles * undefiniertes Verhalten sein könnte. – iammilind
Es ist nicht möglich. Es ist undefiniertes Verhalten. (§5.3.5/3) –
Ihr Valgrind-Aufruf sagt "keine Speicherlecks", mein 'MemoryLogger' sagt" zugewiesene 8 Bytes bei 0x3b2380; Freigabe von 4 Bytes bei 0x3b2380; Fehler: 4 Bytes sind noch belegt! '. UB. Möglicherweise könnte dies auch sagen: "Einen schönen Tag, Sir". – Zeta