No código a seguir, um SomeClass
objeto tem escopo dentro de um bloco, mas uma referência a ele é armazenada em p
um bloco externo. E mais tarde, usando p
, SomeMethod()
of SomeClass
é chamado.
SomeClass TestMethod(SomeClass c) {
SomeClass * p;
{
SomeClass t;
p = &t;
}
p->SomeMethod();
return *p;
}
Haverá p->SomeMethod()
falha devido a uma desreferência de ponteiro nulo?
Tentei usar int
in no lugar de SomeClass
e não obtive uma desreferência de ponteiro nulo. Mas quero entender o comportamento de acordo com o padrão C++.
Não, isso não levará necessariamente a uma desreferência de ponteiro nulo.
p
foi atribuído algum valor não nulo dentro do bloco. Só porque a coisa para a qual ele aponta terminou seu tempo de vida não significa que o valor (valor do ponteiro) armazenado emp
se tornaránullptr
magicamente.Entretanto , esse ainda é um comportamento indefinido se
SomeMethod
for um método não estático, porque (assumindoSomeClass
que é um tipo de classe - fortemente implícito) o tempo de vida det
termina no final do bloco.O comportamento é indefinido.
Quando o tempo
p->SomeMethod()
é chamado, o objeto quep
aponta para já terminou sua vida útil ep
ficou pendurado .p
não é definido comonullptr
automático, e a desreferenciaçãop
por qualquer motivo acessará um objeto inválido.