CentOS运行C++程序出现内存错误-munmap_chunk():invalid pointer

最近在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()去释放,也会报内存相关的错误。


你可能感兴趣的:(C++,c,centos,内存错误,munmap_chunk)