最近在CentOS用C++读数据,数据量挺大,而且是用的各种指针就出现了各种内存错误。调试的时候也是调试了很久,现将错误记录一下
一般来说,出现此类错误是在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()去释放,也会报内存相关的错误。