对程序员来说内存相关的 bug 排查难度几乎和多线程问题并驾齐驱,当程序出现运行异常时可能距离真正有 bug 的那行代码已经很远了,这就导致问题定位排查非常困难,这篇文章将总结涉及内存的一些经典 bug ,快来看看你知道几个,或者你的程序中现在有几个。。。
返回局部变量地址
int fun() {
int a = 2;
return &a;
}
void main() {
int* p = fun();
*p = 20;
}
int sum(int* arr, int len) {
int sum = 0;
for (int i = 0; i < len; i++) {
sum += *arr;
arr += sizeof(int);
}
return sum;
}
int a;
scanf("%d", a);
如果a的值作为指针指向代码区或者其它不可写区域,操作系统将立刻kill掉该进程,这是最好的情况,这时发现问题还不算很难
如果a的值作为指针指向栈区,那么此时恭喜你,其它函数的栈帧已经被破坏掉了,那么程序接下来的行为将脱离掌控,这样的 bug 极难定位
如果a的值作为指针指向堆区,那么此时也恭喜你,代码中动态分配的内存已经被你破坏掉了,那么程序接下来的行为同样脱离掌控,这样的bug也极难定位
----------伟大的分割线-----------
PHP饭米粒(phpfamily) 由一群靠谱的人建立,愿为PHPer带来一些值得细细品味的精神食粮!
饭米粒只发原创或授权发表的文章,不转载网上的文章
所发的文章,均可找到原作者进行沟通。
也希望各位多多打赏(算作稿费给文章作者),更希望大家多多投稿。
投稿请联系:
shenzhe163@gmail.com
本文由 码农的荒岛求生 授权 饭米粒 发布,转载请注明本来源信息和以下的二维码(长按可识别二维码关注)
素质三连biubiubiu~