Wie wird das Löschen eines Zeigers mithilfe der dynamischen Umwandlung erkannt?

Wie gezeigtHierkann man benutzendynamic_cast So erkennen Sie einen gelöschten Zeiger:

#include <iostream>

using namespace std;

class A
{
public:
   A() {}
   virtual ~A() {}
};

class B : public A
{
public:
   B() {}
};

int main()
{
   B* pB =  new B;

   cout << "dynamic_cast<B*>( pB) ";
   cout << ( dynamic_cast<B*>(pB) ? "worked" : "failed") << endl;  

   cout << "dynamic_cast<B*>( (A*)pB) ";
   cout << ( dynamic_cast<B*>( (A*)pB) ? "worked" : "failed") << endl;  

   delete pB; 

   cout << "dynamic_cast<B*>( pB) ";
   cout << ( dynamic_cast<B*>(pB) ? "worked" : "failed") << endl;  

   cout << "dynamic_cast<B*>( (A*)pB) ";
   cout << ( dynamic_cast<B*>( (A*)pB) ? "worked" : "failed") << endl;  

}

die Ausgabe:

dynamic_cast<B*>( pB) worked
dynamic_cast<B*>( (A*)pB) worked
dynamic_cast<B*>( pB) worked
dynamic_cast<B*>( (A*)pB) failed

Es wird erklärt, dass das Löschen der vtable erkannt wird.

Aber ich frage mich, wie das möglich ist, da wir den freigegebenen Speicher nicht überschreiben?

Und ist diese Lösung vollständig portabel?

Vielen Dank

Antworten auf die Frage(1)

Ihre Antwort auf die Frage