AssertValid和Dump 这两个函数的作用[通俗易懂]

AssertValid和Dump 这两个函数的作用[通俗易懂]
AssertValid函数是用来判断表达式的合法性或正确性,如果不正确或不合法则终止程序并返回相应的提示信息 
 如AssertValid(t==0);//用来判断t是否等于0,如果t!=0则终止程序 
 Dump函数一般用来显示debug信息的,其函数中的内容一般在debug时,在debug窗口中才能看到。
CObject::AssertValid 成员函数提供对对象内部状态的运行时检查。尽管从 CObject 派生类时不需要重写 Asse

大家好,又见面了,我是你们的朋友全栈君。

AssertValid函数是用来判断表达式的合法性或正确性,如果不正确或不合法则终止程序并返回相应的提示信息  
  如AssertValid(t==0);//用来判断t是否等于0,如果t!=0则终止程序  
  Dump函数一般用来显示debug信息的,其函数中的内容一般在debug时,在debug窗口中才能看到。

CObject::AssertValid   成员函数提供对对象内部状态的运行时检查。尽管从   CObject   派生类时不需要重写   AssertValid,但可以通过重写使您的类更安全可靠。AssertValid   应在对象的所有成员变量上执行断言,以验证它们包含有效值。例如,它应检查指针成员变量不为   NULL。  
  下面的示例显示如何声明   AssertValid   函数:  
  class   CPerson   :   public   CObject  
  {  
  protected:  
        CString   m_strName;  
        float       m_salary;  
  public:  
  #ifdef   _DEBUG  
        virtual   void   AssertValid()   const;       //   Override  
  #endif  
        //   …  
  };  
  当重写   AssertValid   时,在执行您自己的检查之前请调用   AssertValid   的基类版本。然后使用   ASSERT   宏检查您的派生类特有的成员,如下所示:     
  #ifdef   _DEBUG  
  void   CPerson::AssertValid()   const  
  {  
        //   call   inherited   AssertValid   first  
        CObject::AssertValid();  
   
        //   check   CPerson   members…  
        ASSERT(   !m_strName.IsEmpty());   //   Must   have   a   name  
        ASSERT(   m_salary   >   0   );   //   Must   have   an   income  
  }  
  #endif  
  如果任何成员变量存储对象,则可以使用   ASSERT_VALID   宏测试它们的内部有效性(如果它们的类重写了   AssertValid)。  
  例如,考虑   CMyData   类,该类在其成员变量之一中存储了一个   CObList。CObList   变量   m_DataList   存储了一个   CPerson   对象的集合。CMyData   的简化声明如下所示:  
   
  class   CMyData   :   public   CObject  
  {  
        //   Constructor   and   other   members   …  
        protected:  
              CObList*   m_pDataList;  
        //   Other   declarations   …  
        public:  
  #ifdef   _DEBUG  
              virtual   void   AssertValid(   )   const;   //   Override  
  #endif  
        //   Etc.   …  
  };  
  CMyData   中重写的   AssertValid   如下所示:  
   
  #ifdef   _DEBUG  
  void   CMyData::AssertValid(   )   const  
  {  
        //   Call   inherited   AssertValid  
        CObject::AssertValid(   );  
        //   Check   validity   of   CMyData   members  
        ASSERT_VALID(   m_pDataList   );  
        //   …  
  }  
  #endif  
  CMyData   使用   AssertValid   机制测试其数据成员中存储的对象的有效性。CMyData   中重写的   AssertValid   为它自己的   m_pDataList   成员变量调用   ASSERT_VALID   宏。     
  因为   CObList   类也重写   AssertValid,所以有效性测试不在该级别停止。该重写对列表的内部状态执行附加有效性测试。因此,对   CMyData   对象的有效性测试将导致对存储的   CObList   列表对象内部状态的附加有效性测试。     
  再多进行一些操作,还可以添加对存储在列表中的   CPerson   对象的有效性测试。可以从   CObList   派生   CPersonList   类,并重写   AssertValid。在重写中可调用   CObject::AssertValid,然后循环访问列表,在列表中存储的每个   CPerson   对象上调用   AssertValid。本主题开始所示的   CPerson   类已重写了   AssertValid。     
  当为调试生成时,这是一种功能极强的机制。当接着为发布生成时,该机制自动关闭。     
  AssertValid   的限制  
  给定类的   AssertValid   函数的用户应注意该函数的限制。触发的断言指示对象一定有误,并且执行将暂停。但是,缺少断言只指示未找到任何问题,并不保证对象是好的。  

   当从   CObject   派生类时,在使用   DumpAllObjectsSince   将对象转储到“输出”窗口时,可以重写   Dump   成员函数以提供附加信息。  
  Dump   函数将对象的成员变量的文本化表示形式写入转储上下文   (CDumpContext)。转储上下文类似于   I/O   流。可以使用插入运算符   (<<)   向   CDumpContext   发送数据。     
  重写   Dump   函数时,应先调用   Dump   的基类版本以转储基类对象的内容。然后为派生类的每个成员变量输出文本化说明和值。  
   
  Dump   函数的声明如下所示:  
   
  class   CPerson   :   public   CObject  
  {  
  public:  
  #ifdef   _DEBUG  
        virtual   void   Dump(   CDumpContext&   dc   )   const;  
  #endif  
   
        CString   m_firstName;  
        CString   m_lastName;  
        //   And   so   on…  
  };  
  由于对象转储只在调试程序时有意义,所以   Dump   函数的声明用   #ifdef   _DEBUG   /   #endif   块括起来。     
  在下面的示例中,Dump   函数先为其基类调用   Dump   函数。然后,它将每个成员变量的简短说明与该成员的值一起写入诊断流。  
   
  #ifdef   _DEBUG  
  void   CPerson::Dump(   CDumpContext&   dc   )   const  
  {  
        //   Call   the   base   class   function   first.  
        CObject::Dump(   dc   );  
   
        //   Now   do   the   stuff   for   our   specific   class.  
        dc   <<   “last   name:   ”   <<   m_lastName   <<   “/n”  
              <<   “first   name:   ”   <<   m_firstName   <<   “/n”;  
  }  
  #endif  
  必须提供   CDumpContext   参数以指定转储输出的目的地。MFC   的“Debug”版本提供名为   afxDump   的预定义   CDumpContext   对象,它将输出发送到调试器。  
   
  CPerson*   pMyPerson   =   new   CPerson;  
  //   Set   some   fields   of   the   CPerson   object.  
  //…  
  //   Now   dump   the   contents.  
  #ifdef   _DEBUG  
  pMyPerson->Dump(   afxDump   );  
  #endif  
  在   MFC   程序中,可以使用   DumpAllObjectsSince   转储有关堆中尚未释放的所有对象的说明。DumpAllObjectsSince   转储自上个   CMemoryState::Checkpoint   以来分配的所有对象。如果未发生   Checkpoint   调用,则   DumpAllObjectsSince   将转储当前在内存中的所有对象和非对象。  
   
  注意       必须先启用诊断跟踪,然后才能使用   MFC   对象转储。  
  注意       程序退出时   MFC   将自动转储所有泄漏的对象,因此不必创建代码在该点转储对象。  
  以下代码通过比较两个内存状态来测试内存泄漏,并在检测到泄漏时转储所有对象:  
   
  if(   diffMemState.Difference(   oldMemState,   newMemState   )   )  
  {  
        TRACE(   “Memory   leaked!/n”   );  
        diffMemState.DumpAllObjectsSince();  
  }  
  转储的内容如下所示:  
   
  Dumping   objects   ->  
   
  {5}   strcore.cpp(80)   :   non-object   block   at   $00A7521A,   9   bytes   long  
  {4}   strcore.cpp(80)   :   non-object   block   at   $00A751F8,   5   bytes   long  
  {3}   strcore.cpp(80)   :   non-object   block   at   $00A751D6,   6   bytes   long  
  {2}   a   CPerson   at   $51A4  
   
  Last   Name:   Smith  
  First   Name:   Alan  
  Phone   #:   581-0215  
   
  {1}   strcore.cpp(80)   :   non-object   block   at   $00A7516E,   25   bytes   long  
转自:http://control.blog.sina.com.cn/admin/article/article_add.php

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159071.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • pycharm创建python虚拟环境_pycharm 虚拟环境

    pycharm创建python虚拟环境_pycharm 虚拟环境点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤身体是革命的本钱,身体健康最重要!/1前言/  上次小编给大家介绍了P…

  • 支付宝开发 ——第三方支付[通俗易懂]

    支付宝开发 ——第三方支付[通俗易懂]支付宝开发第三方支付在线支付在线支付是指卖方与买方通过因特网上的电子商务网站进行交易时,银行为其提供网上资金结算服务的一种业务。它为企业和个人提供了一个安全、快捷、方便的电子商务应用环境和网上资金结算工具。在线支付不仅帮助企业实现了销售款项的快速归集,缩短收款周期,同时也为个人网上银行客户提供了网上消费支付结算方式,使客户真正做到足不出户,网上购物。 聚合支付聚合支付…

  • oracle怎么使用触发器,oracle触发器使用[通俗易懂]

    oracle怎么使用触发器,oracle触发器使用[通俗易懂]2)触发器分类:1.DML触发器:创建在表上,由DML事件引发2.insteadof触发器:创建在视图上并且只能在行级上触发,用于替代insert,delete等操作(由于oracle中不能直接对有两个以上的表建立的视图进行DML操作,所以给出替代触发器,它是专门为进行视图操作的一种处理方法)3.DDL触发器:触发事件时数据库对象的创建和修改4.数据库事件触发器:定义在数据库或者模式上,由…

  • linux系统如何配置ssh链接方式【以kali linux系统为例】【有一个坑,网上很多配置找不到PermitRootLogin选项】

    linux系统如何配置ssh链接方式【以kali linux系统为例】【有一个坑,网上很多配置找不到PermitRootLogin选项】参考:https://blog.csdn.net/nzjdsds/article/details/82262228【非常重要】在/etc/ssh/ssh_config中没有PermitRootLoginyes选项的话,就要在sshd_config文件中寻找!必须配置的选项:第一:root权限:第二:密码权限:第三:端口22:配置完毕之后重启sys…

  • Linux设备树是什么?

    Linux设备树是什么?随着Linux的不断发展,基本上现在所有的驱动程序都是基于设备树的,而设备树到底是什么?有什么作用,Linux内核怎么通过设备树知道外设适配的。文本介绍了设备树、以及分享了一些设备树的基本语法、一些基本属性等,最后简单分析了设备匹配的基本流程

  • Asterisk 操作mysql数据库的应用

    Asterisk 操作mysql数据库的应用

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号