assertion failed是什么原因?

By | 2019年12月5日

关于C言语中的Debug Assertion Failed,在编译和运转时都不会呈现毛病,但是在履行时会呈现毛病。发作这类毛病的缘由能够是:

1、直接释放了1个空指针;

2、1个指针被释放了两次(即第2次释放1个空指针);

3、数组越界:拜访了超越数组长度的内存。

以上面1段复杂的源顺序代码为例:

在履行顺序时弹出的“Debug Assertion Failed”毛病正告对话框,这类状况大多是指针惹起的毛病。

下图红框标志的中央,是Distance类析构函数,这里运用了delete。这里实际上是不需求的,由于pDist指针是静态分配的内存,当顺序运转完后,其内存自动释放,此时运用delete就是删除1个不存在的指针,从而报错,而实践上delete是与new搭配运用的。

扩大材料:

除指针会惹起“Debug Assertion Failed”这类毛病,数组越界也会惹起这类毛病,也就是内存走漏。

内存走漏(即Memory Leak)是指顺序中己静态分配的堆内存由于某种缘由顺序未释放或没法释放,形成零碎内存的糜费,从而招致顺序运转速度减慢乃至零碎解体。

不管是C还是C++顺序,运转时分的变量次要有3种分配方式:堆分配、栈分配、全局和静态内存分配。而内存走漏次要是发作在堆内存分配方式中,即“配置了内存后,一切指向该内存的指针都遗失了”。

若缺少言语这样的渣滓回收机制,这样的内存片就没法出借零碎。由于内存走漏属于顺序运转中的成绩,没法经过编译辨认,所以只能在顺序运转进程中来辨别和诊断。

参考材料来源:百度百科-内存走漏

编写代码时,我们总是会做出1些假定,断言就是用于在代码中捕获这些假定,可以将断言看做是异常处置的1种初级方式。断言表示为1些布尔表达式,顺序员置信在顺序中的某个特定点该表达式值为真。可以在任什么时候候启用和禁用断言验证,因而可以在测试时启用断言,而在部署时禁用断言。(以上解释来自百度百科^_^) 举个例子吧,比方:bool a = false;assert(a);便会呈现assertion failed的提示, 所以看下你代码里的assert() 语句,其中的假定能否满足了…assert宏的原型定义在 assert.h 中,其作用是假如它的条件前往毛病,则终止顺序履行,原型定义:#include assert.h void assert( int expression );assert的作用是现计算表达式 expression ,假如其值为假(即为0),那末它先向stderr打印1条出错信息,然后经过调用 abort 来终止顺序运转。运用assert的缺陷是,频繁的调用会极大的影响顺序的功能,添加额定的开支。在调试完毕后,可以经过在包括#include assert.h 的语句之前拔出 #define NDEBUG 来禁用assert调用用法总结与留意事项:1)在函数开端处检验传入参数的合法性如:int resetBufferSize(int nNewSize){//功用:改动缓冲区大小,//参数:nNewSize 缓冲区新长度//前往值:缓冲区以后长度//阐明:坚持原信息内容不变 nNewSize =0表示肃清缓冲区assert(nNewSize = 0);assert(nNewSize = MAX_BUFFER_SIZE);…}2)每一个assert只检验1个条件,由于同时检验多个条件时,假如断言失败,没法直观的判别是哪一个条件失败不好: assert(nOffset =0 && nOffset+nSize =m_nInfomationSize);好: assert(nOffset = 0);assert(nOffset+nSize = m_nInfomationSize);3)不能运用改动环境的语句,由于assert只在DEBUG个失效,假如这么做,会运用顺序在真正运转时遇到成绩毛病: assert(i++ 100)这是由于假如出错,比方在履行之前i=100,那末这条语句就不会履行,那末i++这条命令就没有履行。正确: assert(i 100)i++;4)assert和前面的语句应空1行,以构成逻辑和视觉上的分歧感5)有的中央,assert不能替代条件过滤

发表评论

电子邮件地址不会被公开。 必填项已用*标注