Wie gezeigt here kann man dynamic_cast
verwenden einen gelöschten Zeiger zu erfassen:Wie wird die Löschung eines Zeigers erfasst mittels dynamischer Guss
#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 erläutert, dass Das Löschen der Vtable wird erkannt.
Aber ich frage mich, wie ist das möglich, da wir den freigegebenen Speicher nicht überschreiben?
Und ist diese Lösung vollständig tragbar?
Dank
Ich rate 'dynamic_cast' verwendet [RTTI] (http://en.wikipedia.org/wiki/Run-time_type_information), um den Typ zu bestätigen, der umgewandelt wird. –
Ich vermute, dass es plattformabhängiges Verhalten ist. –
Visual Studio 2013 löst mit diesem Code eine '__non_rtti_object'-Ausnahme aus. –