当前位置: 首页 > news >正文

3. C++ 常见的段错误及对策

常见的 C/C++ 段错误及对策
一、指针没有指向一块合法的内存

定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内存。这里举几个比较隐蔽的例子。

  • 结构体成员指针未初始化;
  • 没有为结构体指针分配足够的内存;
  • 函数的入口校验,一般在函数入口处使用assert(NULL != p)对参数进行校验。assert 是一个宏,而不是函数;
三、内存分配成功,但并未初始化
memset(a,0,sizeof(a));

memset 函数有三个参数,第一个是要被设置的内存起始地址;第二个参数是要被设置的值;第三个参数是要被设置的内存大小。

至于指针变量如果未被初始化,会导致if 语句或assert 宏校验失败。

四、内存越界

内存分配成功,且已经初始化,但是操作越过了内存的边界。这种错误经常是由于操作数组或指针时出现“多1”或“少1”。比如:

int a[10] = {0};
for (i=0; i<=10; i++)
{a[i] = i;
}

所以,for 循环的循环变量一定要使用半开半闭的区间,而且如果不是特殊情况,循环变量尽量从0 开始。

五、内存泄漏

用malloc 函数申请0 字节内存

另外还有一个问题:用malloc 函数申请0 字节内存会返回NULL 指针吗?

可以测试一下,也可以去查找关于malloc 函数的说明文档。申请0 字节内存,函数并不返回NULL,而是返回一个正常的内存地址。但是你却无法使用这块大小为0 的内存。这好尺子上的某个刻度,刻度本身并没有长度,只有某两个刻度一起才能量出长度。对于这一点一定要小心,因为这时候if(NULL != p)语句校验将不起作用

内存释放

malloc 两次只free 一次会内存泄漏;malloc 一次free 两次肯定会出错。也就是说,在程序中malloc 的使用次数一定要和free 相等,否则必有错误。这种错误主要发生在循环使用malloc 函数时,往往把malloc 和free 次数弄错了。这里留个 练习:

内存释放之后

释放完块内存之后,没有把指针置NULL,这个指针就成为了“野指针”,也有书叫“悬垂指针”。这是很危险的,而且也是经常出错的地方。所以一定要记住一条:free 完之后,一定要给指针置NULL。

六、内存已经被释放了,但是继续通过指针来使用

这里一般有三种情况:

第一种:就是上面所说的,free(p)之后,继续通过p 指针来访问内存。解决的办法就是给p 置NULL。

第二种:函数返回栈内存。这是初学者最容易犯的错误。比如在函数内部定义了一个数组,却用return 语句返回指向该数组的指针。解决的办法就是弄明白栈上变量的生命周期。

http://www.lryc.cn/news/322961.html

相关文章:

  • 推荐的Kubernetes 学习资料
  • MySQL之索引与事务
  • Linux的基本使用
  • 亚信安慧AntDB全景观察:数据库领域的创新者
  • Linux 系统是如何收发⽹络包的
  • 飞跃前端瓶颈:技术进阶指南精华篇
  • Jenkins安装 Linux 更换镜像 安装插件
  • (一)基于IDEA的JAVA基础1
  • FPGA开源项目分享——基于FPGA加速的热扩散模拟器
  • 【ARM 嵌入式 C 入门及渐进 12 --寄存器位清0和置位函数实现】
  • Java实现10万,并发去重,优雅地处理重复请求!
  • 《深入解析 C#》—— C# 3 部分
  • Redis 的5种数据类型的基本命令
  • 【Liunx-后端开发软件安装】Liunx安装nginx
  • 力扣Lc20--- 202.快乐数(java版)-2024年3月20日
  • 机器学习----交叉熵(Cross Entropy)如何做损失函数
  • Linux docker3--数据卷-nginx配置示例
  • 力扣454. 四数相加 II
  • vulnstack1 渗透分析 红日靶场(一)
  • 外包干了6天,技术明显进步。。。
  • 比较好的知识点
  • 抖音开放平台的订单类API接口调用测试指南(内含详细步骤)
  • HiveSQL一本通 - 案例实操
  • Axure RP 8中文---快速原型设计工具,一站式解决方案
  • Available platform plugins are: minimal, offscreen, webgl, windows.
  • 创意无限,风险有度:2024愚人节海外网红营销策略解析
  • 深入理解 Session、Cookie 和 Token:网络安全和身份验证的重要概念
  • 镜像站汇总
  • 设计模式之抽象工厂模式解析
  • 【毕设级项目】基于ESP8266的家庭灯光与火情智能监测系统——文末源码及PPT