Я запутался о некоторых деталях дикого указателя и оборванных указатель, вот мой код:Почему висячий указатель может перейти к объекту?
#include <iostream>
using std::cout;
using std::endl;
class A
{
public:
void Func() { cout << "Func of class A, the address is:" << this <<endl; }
};
void Test(void)
{
A *p;
//get an error in VS2013 because of uninitialized pointer.
//But it's ok in g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
p->Func(); // wild pointer, ((1))
{
A a;
p = &a;
p->Func();
}
p->Func(); //dangling pointer ((2))
}
int main()
{
Test();
return 0;
}
Результаты подобны следующим образом:
Окна:
Func of class A, the address is:003CFD47 Func of class A, the address is:003CFD47
Ubuntu:
Func of class A, the address is:0xb74ef39d Func of class A, the address is:0xbff85a3b Func of class A, the address is:0xbff85a3b
Мои вопросы:
(1) g ++-компилятор let the wil e pointer pass at ((1)), даже при запуске кода кажется, что это «некоторый объект». почему это может произойти? Это ошибка компилятора?
(2) Насколько я знаю, после блочных предложений p будет свисающим указателем на ((2)). Но почему можно перейти к Func()? Поскольку пространство, занимаемое объектом a, не перезаписывается другим приложением?
Это неопределенное поведение. –
который есть? висячий указатель? @ πάνταῥεῖ – kkwang
@wjk Доступ к нему/его разыменование. –