Qt编程 segmentation fault (段错误)解决思路

下面错误显示应该是很多程序员编程时都会遇见类似的问题吧。程序执行过程中,就异常退出显示如下类似的代码:

pure virtual method called
terminate called without an active exception

相信很多初学者绞尽脑汁都找不出代码问题的所在处,要么百度、要么寻求大佬帮助。遇到此问题时,一定不要慌 ,要冷静,仔细的去检查代码。代码是自己编写的,肯定很熟悉。这个时候就不要盲目的去检查代码到底是哪儿出了问题,理清解决问题的思路。以下步骤详细的教你解决类似问题:

第一步,看到类似的错误信息,应该想到什么?为什么会出现这个错误?

第二步,通过qDebug()/断点调试等方法去找到错误的大概代码位置。

第三步,带着目的性去检查代码(导致此错误产生的可能性)。

最后,就能解决问题的所在了。

当通过Qt断点调试时,就会产生这样一个窗口:

Signal Received

the inferior stopped because it received a signal from the operating system
signal name:   SIGSEGV
signal meaning: segmentation fault 

什么意思呢?  段错误!

造成segment fault(段错误),产生core dump的可能原因:

1.内存访问越界

①错误使用下标,导致数值访问越界;

②使用符串操作函数,将目标字符串读/写爆;(例:strcpy, strcat, sprintf, strcmp, strcasecmp)。

    建议strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。

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

2.非法指针

①使用空指针、野指针(悬挂指针)

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

3.栈溢出、修改只读内存

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

4.多线程操作错误

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

②使用了线程不安全函数

线程不安全函数指:

a)不保护共享产量的函数。

b)保持跨越多个调用状态的函数。

c)返回指向静态变量的指针的函数。

具体有哪些函数可以借鉴下面网址(其他博客大神所总结)

http://www.cnblogs.com/ehui/p/4838681.html

 程序员就可以带着这些可能情况在代码中查找,相信这样有目的性的检查代码就能很快的解决问题。

 

Qt编程中我相信也会经常碰到这个问题:

C:\Program Files (x86)\sogoupinyin\Components\程序异常结束。

无非就是以下2种情况导致的:

①栈溢出

②空指针/野指针

这时,你需要clam down,整理清晰的思路,带着目的性,这样我相信你很快就解决类似的问题了。

 

希望以上解决“”段错误”的思路能够帮助你解决问题。加油!  相信自己一定行!

 

你可能感兴趣的:(Qt编程 segmentation fault (段错误)解决思路)