Jak pokazano here, można użyć dynamic_cast
wykryć usuniętą wskaźnik:Jak usunięcie wskaźnika wykryć stosując dynamiczną obsady
#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;
}
wyjście:
dynamic_cast<B*>(pB) worked
dynamic_cast<B*>((A*)pB) worked
dynamic_cast<B*>(pB) worked
dynamic_cast<B*>((A*)pB) failed
Wyjaśnia, że Wykryto usunięcie tabeli vtable.
Ale zastanawiam się, jak to możliwe, ponieważ nie nadpisujemy uwolnionej pamięci?
Czy to rozwiązanie jest w pełni przenośne?
Dzięki
Zgaduję, że 'dynamic_cast' używa [RTTI] (http://en.wikipedia.org/wiki/Run-time_type_information) do sprawdzenia poprawności typu, który jest rzutowany na. –
Podejrzewam, że jest to zachowanie zależne od platformy. –
Program Visual Studio 2013 zgłasza wyjątek '__non_rtti_object' z tym kodem. –