1.1
char *pch = NULL;
pch = new char[100];if ( NULL != pch ) //这里不适合用ASSERT,因为Release版本会忽略内存是否
{                  //分配成功的检查
...
}1.2
CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem(IDC_YOURLISTCONTROL);
ASSERT(pListCtrl != NULL); //MSDN中是这样的 POSITION pos = pList->GetFirstSelectedItemPosition();
if (pos == NULL)
   TRACE0("No items were selected!\n");
else
{
   while (pos)
   {
      int nItem = pList->GetNextSelectedItem(pos);
      TRACE1("Item %d was selected!\n", nItem);
      // you could do your own processing on nItem here
   }
}问题:
1.这里用ASSERT,那Release版本将不会对pListCtrl是否为NULL进行检查,这是否有影响Release版本的质量?为什么?
2.如果用if ( pListCtrl != NULL ) { ... },功能上当然可以,但从代码质量上,若ASSERT()不影响Release版本的质量,则用ASSERT更合适,这样可以减少Release中的执行代码.这样对吗?
3.除函数入口处适合用ASSERT外,还有什么地方适合(即不影响Release版本的质量)用ASSERT呢?

解决方案 »

  1.   

    ASSERT是专门为DEBUG版本使用的。Release版本可以用VERITY替代。
    还有一个问题。ASSERT称为断言,表示它判断的语句原则上必须成立,否则程序可能无法执行的情况才需要使用。而对于一般影响不是那么大的问题,没有必要用ASSERT语句。可以用TRY,CATCH来处理。
      

  2.   

    ASSERT只是用于debug状态,不要把它用于功能性的代码中
    通常用于内部函数之间传递参数时的约定检查,外部接口函数则不适合
      

  3.   

    在debug下ASSERT是执行AfxAssertFailedLine
    release下是 
    # define ASSERT(f)((void)0)所以在release下多用VERIFY
    # define VERIFY(f)((void)(f))
      

  4.   

    利用ASSERT来设定断言。ASSERT宏的参数是一个逻辑表达式,在程序运行过程中,若该逻辑表达式为真,则不会发生任何动作,若此表达式为假,系统将弹出一个对话框警告你,并停止程序的执行。同时要求你作出选择:Abort,Ignore,Retry。若你选择Abort,系统将停止程序的执行;若你选择Ignore 系统将忽略该错误,并继续执行程序;若你选择Retry ,系统将重新计算该表达式,并激活调试器。同TRACE宏一样,ASSERT宏只DEBUG版本中起作用,在RELEASE版本中ASSERT宏将被忽略
      

  5.   

    看看//http://www.vccode.com/file_show.php?id=2519讲的非常好希望对你有所帮助