free() invalid next size异常

来源:互联网 发布:如何在淘宝上卖鱼 资质 编辑:程序博客网 时间:2024/06/07 22:04

1.free了未分配的內存。

2.申請的內存未free。(個人覺得這個不太可能造成錯誤,只是會內存洩露)

3.在申請的內存中進行了內存的越界操作。多见于数组、结构体循环处理的时候,

这个时候有时会报 double free的异常

有时会报munmap_chunk的异常。

解决方法:(血泪教训)

(1) 检测需要的长度, 加长数组的长度

(2)数组操作的时候,不能大于数组的长度。

举个例子:

float *buffer;
   buffer = (float *)calloc( 4, sizeof( float ) );
   buffer[1]=2.5;
   buffer[2]=2.5;
   buffer[3]=2.5;
   buffer[4]=2.5;
   buffer[5]=2.5;
   free(buffer);

calloc长度是4,但是必须有buffer[5],才报异常free invalid next size

如果调两遍free(buffer),就会报异常:double free or corruption...异常

下面用例子來验证一下第三种情況。

#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#defineMAX_NUM10int main(int argc,char **argv){char*str;str = (char*)malloc(sizeof(char)*MAX_NUM);if(!str)exit(-1);int i;    for(i=0;i<MAX_NUM+2;i++){        str[i] = 'a';}free(str);return 0;}如果调两遍free(str),就会报异常:double free or corruption...异常free时必须置为NULL,这样才能不崩溃。
free(str)
str=NULL;
if(str)
free(str);

由此,基本定位了崩溃原因:内存访问越界导致破坏了heap的数据结构。用valgrind在线下环境启动进程,试图重现崩溃或定位越界访问的代码,遗憾的是,脚本压了1个小时也没出现崩溃,而valgrind的输出报告也没有越界代码位置的提示。
        最终,仔细检查源码后发现,在某个回调函数中,new出来的buffer接收完通过http post方式发送过来的2进制数据后,我又多写了1行代码,类似于:recv_buf[data_len] = '\0',导致越界多写1个字节,最终引起各种莫名其妙的内存崩溃。

/home/lbg/KcfDsst/main.cpp:20: error: invalid conversion from 'void*' to 'char*' [-fpermissive]

 char *tmp2;

int len1=2;

tmp2 = malloc(len2+1);

解决方法:tmp2 =(char*)malloc(len2+1);

我定义了一个类
class A{
//方法略
private:
    File *a;//File为自定义类
    char *name;
    int count;
}

然后构造函数
A::A( char *fileName ){
    int size = sizeof( fileName );
    name = new char[ size + 1 ];

}

解决:sizeof在这里应该是strlen

                                             
0 0
原创粉丝点击