Valgrind解决 malloc assert failed 3096

在项目中一个普通的malloc语句调用中,出现malloc的内部assert错误

malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed


使用的平台是ubuntu 10.04 gcc 4.4.3 编译选项没有开优化(gcc在开优化后做了挺多事情的) -O0

脑中觉得无解之后只好寻求网上大神指导,在stackoverflow中发现了一个神奇的工具:Valgrind。这是一个 Linux下的开源仿真调试工具集合体。具体原理可以百度一下,这里我说一下简单的安装和使用以及如何找到找到问题并解决的。

我从官网 http://valgrind.org/ 上下载了至今最新的版本 3.10.1,解压后进入Valgrind根目录查看README文件进行configure, make , make install常规安装。第一步就算是完成了,运行Valgrind --tool=memcheck 文件路径 命令后得到如下结果:


从Valgrind反馈的信息来看就是就是写内存越界的问题导致的,果然,按照这个方向检查程序发现了一个细微的地方导致内存写入长度有误。不得不感叹工欲善其事,必先利其器啊。

内存检查只是Valgrind工具的一个基本功能点,其余的强大功能等以后用得着了再放在博客上...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当程序试图使用`malloc`分配内存,但没有提供足够的参数,或者调用了无效的指针,就会遇到未定义的`malloc`错误。这通常是因为程序试图访问不存在的内存空间,可能导致程序崩溃或产生不可预测的行为。 解决未定义`malloc`的方法主要包括: 1. **检查并修复代码**:检查`malloc`的使用位置,确保参数正确无误。`malloc`需要一个整数作为参数,表示要分配的字节数。如果忘记传入参数,或者传入了非法值,如NULL或负数,就可能出现问题。 ```c void *ptr = malloc(some_valid_size); ``` 2. **错误处理**:使用`malloc`之前添加错误检查,如果失败则返回适当的错误信息。例如,使用`malloc`的返回值判断是否分配成功。 ```c if (ptr = malloc(some_valid_size)) { // 成功分配内存 } else { // 处理内存分配失败 perror("Memory allocation failed"); } ``` 3. **使用智能指针或内存管理库**:现代一些编程语言和库(如C++的`std::unique_ptr`或`std::shared_ptr`,C的jemalloc等)提供了自动内存管理机制,可以在一定程度上避免因错误使用`malloc`导致的问题。 4. **使用内存调试工具**:运行时内存检测工具可以帮助查找内存泄漏和其他内存错误,如Valgrind、LeakCanary等。 5. **编译器警告**:启用编译器对内存分配的警告,可以让潜在问题在编译阶段就被发现。 记得,频繁的内存泄漏或错误使用`malloc`会对程序性能产生严重影响,所以尽早排查并修复这类问题很重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值