linux中 Segmentation fault问题
王钰琪 2016年4月27日 No Comment
今天写Gtest的时候程序报了 Segmentation fault,这也是linux C/C++比较常见的一个问题,即段错误。
出现这种错误的原因就是访问了不该访问的内存地址,一般情况就是:
(1)数组越界
(2)指针访问了一块非法地址(指针未初始化或者初始化错误)
(3)释放一块并没有申请的空间
而调试程序的时候吗,这种情况一般会给提示信息(Linux的哲学是不显示信息就OK,显示东西了一般都不是好事情):
Program terminated with signal SIGSEGV, Segmentation fault.
这里要注意提示信息中的SIGSEGV,这是内核返回的一个信号,还有另外一个信号是SIGBUS,这两个信号都与段错误有关
SIGBUS表示指针指示的地址是有效地址,但是总线不能使用此地址,这一般和数据未对其有关。
SIGSEGV表示指针指示的地址是无效地址,没有有效内存对应该地址。
出现段错误的情况一般;
(1)解引用一个包含非法值的指针。
(2)解引用一个空指针(所以使用指针前需要判空的)
(3)指针越界访问(一般是index值超过了申请空间的大小)
(4)用完了堆栈或堆空间(虚拟内存虽然巨大,但绝非无限)