У меня есть старое 32-разрядное приложение MFC на C ++, написанное для Visual Studio 2010. Оно работало без проблем. Теперь мне пришлось обновиться до Visual Studio 2017, и он довольно часто вылетает, когда я нажимаю в окне древовидной структуры. У меня есть файл DMP, и когда я открываю его, я вижу, что он падает здесь:
BOOL CObject::IsKindOf(const CRuntimeClass* pClass) const
{
ENSURE(this != NULL);
// it better be in valid memory, at least for CObject size
ASSERT(AfxIsValidAddress(this, sizeof(CObject)));
// simple SI case
CRuntimeClass* pClassThis = GetRuntimeClass(); //---->HERE Crash
ENSURE(pClassThis);
return pClassThis->IsDerivedFrom(pClass);
}
Когда я возвращаюсь к списку вызовов, я заканчиваю здесь:
//m_pTheModel is initialized with NULL
if (bValidValue == true)
m_pTheModel = GetModel((WORD)lHint);
if (m_pTheModel == NULL || !AfxIsValidAddress(m_pTheModel, sizeof(m_pTheModel)))
{
lock.Unlock();
return;
}
try
{
if ((m_pTheModel->IsKindOf(RUNTIME_CLASS(CMyClassModel))))
...
}
catch (...)
{
}
m_pTheModel не NULL, но когда я смотрю на значения в отладчике, для некоторых значений память не читается.
В чем может быть проблема? Со старой версией visual studio у меня не было этой проблемы. Я только перекомпилировал этот проект, и мне пришлось установить целевую операционную систему на Windows XP.
Сообщение об ошибке: «Поток пытался прочитать или записать виртуальный адрес, для которого у него нет соответствующего доступа».
Я также не понимаю, почему я не могу уловить это нарушение доступа с помощью своего try-catch вокруг этого.
Обновление:
Я нашел причину. Это был strcpy, который переписывает мой указатель.