malloc到未初始化的内存
来源:互联网 发布:钢铁力量6级车数据 编辑:程序博客网 时间:2024/05/16 05:56
在最近开发过程中发现一个malloc到未初始化内存的错误.
在使用CLISH(一款命令行开源软件)的时候,每次这个程序退出的时候都会发生core dump,错误为invalid pointer: 0x00007ffff02b35d8 .
但是这个错误只在某一台机器上发生错误,在完全相同配置(软硬件)的另外一台机器的时候,并不发生错误,调整clish加载的xml文件的之后,这个错误也会消失.
通过gdb调试发现core发生在free一个ptype_t指针的时候发生的错误,并且该指针地址为一个非法地址,这个指针指向的结构是一个声明了引用,但是并没有声明定义的类型(PTYPE).
在声明这个引用的定义之后,错误会消失.
在调试过程中,在最后free之前将指针指向NULL,就不会发生core.
再最初初始化了这个类型之后,后面有很多的代码都有机会更改这个结构的指针,没办法搜寻所有代码进行分析.
最后把目光转向初始化
clish_ptype_t *clish_ptype_new(const char *name, const char *help, const char *pattern, clish_ptype_method_e method, clish_ptype_preprocess_e preprocess){ clish_ptype_t *this = malloc(sizeof(clish_ptype_t)); memset(this, 0, sizeof(clish_ptype_t)); //这行是后加的 if(NULL != this) { clish_ptype_init(this,name,help,pattern,method,preprocess); } return this;}
这个错误其实是配置错误,所有在xml引用的类型都应该有定义,有定义的类型都不会发生coredump
从另外一个角度讲,这个错误也是由于malloc内存之后没有进行初始化,完全信赖后面的init方法会正确进行初始化造成的, 所以这也是一个clish的bug, malloc之后一定要进行初始化, 虽然这个错误发生并不是绝对的.
既然建议所有申请的内存都要进行初始化,不知道为什么这个标准api万年不变呢?
还有一个问题就是这个内存释放发生在程序退出的时机,但是程序退出之后,所有内存都要返回给操作系统,那这个内存释放是否是画蛇添足呢?
0 0
- malloc到未初始化的内存
- 线程创建未回收导致的内存泄漏问题(进程中的堆栈内存,并不是malloc出来的内存)
- 未初始化的指针
- 未初始化的教训
- 内存malloc的极致
- 在Linux 系统中,在运行一个程序时,程序中未初始化的全局变量会被加载到以下哪个内存段中?
- 在Linux 系统中,在运行一个程序时,程序中未初始化的全局变量会被加载到以下哪个内存段中?
- 动态分配内存 and malloc&new and 数组的动态分配、初始化(memset)和撤销(delete)
- 初始化和未初始化的全局变量
- 未初始化的存储uninitialized_x
- 变量未初始化的可能性
- malloc内存后的释放
- Linux内存初始化:bootmem到buddy的过渡
- 从一个简单程序的GDB调试看段错误,指针的初始化及内存分配(malloc/free)
- 从一个简单程序的GDB调试看段错误,指针的初始化及内存分配(malloc/free)
- c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针
- c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针
- malloc 内存
- Android 手动显示和隐藏软键盘
- Rxjava merge的使用
- 第六章 永无止境:网站的伸缩性架构
- 最新版本RAD Studio – 现在购买可享九折优惠
- 常见Android路线图
- malloc到未初始化的内存
- 结构体struct和typedef后面接指针的含义
- 【转载】Android-->MediaMuxer,MediaCodec,AudioRecord及Camera实现音频视频混合MP4文件
- Android 广播大全 Intent Action 事件
- 【Java数据结构与算法04】 | 第2章--数组
- android开发中通过aidl实现远程方法调用
- CentOS6.6 删除已安装的MySQL数据库
- 2016.09.19回顾
- Failed to create the java virtual machine解决