用C++ 而不是 C(2)使用断言

C/C++assert 断言 一、动态断言assert assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include void assert( int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息, 然后通过调用 abort 来终止程序运行。 #include 阅读详情

使用断言
12.用MFC时选择ASSERT宏
13.不要使用VERIFY宏,使用断言宏
14.在使用CObject派生类的对象之前都要调用ASSERT_VALID宏
15.总是在调用ASSERT_KINDOF宏之前调用ASSERT_VALID宏
16.移植代码的时候也移植断言
17.要想有效的利用断言需要一定的策略,不要随意的把断言分布到你的代码里面,而是遵从某些已经建立起来的模式
18."Assert the word",是说:不要试图选择哪一个断言要发现错误,而是根据你的断言策略断言一切
19.最有力的断言是用来验证变量之间的固定关系。这些关系称为不变关系(invariants)。其中,类不变关系和循环不变关系最为普遍
20.设计程序的同时就设计不变关系,在写代码之前理解它们,并且为它们建立文档
21.公有成员函数比私有和保护成员函数需要更全面的断言
22.充分实现AssertValid函数,不要使用MFC ClassWizard提供的默认实现
23.建议对AssertValid函数采用下面的断言模式:
void CMyObject::AssertValid()
{
 //  check the immediate base class first
 CMyObjectBaseClass::AssertValid();
 
 // check the data members not in the base class
 ASSERT_VALID(m_pObject1);
 ASSERT_VALID(m_pObject2);

 // now check the class invariants not checked by the base class
 // be sure to document the invariants
 ASSERT(m_Value != illegalValue);
 ASSERT(m_Object1.GetSize() == m_Size);
 ...
}
24.不正确的使用断言会导致错误。断言是用来揭示错误的,而不是用来纠正运行时刻错误的。
25.如果你的程序是防御性的,别忘了使用断言。如果你使用断言,也别忘了防御性编程。这两种技术最好结合在一起使用。
26.考虑使用_ASSERTE(FALSE)来简化防御性的编程和断言的结合。要想得到更有描述性的断言信息,考虑使用_ASSERTE("Problem description." == 0)。
27.断言不是错误处理的替代品。
28.这种方法让你不用打扰窗口画图就可以在出现窗口后,随时察看导致断言失效的代码。
void CMyview::OnDraw (CDC* pDC) {
 int previousReportMode = _CrtSetReportMode(_CRT_ASSERT,
     _CRTDBG_MODE_DEBUG):
 CMyDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 ...  // draw the window
 if (previousReportMode != -1)
  _CrtSetReportMode(_CRT_ASSERT,previousReportMode);
}
29.使用GetObjectType函数来断言一个具有有效句柄的GDI对象(察看返回值是否为零),或者某个特定的GDI对象(察看返回值是否是某个特殊值)。eg:
_ASSERT(GetObjectType(hBrush) == OBJ_BRUSH);
但是,要意识到GetObjectType函数可能返回一些让人吃惊的结果。如,下面的断言失效:
HBRUSH hBrush = CreateSolidBrush(RGB(0,0,0));
DeleteObject(hBrush);
_ASSERTE(GetObjectType(hBrush) == OBJ_BRUSH);
因为黑色的刷子是一个备用设备的对象(也就是不能删除),因此 DeleteObject 函数调用就没有作用。
30.MSDN文档声称IsBadCodePtr、IsBadReadPtr、IsBadStringPtr和IsBadWritePtr这几个API函数在接收到坏指针的时候就会在调试版本里导致断言失效。这个说法是错误的,必须把这些函数包装在断言语句中。

C/C++学习笔记八(断言与异常处理) 断言断言是什么?简单而言,断言是对某种假设条件进行检查。 C语言中,在assert.h中,断言被定义为宏的形式(assert(expression)),而不是函数。 assert将通过检查表达式的值来决定是否需要终止程序,如果表达式为真(1)则忽略断言,程序继续运行。如果表达式为假(0),那么首先向错误流strerr打印一条错误信息,然后通过abort函数终止程序的运行。断言用法的简单例子:in 阅读详情

相关推荐

使用Windbg排查C++程序调用IsBadReadPtr或IsBadWritePtr引发内存访问违例问题

C++程序调用IsBadReadPtr或IsBadWritePtr引发内存访问违例问题的排查

dvlinker的技术专栏 1万+

Windows程序调试----第三部分 调试技术----第9章 内存调试

第9章内存调试     能够方便高效地进行动态内存分配,是C++编程语言的重要优点之一;而调试时容易错误使用动态分配的内存也是其最大的缺点之一。Windows程序也可能同样存在与系统资源泄漏或者堆栈相关的内存问题。内存问题是Windows程序错误的常见来源之一、而且如果没有合适的工具进行调试:它们将是最难以追踪到的错误之一。     动态内存分配错误有以下两种基本类型:内存错误和内存泄

lien0906的专栏 1894

FreeRTOS实战:STM32CubeMX配置USART+DMA实现高效串口通信(附完整代码)

本文详细介绍了如何使用FreeRTOS和STM32CubeMX配置USART与DMA实现高效串口通信。通过对比轮询、中断和DMA三种模式的性能差异,提供完整的STM32CubeMX配置步骤和代码实现,帮助开发者优化嵌入式系统的串口通信性能,显著提升数据吞吐量和系统响应速度。

weixin_29190169的博客 455

IsBadReadPtr函数和异常处理

起因是优化代码性能,注意到这个函数,搜了一下发现是微软弃用的函数,说是有线程安全问题。经过一系列操作发现,处理大文件时这个函数会导致耗时变长,于是就研究一下这个函数。 首先看函数开头: mov edi, edi push ebp mov ebp, esp push 0FFFFFFFEh push offset stru_77991A20 push offset FindResourceExA_SEH mov eax, large fs:0 push ea

CoderAldrich的专栏 2925

PyCharm中Matplotlib中文显示问题的终极解决方案

本文详细解析了PyCharm中Matplotlib中文显示问题的根本原因,并提供了从简单三行代码到深入配置的多套解决方案。针对Windows、Mac和Linux不同系统环境,分别推荐了最优字体配置方案,同时涵盖了PyCharm特定环境下的后端设置、字体路径指定等高级技巧,帮助开发者彻底解决中文乱码问题。

weixin_28221501的博客 303

UOS忘记密码别慌!用LiveCD工具5分钟搞定,附命令行救援模式详细步骤

本文详细介绍了UOS系统密码遗忘时的两种解决方案:图形化LiveCD工具和命令行救援模式。针对普通用户,LiveCD工具提供5分钟快速重置密码的便捷操作;而技术人员可通过命令行深度解析系统分区挂载与密码修改流程。文章还包含安全加固建议,帮助用户预防类似问题发生。

weixin_27032989的博客 589

IsBadReadPtr函数

该函数用来检查进程是否有权限访问指定的内存块。 The IsBadReadPtr function verifies that the calling process has read access to the specified range of memory.BOOL IsBadReadPtr(  const VOID* lp,  UINT_PTR ucb);

sherlockhua的专栏 1万+

深信服aCloud虚拟存储VS3.0实战:从数据分片到仲裁机制的全流程解析

本文深度解析了深信服aCloud虚拟存储VS3.0的核心架构与生产级实践。从数据分片、条带化写入、多副本机制到智能缓存分层,详细阐述了其如何实现高性能与高可靠性的平衡。同时,深入剖析了动态均衡、平滑扩容以及故障恢复与仲裁机制,为运维人员和技术决策者提供了在超融合基础架构(HCI)中部署和管理虚拟存储的实战指南。

net55的博客 588

用C++而不是C(2)使用断言

 用C++而不是C(2)使用断言原文:用C++而不是C(2)使用断言  

^_^纯一狼^o^ 2021

全球首发48V架构的Cybertruck,到底牛在哪?| 深扒特斯拉高压系统架构

特斯拉Cybertruck作为全球首款标配48V架构的量产车,在电气系统架构上进行了多项创新。首先,它采用以太网连接高压控制器与后域控制器,提升了数据传输效率和智能化水平。其次,Cybertruck引入了Pyro烟火断开装置,用于碰撞时快速断开电池连接,提高安全性。在电流监测方面,特斯拉既保留了传统的Shunt分流器技术,又引入了更先进的磁通门电流传感器,后者具有无温漂、完全隔离等优势。48V供电系统在降低电流损耗方面表现优异,但也面临电弧风险、盐水腐蚀等挑战。Cybertruck的48V系统通过PCS供电

weixin_43199439的博客 1347

YOLOv11改进 | 损失函数改进篇 | EIoU、SIoU、WIoU、DIoU、FocusIoU等二十余种损失函数

这篇文章介绍了YOLOv11的重大改进,特别是在损失函数方面的创新。它不仅包括了多种IoU损失函数的改进和变体,如SIoU、WIoU、GIoU、DIoU、EIOU、CIoU,还融合了“Focus”思想,创造了一系列新的损失函数。这些组合形式的损失函数超过了二十余种,每种都针对特定的目标检测挑战进行优化。文章会详细探讨这些损失函数如何提高YOLOv11在各种检测任务中的性能,包括提升精度、加快收敛速度和增强模型对复杂场景的适应性。

Snu77的博客 6194

C/C++开发,c/c++断言(预处理断言、编译断言、运行断言)

c/c++断言(预处理断言、编译断言、运行断言)

技术需要分享 3319

bevformer详解(3): 逐行代码讲解

在这篇文章中,我们将从BEVFormer算法代码入手,深入探究BEV转换的流程。BEVFormer是一种基于Transformer的BEV转换模型,其核心思想是利用自注意力机制和交叉注意力机制,从,并通过Object Query与BEV特征的交互,完成3D目标检测和地图分割等任务。https://developer.baidu.com/article/details/3224715bevformer的网络结构由三部分组成, 模型结构所示,其中的是部分,对于的是的结构,对于部分,沿用的中的decoder部分,

@bangbang的博客 3700

【C/CPP】assert断言与static_assert静态断言

一、断言 assert是一个宏函数,其原型定义在assert.h中: #ifdef NDEBUG #define assert(condition) ((void)0) #else #define assert(condition) #endif 一般在调试版本中使用,作用是在程序运行的时候将条件condition的表达式的逻辑值与0进行比较,若相等,则在标准错误输出上输出实现指定的诊断信息,...

baymaxly的博客 1937

Python爬虫实战:基于异步爬虫与机器学习的数据采集——以电商平台在线评论有用性分析为例

内容涵盖爬虫原理、反爬虫策略应对、数据清洗、数据存储以及简单的数据分析预览,并为后续利用机器学习模型(如逻辑回归、随机森林)分析评论有用性打下坚实的数据基础。特别是在电子商务领域,在线评论作为UGC的一种主要形式,深刻影响着消费者的购买决策和商家的信誉体系。然而,平台上的评论质量参差不齐,充斥着大量无意义的灌水、广告甚至虚假评论。因此,如何自动识别和筛选出“有用”的评论,成为了学术界和工业界共同关注的焦点。我们选择目前Python爬虫领域最前沿、效率最高的技术组合,以确保爬虫的稳定性、速度和可扩展性。

2201_76125261的博客 107

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++ 断言

C++;C++11新特性;断言

Allen Roson 2006

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

断言失败的vc++文档_了解C / C ++中的断言

断言失败的vc++文档In this article, we’ll take a look at using the concept of assertions, using the assert in C/C++. 在本文中,我们将研究使用断言的概念,以及在C / C ++中使用断言。 This is not very hard to understand, so let’s get star...

从零开始的教程世界 1994

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C/C++中的断言(assert与static_assert)

你也可以通过我的独立博客 —— www.huliujia.com 获取本篇文章 assert简介 assert被C/C++用来判断某些条件是否成立,比如判断指针类型的大小sizeof(void*)是否大于8,或者判断malloc返回的指针是否为null。 assert的函数申明如下: void assert( int expression ); 如果expression为0,即false,assert就会把函数名,源代码文件名、当前行号发送给标准错误stderr,然后调用abort()终止执行。 什么.

胡LiuJia@BLOG 4207

C/C++中的静态断言

C/C++中的静态断言 falling blog2015-01-15326阅读 静态断言c++ 断言 尽可能早的发现错误 静态断言(Static Assertion) 举例 static_assrt 的其他实现 利用数组大小不能为负数 利用模板参数暴露错误 断言 断言(assert)是c语言标准库(assert.h)中一个使用的宏,作为一种先验条件判断...

Poo_Chai的博客 1904

【C++断言机制】深入理解C/C++ 中静态断言static_assert与断言 assert

断言(assertion)是一种在代码中声明某些事情为真的方式。当这些声明被违反时,它们会产生错误。这听起来很简单,但为什么它如此重要?

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1332

C/C++ Assert断言 详解

assert(断言)本质是宏,由C/C++标准库提供的一个调试工具。它以一种简洁的形式在代码中嵌入“安全检查”机制。在程序运行时,assert会对一个指定的条件表达式进行求值,并根据结果决定程序是否继续执行。如果条件不成立,则立即终止程序并报错,帮助开发者快速定位由于事先没有考虑周到或外部异常输入等原因造成的各种bug。

qq_42561732的博客 1386

C/C++ assert断言详解

在C/C++中,assert是一种用于调试的宏,主要用于验证程序中的某些假设条件是否成立。如果条件不成立,assert会中断程序的执行,并输出相关信息,帮助开发者定位问题。assert是动态断言,在程序运行期进行条件检查,C++11中引入了静态断言用于编译期进行条件检查。下面我们围绕这两点进行展开。C语言中,assert宏的原型定义在中,而在C++中则定义在中。虽然二者头文件名称不同,但它们的功能都是相同的。但是

R6bandito的博客 1971

【C语言】assert(断言)使用详解

在软件开发过程中,确保程序的正确性是非常重要的。为了帮助开发者在开发阶段尽早地发现潜在的问题,C语言提供了一个非常有用的工具——assert。本文将详细介绍assert的工作原理、使用方法以及一些最佳实践。assert是一个预处理器宏,通常被用来在开发和测试阶段检测程序中某些关键假设是否成立。当某个断言失败时,assert会终止程序,并输出一条错误信息,这有助于开发者快速定位问题所在。assert是一个非常有用且强大的工具,可以帮助开发者在开发过程中快速定位和修复错误。通过合理使用assert。

编程知识点梳理、项目经验总结、学习方法分享 6446

2024年C C++最新C语言断言assert-从源码解析到熟练使用_c assert,2024年最新【吐血整理

现在,将不再为分号“;/*使用断言来检查用户是否使用了“连接”业务*//*long类型占用的内存空间是否为4*//*int类型占用的内存空间是否为2*//*检查内存块是否重叠*//*不使用断言测试*//*使用断言测试*//*处理函数原型*//*函数处理代码*//*函数处理代码*/

2401_84978642的博客 1114

c语言使用断言程序崩溃,C语言调试利器——断言

关注“杜明c”,每天进步一点点!两个问题断言是什么?断言可以干什么?断言是C语言异常处理的高级形式,其实也就是一个测试表达式,如果表达式为真,程序继续,否则,程序退出。在我们执行程序的时候,往往会出现意想不到的情况,例如指针为空,除数为零等等,那么利用断言就能够很快排查出问题。那么有朋友要问,为什么不直接使用printf语句输出呢,使用printf还能获取更多的信息。我们知道,写程序一般分为两个版...

weixin_29774679的博客 1085
上一篇: 如果我有自己的开发团队...
下一篇: 用C++ 而不是 C(3)使用跟踪语句
sjf331
博客等级 码龄25年 46粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值