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 语句返回指向该数组的指针。解决的办法就是弄明白栈上变量的生命周期。

相关推荐

  1. 3. C++ 常见错误对策

    2024-03-22 14:36:01       39 阅读
  2. 常用调试方法(错误产生原因)

    2024-03-22 14:36:01       56 阅读
  3. c语言常见错误

    2024-03-22 14:36:01       47 阅读
  4. 虚拟环境导致错误

    2024-03-22 14:36:01       32 阅读
  5. linux之错误分析

    2024-03-22 14:36:01       31 阅读
  6. Composer常见错误解决方法

    2024-03-22 14:36:01       42 阅读
  7. 7、C语言:常见C程序错误

    2024-03-22 14:36:01       64 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-22 14:36:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-22 14:36:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-22 14:36:01       87 阅读
  4. Python语言-面向对象

    2024-03-22 14:36:01       96 阅读

热门阅读

  1. 05|输出解析:用OutputParser生成鲜花推荐列表

    2024-03-22 14:36:01       39 阅读
  2. 基于spring boot实现接口管理平台

    2024-03-22 14:36:01       42 阅读
  3. opengl polygon 三角剖分

    2024-03-22 14:36:01       50 阅读
  4. 2024 蓝桥打卡Day18

    2024-03-22 14:36:01       44 阅读
  5. 前端小白的学习之路(ES6 二)

    2024-03-22 14:36:01       38 阅读
  6. 插件电阻的工艺结构原理及选型参数总结

    2024-03-22 14:36:01       42 阅读
  7. Python如何行转列代码

    2024-03-22 14:36:01       41 阅读
  8. OpenCV图像阈值分割、二值化

    2024-03-22 14:36:01       38 阅读
  9. 包装类的缓存问题

    2024-03-22 14:36:01       43 阅读
  10. seleniumui自动化实例-邮箱登录

    2024-03-22 14:36:01       46 阅读
  11. docker-compose(mysql5.6、mysql8、neo4j3.5、redis)

    2024-03-22 14:36:01       38 阅读