Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;“调试断言”;VS2008上的运行时错误? 我在VS2008上编写了一个C++ MFC程序,当我第一次运行程序有时时,我得到了这个“调试断言错误”。当我尝试调试它时,它会将我带到这个winhand.cpp文件,它不是我编写的程序的一部分,因此我不确定如何调试它_C++_Visual Studio 2008_Mfc_Debugging - Fatal编程技术网

&引用;“调试断言”;VS2008上的运行时错误? 我在VS2008上编写了一个C++ MFC程序,当我第一次运行程序有时时,我得到了这个“调试断言错误”。当我尝试调试它时,它会将我带到这个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);

它将错误带到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);
  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();