У меня есть проект, который последовательно вызывает два утверждения, ПОСЛЕ завершения «main'-function». Это очень проблематично, потому что это не показывает мне часть кода, вызывающую проблему.C++ - Как найти источник повреждения кучи/стека при выходе программы
Я смог немного уменьшить проблему. С пустой основной функцией:
int main(int argc,char* argv[])
{
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
return main(__argc,__argv);
}
все работает нормально. Однако, как только я использовать любой класс или функцию из определенной библиотеки DLL (который является частью проекта), проблема начинается происходящим:
int main(int argc,char* argv[])
{
Color col(255,0,0,255);
col.r += 1;
int r = HeapValidate(GetProcessHeap(),0,nullptr);
std::cout<<r<<std::endl;
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
return main(__argc,__argv);
}
класса «Color» является частью этой библиотеки, но это не причина проблемы. «HeapValidate» возвращает 1, что означает, что куча действительна в соответствии с документацией.
В данной DLL содержится сотни тысяч строк кода, что еще более затрудняет отладку.
На подобный вопрос, я нашел предложение использовать WinDBG, но я не уверен, что делать с результатом:
Это подтверждает, что этот вопрос является своего рода повреждения памяти , но я до сих пор не знаю, откуда оно происходит.
Есть ли способ надежно найти происхождение, или я застрял, используя пробную версию и ошибку?
Моя ОС Windows, 8,1, я использую Visual Studio 2013.
DLL может иметь отдельную кучу: https://msdn.microsoft.com/en-us/library/windows/desktop/ee175820(v=vs.85).aspx Кроме того, посмотрите, не вызывает ли эта DLL что-либо подозрительное в его отрывном коде: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583%28v=vs.85%29.aspx – DCoder