当前位置: 首页 > 编程日记 > 正文

AssertValid函数学习

转自http://tsitao.blog.163.com/blog/static/29795822006914105840496/

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

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

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

相关文章:

数值分析第一次作业-牛顿迭代法求解二元非线性方程组

1、问题 求解如下方程组: 2、算法 3、代码实现 # *coding:utf-8 * import math delta 5e-6 ;eps 1e-6 x0 1;y0 1 er 1;k 0 def z(x,y):return math.sin(x*y)*math.exp(-0.1*(x**2y**2x*y2*x)) def f(x,y):return y*math.cos(x*y)-0.1*(2*xy2)*math.sin(x*y) def g(x,y…

Maya制作风格化的女性跑步动画学习教程

时长:2h 11m |视频:. MP4 1280720&#xff0c;30 fps(r) |音频:AAC&#xff0c;48000 Hz&#xff0c;2ch |大小解压后:1.56 GB 含参考素材 流派:电子学习|语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 通过在Autodesk Maya中提供专业外观…

安卓手机抓包实战

最近因为要做一个项目&#xff0c;所以需要对手机给家电发送的请求进行抓取&#xff0c;于是上网找了许多教程&#xff0c;但都不怎么理想&#xff0c;最终经过两个晚上的艰辛奋斗&#xff0c;终于让我找到了方法抓取到了手机发送的请求&#xff0c;写一篇博客记录一下这个过程…

导入drupal中文语言包

http://lugir.com/book/export/html/399转载于:https://www.cnblogs.com/qinqiu/p/5174062.html

JavaScript引擎大战:Google提出StrongMode和SoundScript议案,增强V8性能

JavaScript 引擎性能大战硝烟迷漫&#xff0c;Chrome V8 引擎团队宣布了一个新的计划&#xff0c;在这个计划里他们介绍了两个新的虚拟机概念&#xff1a;强化模式&#xff08;StrongMode&#xff09;和强化脚本&#xff08;StrongScript&#xff09;。\\强化模式是 ES5 严格模…

数值分析第三次作业-常微分方程的数值解法

一、欧拉方法 二、修正的欧拉方法 2.1.梯形公式 将问题&#xff08;*&#xff09;的解表成积分形式&#xff0c;用数值积分方法离散化。例如&#xff0c;对微分方程

SYNCHRO 4D可视化调度学习教程 SYNCHRO 4D: Visual Scheduling

MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 技能水平:初级|流派:电子学习|语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:3h 14m |大小:1.36 GB 含课程练习文件 课程获取&#xff1a;SYNCHR…

SpringBoot复习:4(@ImportResource)

ImportResource注解 作用&#xff1a;这个注解可以用来导入Spring的配置文件&#xff08;bean.xml文件&#xff09;。 适用场景&#xff1a; 可以试想一下这样一个场景&#xff0c;老板要你将原来的Spring项目改成SpringBoot项目&#xff0c;原项目底下有一大堆的bean.xml文件…

YTU 2723: 默认参数--求圆的面积

2723: 默认参数--求圆的面积 时间限制: 1 Sec 内存限制: 128 MB提交: 206 解决: 150题目描述 根据半径r求圆的面积, 如果不指定小数位数,输出结果默认保留两位小数。 部分代码已给定如下&#xff0c;只需要提交缺失的代码。 #include <iostream> #include <iomanip&…

jmeter内存溢出处理方式记录

方法一&#xff1a; 使用jmeter进行压力测试时 遇到一段时间后报内存溢出outfmenmory错误&#xff0c;导致jmeter卡死了&#xff0c;先尝试在jmeter.bat中增加了JVM_ARGS"- Xmx2048m -Xms2048m -Xmn256m -XX:PermSize128m -Xss256k"&#xff0c;但结果运行时间增加了…

支持向量机学习笔记1

1、支持向量机是一种二类分类模型。它的模型基本定义是特征空间上间隔最大的线性分类器。 2、核函数的引入&#xff0c;使得支持向量机可以进行非线性分类。 3、支持向量机也可以完成多类别分类&#xff08;将在后面介绍&#xff09; 4、支持向量机的学习策略为间隔最大化&a…

C4D入门学习教程

MP4 |视频:AVC&#xff0c;1280720 30 fps |音频:AAC&#xff0c;48 KHz&#xff0c;2 Ch |时长:2h 12m 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大小解压后:560M C4D是一个有抱负的运动图形艺术家和设计师的重要工具。借助C4D&#…

SpringBoot复习:5(配置绑定)

配置绑定 在SpringBoot中我们如何读取到properties文件中的内容&#xff0c;并且把它封装到JavaBean中&#xff0c;以供随时使用呢&#xff1f; 我们可以使用以下两种方式来实现。 方法一&#xff1a;ConfigurationPropertiesComponent 第一种方法&#xff0c;我们可以使用C…

是男人就下100层【第五层】——2048游戏从源代码到公布市场

上一篇《是男人就下100层【第五层】——换肤版2048游戏》中阳光小强对2048游戏用自己的方式进行了实现&#xff0c;并分享了核心源码&#xff0c;这一篇阳光小强打算将该项目的全部源码公开并结合这个实例在这篇文章中介绍一下怎样加入广告和实现分享功能。终于执行效果例如以下…

zabbix菜单出现问号乱码问题

zabbix菜单出现问号乱码问题 安装后zabbix&#xff0c;设置成中文后&#xff0c;发现菜单出现了好多的乱码&#xff0c;google之后才知道这与zabbix数据库字符集设置有关。查看当前的默认字符集&#xff1a;mysql> show create database zabbix;---------------------------…

什么是Closed-form solution?

最近看论文&#xff0c;讨论微分方程解时遇到closed-form solution概念&#xff0c;上网检索&#xff0c;找到一个较浅显易懂的解释如下。 与工学院所学的微分方程不同的是&#xff0c;工学院的学生一般都是学如何把特定的微分方程的解用基本函数&#xff08;例如多项式、三角函…

c4d中的3D插图制作视频教程 Skillshare – 3D Illustration in Cinema 4D

技能分享——C4D的3D插图 教程大小解压后&#xff1a;1.33G 1920X1080 mp4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; C4D是众所周知的平易近人的软件&#xff0c;也是进入3D艺术梦幻世界的理想门户。 加入马特的这个课程&#xff0c…

SpringSecurity学习:1(第一个SpringSecurity项目)

此博客是记录自己学习过程的记录 第一个SpringSecurity项目 导入依赖 详细的步骤我就不多说了&#xff0c;使用IDEA创建过SpringBoot项目的人一般都能看懂。 这一步我们可以在使用IDEA创建SpringBoot项目的时候完成&#xff0c;如下图&#xff1a; 在创建SpringBoot项目时&a…

使用Struts2标签遍历集合

遍历Map<String,Object>遍历Map<Stirng,List<Student>>遍历List<Map<String,Student>>Student.java package action;public class Student {private Long sid;private String name;public Student() {// TODO Auto-generated constructor stub}p…

TortoiseGit的使用详解

然后A修改了,A想上传代码,发现冲突了,原因是A依靠的是1版本的代码进行了修改,而此时远程仓库的代码是2版本,这样当然会产生冲突。当从远程仓库拉取代码时,代码会直接拉取到工作区,然后我们要添加、提交,然后才可以把拉取的代码放入本地仓库,本地仓库的代码可以通过推送,推送到远程仓库,这是一个大循环。解决冲突的办法就是,先把远程仓库的2版本的代码进行拉取,然后TortoiseGit会列出冲突的文件代码,然后自己手动解决、选择自己需要的代码,右键选择解决冲突,最后再重新上传就可以了。点击拉取,可以下载文件。

Java的System.out.println()深入解析理解

语句来输出信息,从开始学习Java就知道用它来输出Hello World,没有深究其实现原理,现在查阅文档、源代码后记录一下。方法进行字符流输出,只是整个过程封装了许多方法来支持各种类型的变量、以及自动初始化等,使得用户能够方便快捷在控制台打印数据。变量进行了初始化,让它指向控制台,于是就可以直接使用了。的,因此即使程序中没有手动导入,也可访问到。由C/C++实现,这里只是一个接口,在。修饰的,根据Java语法,它只能调用。方法重载,因此可输出多种类型的数据。接着看,在构造方法中,先是初始化了。

第一次作业,针对软件工程这门课程提出五个疑问。

1、如果对于不爱好计算机的同学来说学习软件工程的意义大吗&#xff0c;有多大&#xff1f; 2、软件工程的知识面那么广&#xff0c;如果才能系统有效的将它学好&#xff1f; 3、软建工程这门课是否有点纸上谈兵了&#xff1f; 4、软件工程是衣门很枯燥的学科&#xff0c;我们怎…

matlab2013 a/b 找不到vs2013 c++ 编译器 解决方案

64-bit Matlab 解压附件后&#xff0c;放到 C:\Program Files\MATLAB\R2013a\bin\win64\mexopts32-bit Matlab 解压附件后&#xff0c;放到 C:\Program Files\MATLAB\R2013a\bin\win32\mexopts点我下载附件 原文出处&#xff1a;http://kaba.hilvi.org/homepage/blog/vs_201…

C4D运动图形基本训练学习教程

MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 技能水平:初级|语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |持续时间:3h 1m |大小解压后:1.7 GB 含课程练习文件 C4D继续作为3D艺术家的行业标准解决…

linux快捷上传下载文件

借助securtCRT&#xff0c;使用linux命令sz可以很方便的将服务器上的文件下载到本地&#xff0c;使用rz命令则是把本地文件上传到服务器 其中&#xff0c;对于sz和rz的理解与记忆我用了如下的方法&#xff08;因为很多时候容易搞混&#xff09;&#xff1a;sz中的s意为send&…

Java多线程复习:3(在操作系统中查看和杀死进程线程)

此博客是记录自己学习过程的记录&#xff0c;仅做参考 Windows下查看和杀死进程线程 查看所有进程 tasklist 查看指定关键字的进程 tasklist | findstr 关键字 Java程序运行的时候都是通过java.exe来运行的&#xff0c;所以想要查看Java程序运行的详情的话必须使用jdk自带的命…

Adt 配置注释模板

点击Window->Preferences->Java->Code Style->Code Templates,如下图所示&#xff1a; 选中&#xff0c;点击右侧的Edit进行编辑。

解决Attempt to execute SCRIPT mexLasso as a function

Attempt to execute SCRIPT mexLasso as a function: Error in selectFeature (line 22)w mexLasso(L, A, param);Error in demo (line 62)P selectFeature(AA_pos, AA_neg, paramSR); % feature selection 遇到这个问题一般是因为名为mexLasso的文件与…

灰猩猩拓扑速成班

Greyscalegorilla Plus Topology Crash Course 灰猩猩附加拓扑速成班 大小解压后&#xff1a;5.62G 1920X1080 时长&#xff1a;1小时16分 语言&#xff1a;英语中英文字幕&#xff08;机译&#xff09; 信息: 这个拓扑速成课程正如其名。它将为您提供坚实的拓扑基础&#xf…

Java多线程复习:5(sleep、yield方法和线程优先级)

sleep、yield方法和线程优先级 sleep方法 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态&#xff08;阻塞&#xff09;&#xff1b;其它线程可以使用 interrupt 方法打断正在睡眠的线程&#xff0c;这时 sleep 方法会抛出 InterruptedException&#xff1b;睡眠…