最近在CentOS用C++读数据,数据量挺大,而且是用的各种指针就出现了各种内存错误。调试的时候也是调试了很久,现将错误记录一下
出现munmap_chunk():invalid pointer的可能原因
一般来说,出现此类错误是在free的时候
(1)free的地址不是动态分配的地址
(2)动态分配的地址被修改过(对修改后的地址访问出问题)
我遇到的问题
描述:再分配内存不足。。。读取数据的时候是对结构体进行操作,且读取数据的程序需要配一定的环境,几千行的代码,不便于调试。故模仿当时所犯的错误,写了个小程序更直观一些。
/*
* ===============================================================================
*
* Filename: Test.cc
*
* Description:This is a test program, to imaitate the read_data program.
*
* Using malloc init a struct array,the init size is n , when the size
*
* greater than n,we should use realloc function to expand the space.
*
*
* Version : 1.0
*
* Creted:04/10/2016 11:57
*
* Cretify:none
*
* Cretify time:none
*
* Compiler:gcc
*
* Author:XIU
*
* ==============================================================================
*/
#include<iostream>
#include<stdlib.h>
using namespace std;
struct Data
{
int index;
};
void test( int all_data )
{
int n = 100;
struct Data * s_data = ( Data* ) malloc( sizeof(Data) * n );
for( int i = 0; i < all_data; i++ )
{
if( i >= n )
{
s_data = ( Data* ) realloc( s_data, (n+1) );
n++;
}
s_data[i].index = i;
}
for( int i = 0; i < all_data; i++ )
{
cout << s_data[i].index << "\t";
}
free( s_data );
}
int main()
{
test( 200 );
return 0;
}
</pre><pre code_snippet_id="1641116" snippet_file_name="blog_20160410_2_2650180" name="code" class="cpp">
用G++来运行上述程序,会出现错误(由于测试的数据量小,模仿出的错误有所不一样)经过调试发现是realloc函数有问题,重新开辟的空间有些小,改为下述内容就可以了。
s_data = ( Data* ) realloc( s_data, (n+1) * sizeof(Data) );
注意:realloc函数中返回的指针和传递参数的指针s_data需要一致。如果不一致,由于free()函数的内部实现调用了munmap_chunk(),则会报munmap_chunk()的错误,但也可能报其他内存相关的错误。另外,如果malloc分配的指针s_data中途被修改或在其他地方被释放,就成了野指针,这个野指针再传给free()去释放,也会报内存相关的错误。