Segmentation fault (core dumped)的疑难杂症,gdb调试都没有错误提示信息,最终解决!

程序栈溢出,一执行程序,立马报段错的警示,及经验教训

遇到一个问题,只要程序一执行,就立马报段错误,而且gdb调试的结果只是显示:
int main()
{
的左大括号有问题,就没有更多信息了,也就是说gdb调试的结果没有任何帮助。

仔细看了下代码,发现程序中有两个大的数组,主要是用来作为一个3072*2048的图像的每一个像素所在位置是否被填充的一个标志,如下:

    bool exist_bool_vertex[2048][3072] = {{false}} ;
    bool exist_bool_mesh[2048][3072] = {{false}} ;

因为这两个数组都是main函数内部局部变量,因此是分配在栈上的,但是呢,在内存中栈的大小远小于堆区的大小,栈区一般也就几M大小,分配这么大的两个数组,程序只有一执行,就即有可能导致栈溢出。

解决方法

将上面的两个数组转换为std::vector,因为容器中除了array,其余的全部分配在堆上,这样就不会导致栈溢出了,而堆区一般是足够大的,完全能够放的下这两个大小为2048*3072的vector的。即:

	std::vector<std::vector<bool>> exist_bool_vertex(2048, std::vector<bool>(3072, false));
	std::vector<std::vector<bool>> exist_bool_mesh(2048, std::vector<bool>(3072, false));

修改之后,重新编译执行之后,果然没有再报错了,顺利解决这个疑难杂症!!!

补充:常见的导致Segmentation fault的原因

(1)堆栈溢出。不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出。

(2)内存访问越界,比如由于使用错误的下标,导致数组访问越界

(3)多线程程序使用了线程不安全的函数。

(4)多线程读写的数据未加锁保护。对于会被多个线程同时访问的全局数据,应该注意加锁保护

(5)非法指针

本文的问题就是犯了第一个错误,长教训了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值