error realloc(): invalid next size 崩溃

news/2024/7/8 5:46:08

##前言:
记录一次使用ealloc()崩溃的问题,
##代码现状:
我的代码如下:

void CSimpleBuffer::Extend(uint32_t len)
{
    m_alloc_size = m_write_offset + len;
    m_alloc_size += (m_alloc_size >> 2);	// increase by 1/4 allocate size
    void* new_buf = realloc((void*)m_buffer, m_alloc_size);
    m_buffer = (uchar_t*)new_buf;
}

m_alloc_size:buf的总大小
m_write_offset:buf已经被使用的大小
len:要拓展的大小

##问题描述
上面的代码,第一次调用时正常,第二次调用时必崩溃

##原因分析
上网查资料说invalid next size的错误是指新申请的空间小于旧的空间,自己写了个demo验证了一下,发现并非这样,demo代码如下:

int main5(int argc, char **argv)
{
    void* ptr = NULL;
    void* newPtr = realloc(ptr, 1025);

    ptr = newPtr;

    memset(ptr, 'A', 1025);

    int t = 0;
    printf("~~~~~~~~~~~~~~~~~~\n");

    void* str = realloc(ptr, 800);
    ptr = str;

    printf("222222222222,   ptr = %p,\n %s\n", ptr, ptr);
}

运行正常,未出现崩溃。
##根本原因
我的代码中,realloc之前,我向该buf(realloc第一个参数)中插入了一些数据,插入数据的长度处理错误:该buf是二进制数据,却被我当string类型处理
然后在realloc()时,越界访问该buf,堆空间使用错误,导致崩溃。大家可以参考:http://bbs.csdn.net/topics/340193758,第17楼所说,摘要如下:

比如你分配内存后,得到的地址是0x80300000, 长度是0x200那么地址0x802FFFF0位置放的就是控制信息,表明下一个内存block被使用了,同时该信息指明接下来可用的一个block地址在0x80300200开始。当这些控制信息被你因为越界给写坏了,内存的分配和释放就会出错,因为这些操作要根据这些信息找到你要释放的区域,做好标记为已释放。
##总结
崩溃问题多是内存使用不当导致,如果不能从崩溃现象直接分析出问题原因,可以尝试跳出出错的代码逻辑,然后梳理代码逻辑,查看崩溃的地址在其余代码中是否使用错误(往往这是根本原因)。


http://www.niftyadmin.cn/n/3656302.html

相关文章

科学计算器 文法测试用例

者:Leo Lee感谢我的同学Leo帮忙完成科学计算器的测试用例! 由于测试中发现一些问题,近期将发布c#科学计算器修正版。文法测试用例1 表达式预测结果系统提示结果检测结果30!/50*sin30正确正确正确50-10*lg70正确正确正确!lnsin90cos70表达式缺少符号在!附…

java和c#的区别

原文链接:https://www.cnblogs.com/maijin/p/7919385.html #相同点: 他们都是面向对象的语言,也就是说,它们都能实现面向对象的思想(封装,继承,多态) #区别: c#中的命名空间是namespace类似于Java中的package(包),在J…

科学计算器c#正式版发布

通过这段时间的一些测试,科学计算器的一些Bug已经修正,以下是Bug修正列表1. 修正运算结果错误,当运算结束后,数栈中存在多于一个元素2. 修正actg运算符之前不能放, - , * , / , sin, cos等二目运算符3. 修正阶乘运算函数值范围太小…

基于WinXP sp2配置biztalk2004遇到的问题及解决

运行ConfigFramework后,一切顺利,但在设置即将完成的时候报错,错误如下Failed to enable the Single Sign-On (SSO) Service (error code 0x80070005)查了一下微软网站,得到以下解决方案。(查看原文)使用组…

Eclipse出现java was started but returned exit code 1报错并退出

#java问题笔记,编译器eclipse: ##1、问题描述 eclipse之前一直用的很正常,今天打开突然提示如下问题: ##2、解决方法: .1 在eclipse.ini中添加如下代码: -vm C:\Program Files\Java\jdk1.7.0_80\bin\jav…

VS2005 ASP.NET本地化学习笔记感受

还记得在VS2003中,本地化特别是全局本地化文件,并没有预想当中的方便。VS2003默认的本地化策略是页面级资源文件,但由于这种文件在 VS2003中资源管理器中的布局是跟着aspx文件的,使得维护很不方便,如果你要改一个资源&…

Linux查找进程所在目录

Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的文件夹: 执行命令ll /proc/PID cwd符号链接的是进程运行目录;exe符号连接就是执行程序的绝对路径;cmdline就是程序运行时输入的命令行命令;environ记录了进程运行时的环境变量;fd目录下是进程…

java.lang.UnsupportedClassVersionError: ***** Unsupported major.minor version 52.0

##1.首先解释一下: stanford parser和jdk版本对应关系 J2SE 8 52, J2SE 7 51, J2SE 6.0 50, J2SE 5.0 49, JDK 1.4 48, JDK 1.3 47, JDK 1.2 46, JDK 1.1 45Unsupported major.minor version 52.0: 看到Unsupported你是不是会想到jdk高版本能兼容低版本&a…