O que pode fazer com que o ponteiro de VTable seja 0xddddddddd na compilação de depuração do Win3
Estou depurando um defeito e o reduzi ao ponteiro vtable para um objeto sendo0xdddddddd
. Esta resposta indica que as compilações de depuração do Win32 geralmente definem a memória morta ou a memória que foi excluída para esse valor especia
Observe que o ponteiro parece válido, é apenas ovtable pointer isso é0xdddddddd
.
Aqui está um trecho de código:
std::list<IMyObject*>::const_iterator it;
for (it = myObjects.begin(); it != myObjects.end(); ++it)
{
IMyObject* pMyObject = *it;
if (pMyObject == 0)
continue;
pMyObject->someMethod(); // Access violation
}
Se eu quebrar a linha da violação de acesso e assistirpMyObject
, Eu posso ver issopMyObject
em si tem um endereço válido 0x08ede388
) mas o__vfptr
member é inválido 0xdddddddd
).
Algumas notas
É um aplicativo de thread único, portanto, provavelmente não é uma condição de corrida ou problema de mute Não parece haver problemas óbvios, como excluir o objeto na pilha de chamadas antes de acessá-lEste problema parece ser reproduzível apenas no servidor Windows 2008, mas não no Windows 7.Alguma sugestão sobre como depurar isso ainda mais?