CentOS系统运行C++程序出现内存错误 segmentation fault

由于数据量比较大,几十万条的数据,读出来以binary的形式存储,会有40G。在每次读数据的时候总会出现些错误,现将遇到的有关内存错误整理一下。
参考博客 http://www.cnblogs.com/justacoder/archive/2010/04/14/segmentation_fault.html

出现segmentation fault的可能原因

1.内存访问越界

a) 由于使用错误的下标,导致数组访问越界

b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符

c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。

2 多线程程序使用了线程不安全的函数。

3 多线程读写的数据未加锁保护。对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成core dump

4 非法指针

a) 使用空指针

b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易因为bus error而core dump.

5 堆栈溢出.不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。

读取数据的时候所出现的问题

1、内存访问越界

如果程序中包含各种的数组操作,一定要检查一下是否出现数组越界的情况。在我读取气象数据的过程中,包含有层次定义信息,层次定义有错,造成数组定义有问题。直接导致出现segment fault。

2、非法指针

在定义结构体数组的时候没有动态开辟内存,造成 segmentation fault

3、堆栈溢出

值得注意的是,所有的动态开辟的内存,在程序结束的时候需要释放空间,否则不管都大的memory,都会达到100%,这样的话也容易出现segmentation fault

在free的时候,free的指针如果不是malloc动态开辟的,容易堆栈溢出,出现一串串的错误,如下图。所以free的时候要确认一下变量的定义方式。

CentOS系统运行C++程序出现内存错误 segmentation fault_第1张图片

你可能感兴趣的:(C++,linux,内存)