&引用;“调试断言”;VS2008上的运行时错误? 我在VS2008上编写了一个C++ MFC程序,当我第一次运行程序有时时,我得到了这个“调试断言错误”。当我尝试调试它时,它会将我带到这个winhand.cpp文件,它不是我编写的程序的一部分,因此我不确定如何调试它
它将错误带到winhand.cpp中的这个位置&引用;“调试断言”;VS2008上的运行时错误? 我在VS2008上编写了一个C++ MFC程序,当我第一次运行程序有时时,我得到了这个“调试断言错误”。当我尝试调试它时,它会将我带到这个winhand.cpp文件,它不是我编写的程序的一部分,因此我不确定如何调试它,c++,visual-studio-2008,mfc,debugging,C++,Visual Studio 2008,Mfc,Debugging,它将错误带到winhand.cpp中的这个位置 CObject* pTemp = LookupTemporary(h); if (pTemp != NULL) { // temporary objects must have correct handle values HANDLE* ph = (HANDLE*)((BYTE*)pTemp + m_nOffset); // after CObject ASSERT(ph[0] == h || ph[0] == NULL);
CObject* pTemp = LookupTemporary(h);
if (pTemp != NULL)
{
// temporary objects must have correct handle values
HANDLE* ph = (HANDLE*)((BYTE*)pTemp + m_nOffset); // after CObject
ASSERT(ph[0] == h || ph[0] == NULL);
if (m_nHandles == 2)
ASSERT(ph[1] == h);
}
那么,为什么会发生这种错误呢?为什么它只是偶尔发生(50%的时候)?我如何调试这个
如果需要,我会提供一些代码
谢谢 注意这些代码(来自Stroustrup书中的记忆): (在精神上,当然可以是其他命令和表达式)。临时对象在其封闭的完整表达式被计算后被销毁,或者至少标准允许它们被销毁。这意味着您想要分配给c1的内容可能在内存中,也可能不在内存中,可以分配给c1。编译器可能会提醒您注意此问题,此问题可能会出现,也可能不会出现,具体取决于您指定的内容和其他情况(我不是编译器编写者),这也解释了为什么您有时会收到此错误消息
因此,站在你的立场上,我会扫描我的代码,寻找类似的表达式,并将它们清理干净。请注意这些代码(来自Stroustrup书中的记忆): (在精神上,当然可以是其他命令和表达式)。临时对象在其封闭的完整表达式被计算后被销毁,或者至少标准允许它们被销毁。这意味着您想要分配给c1的内容可能在内存中,也可能不在内存中,可以分配给c1。编译器可能会提醒您注意此问题,此问题可能会出现,也可能不会出现,具体取决于您指定的内容和其他情况(我不是编译器编写者),这也解释了为什么您有时会收到此错误消息
因此,在您的情况下,我会扫描我的代码,寻找类似的表达式,并将它们清理干净。当调试器中断时,将调用堆栈引导到代码的第一位(如果有-希望有!)。理想情况下,这就像代码中错误调用库函数一样简单,库用断言捕捉错误并向您发出警告。(我认为任何人都无法从库代码中分辨出错误,我们需要查看您的代码。)
否则,您将面临一些棘手的调试:您对正在断言的库(看起来像MFC)做了一些错误,因此请返回并检查所有MFC代码,确保所有内容都正确无误,并且符合文档要求。当调试器中断时,将调用堆栈提升到代码的第一位(如果有——希望有!)。理想情况下,这就像代码中的某个错误调用库函数一样简单,库正在用断言捕获错误并提醒您。(我认为没有人能够从库代码中分辨出错误,我们需要查看您的代码。)
否则,您将面临一些棘手的调试:您对正在断言的库(看起来像MFC)做了一些错误,因此请返回并检查所有MFC代码,确保所有内容都是正确的,并且符合文档要求。这看起来可疑地像我今天早上遇到的错误。这是否发生在OnIdle()中?这看起来像是我今天早上犯的错误。这是在OnIdle()中发生的吗?正在断言的代码是MFC的
CHandleMap
类的一部分。MFC将windows作为CWnd
对象处理,但windows将其作为HWND
句柄处理。句柄映射允许MFC将HWND
转换为指向表示该对象的MFC对象的指针
断言所做的似乎是检查当句柄的查找找到MFC对象时,MFC对象是否也认为它正在包装相同的句柄
如果它们不同,那么你就得到了断言
因此,似乎有什么东西损坏了句柄映射或该句柄的MFC对象,或者您做了一些不正确的事情,导致这两个数据结构不同步
为了调试问题,您可能要做的一些事情是确定:
- 在查找中找到了哪个MFC对象(即
指向的对象)pObject
- MFC对象认为它在包装什么(这是句柄
和/或ph[0]
-我不确定为什么会有两个)ph[1]
- 手柄的用途(即
)h
pObject
指向看起来像MFC对象或垃圾的对象?这些对象之间是否有关联
这些问题的答案可能会指出您下一步需要做什么(可能会在项目上设置一个调试写入断点,看起来它已经被破坏) 断言所做的似乎是检查当句柄的查找找到MFC对象时,MFC对象是否也认为它正在包装相同的句柄 如果它们不同,那么你就得到了断言 因此,似乎有什么东西损坏了句柄映射或该句柄的MFC对象,或者您做了一些不正确的事情,导致这两个数据结构不同步 为了调试问题,您可能要做的一些事情是确定:
- 在查找中找到了哪个MFC对象(即
指向的对象)pObject
- MFC对象认为它正在包装的内容(这不是
c1 = (t2+t3).c_str();
CDC* dc = GetDC(); CSize spaceSize = dc->GetTextExtent(" "); dc->DeleteDC();
CDC* dc = GetDC(); CSize spaceSize = dc->GetTextExtent(" "); ReleaseDC(dc);
CDC * pDC = GetWindowDC(); ... ReleaseDC(pDC);
CDC * pDC = new CDC(); pDC->CreateDC(); .... pDC->DeleteDC();