VC的调试中,AssertValid和Dump函数的应用(转载)

VC的调试中,AssertValid和Dump函数的应用(转载)VC的调试中,AssertValid和Dump函数的应用??楼主mei2004mei2004(aaa)2005-12-0209:47:24在VC/MFC/基础类提问rt.  在debug调试中,AssertValid和Dump 这两个函数怎么进行工作的?    或者说怎么合理利用这两个函数?    …问题点数:100、回复次数:3Top 1楼

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

VC的调试中,AssertValid和Dump函数的应用??

楼主mei2004mei2004(aaa)
2005-12-02 09:47:24 在 VC/MFC / 基础类 提问

rt.  
  在debug调试中,AssertValid和Dump   这两个函数怎么进行工作的?  
   
  或者说怎么合理利用这两个函数?  
   
  … 问题点数:100、回复次数:3Top

 

1 楼wangk(倒之)回复于 2005-12-02 11:11:02 得分 30

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   函数的用户应注意该函数的限制。触发的断言指示对象一定有误,并且执行将暂停。但是,缺少断言只指示未找到任何问题,并不保证对象是好的。  
   
   
  Top

2 楼wangk(倒之)回复于 2005-12-02 11:12:15 得分 30

当从   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  
  大多数行开始处的大括号中的数字指定对象的分配顺序。最近分配的对象具有最高编号,并显示在转储的顶部。  
  Top

3 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-12-02 17:14:51 得分 40

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

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

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

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

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

(0)


相关推荐

  • CreateThread用法详解[通俗易懂]

    CreateThread用法详解[通俗易懂]CreateThread用法详解今天我给大家讲一讲C++中的多线程编程技术,C++本身并没有提供任何多线程机制,但是在windows下,我们可以调用SDK win32 api来编写多线程的程序,下面我就此简单的讲一下:创建线程的函数  HANDLE CreateThread(     LPSECURITY_ATTRIBUTES lpThreadAttributes, //

  • 织梦dedeCMS留言薄

    织梦dedeCMS留言薄

  • Python爬虫—-网页下载器和urllib2模块及对应的实例

    Python爬虫—-网页下载器和urllib2模块及对应的实例网页下载器:将互联网上URL对应的网页下载到本地的工具,是爬虫的核心组件未完。。。

  • 谷歌的变种murmurHash算法

    谷歌的变种murmurHash算法谷歌变种murmurHash的编写与测试#include#include#include#include#include#include#includeusingnamespacestd;boolCheckLittleEndin();uint32

    2022年10月19日
  • 基于python的电影推荐系统_复仇者联盟4终局之战纸牌

    基于python的电影推荐系统_复仇者联盟4终局之战纸牌喜欢看电影的朋友都知道,五一节之前上映了一部漫威号称十年布局的超级大片,据说老一代的英雄们有很多就要退出历史的舞台了,今天我们不是聊这一部电影的内容怎样,情节怎样,而是想基于爬虫来对豆瓣和猫眼电影两个网站中的影评数据进行采集,之后有时间的话会基于采集到的数据来进行文本分析。好了,其他的话就不多说了,详细的代码实现在之前的文章里面也已经给出来了,这里简单贴一下爬取到的数据…

  • mysql数据库总结体会(mysql的发展历史简介)

    一、数据库简介数据库(Database,DB)是按照数据结构来组织,存储和管理数据的仓库。典型特征:数据的结构化、数据间的共享、减少数据的冗余度,数据的独立性。关系型数据库:使用关系模型把数据组织到数据表(table)中。现实世界可以用数据来描述。主流的关系型数据库产品:Oracle(Oracle)、DB2(IBM)、SQLServer(MS)、MySQL(Oracle)。数据表:数…

发表回复

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

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