今天的一点调试KillTimer,发现的一点问题。

release版本没有断言错误发生。debug版本的总是有断言错误。

我还记得好像ASSERT对调试版有效,当发行版就无效。发行版要用的话,就需要用assert小写的才行。

幸亏断言就有提示文件名和位置,找到之后,前后调试了一下,找到了大概位置,

在公司的代码里面有

CGpsGUIDlg::~CGpsGUIDlg()
{

    ceRasHangUp();

    KillTimer(1);
    KillTimer(2);
}

我发现在调用KillTimer的时候,实际上窗口句柄已经被销毁。

而在KillTimer函数里面要先断言窗口句柄,如果为空,就错误。

让后我再次调试找到调用销毁窗口函数的地方,在之前放置KillerTimer,

就不再出现断言错误。

 

 

下面是找到的一些资料。

 

      操作系统: Windows
    编程工具: Microsoft Foundation Classes ASSERT()
    问题: 什么是ASSERT()? ASSERT()和assert()的区别是什么?(Lilly)
   
      ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序:
    ......
    ASSERT( n != 0);
    k = 10/ n;
    ......
    ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。
    assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。

你可能感兴趣的:(今天的一点调试KillTimer,发现的一点问题。)