QT--内存错误导致程序崩溃

提示:本文为学习记录,若有错误,请联系作者,谦虚受教。


前言

那么热的夏天,少年的后背被女孩的悲伤烫出一个洞,一直贯穿心脏。


一、问题点

之前一直编译运行成功的程序,今天重新运行时发现,程序偶然崩溃了,重新打开程序又可以运行,重复几次后又出现了程序崩溃的情况。网上冲浪后,找到程序的问题点。
整理如下:

1.C:\Program Files (x86)\SogouInput\Components\

运行程序时出现了这个“**C:\Program Files (x86)\SogouInput\Components**”问题点,这个提示并不是搜狗输入法出现问题,而大部分是内存错误导致程序崩溃,通常是野指针或者是空指针;
如图所示:
在这里插入图片描述
调试错误,出现的如图所示:
在这里插入图片描述
该错误提示含义是:
接收到信号
由于收到来自操作系统的信号,下位机停止运行。
信号名称:SIGSEGV
信号含义:分段故障

经过一系列的搜索资料以及学习前辈的文章,发现是指针问题。
划重点!!!
错误焦点:是在程序中出现了野指针,即使用了已经被释放了的对象的指针

2.错误操作

  1. 内存未分配成功,却使用了它。

  2. 内存虽然分配成功,但是尚未初始化就使用它。

  3. 内存分配成功且已经初始化,但是操作越过了内存的边界。

  4. 忘了释放内存,造成内存泄漏。

  5. 释放了内存,继续使用它。

3.解决方法

(1)在使用内存前检查指针是否为NULL。如果p是函数参数,那么在函数入口处assert(p !=NULL)进行检查。如果用new或者malloc申请的内存,应该用if (p ==NULL) 或者 if (p !=NULL)进行防错处理。
(2)犯这种错误起因有两个,一是没有初始化的概念;二是误以为内存的缺省初值全为零,导致引用初值错误。(例如数组)。 内存的缺省初值究竟是什么并没有统一的标准。有时为零值,有时不为零值,宁可信其无吧。所以,无论用何种方式创建数组,都别忘了赋初值,即便赋零值,也不要省略,不要嫌麻烦。
(3)
① 程序中对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存。此时应该重新设计数据结构,从管根本上解决对象管理混乱局面。

② 函数的return 语句写错了,注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁了。

③ 用free或delete释放内存后,没有将指针置为NULL,导致“野指针”。

二、找出问题点

1.Debug

(1)在声明中找到自定义的指针,在构造函数中new出来。
(2)直接ctrl+F,“new”,找到new出来的空间,一个模块一个模块屏蔽掉,然后一个模块一个模块放出来,慢慢找到问题点。程序太复杂的难度相当大,所以在此警醒自己,调用每一个指针的时候,都要考虑此刻它是否可能已经被释放了。

例如这次找到的问题点是自己的指针data释放后没有置为NULL,导致“野指针”。
在这里插入图片描述

三、野指针和空指针

1.野指针

(1)定义
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。
(2)成因
1、指针变量未初始化
任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。如果没有初始化,编译器会报错“ ‘point’ may be uninitialized in the function ”。

2、指针释放后之后未置空
有时指针在free或delete后未赋值 NULL,便会使人以为是合法的。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。

3、指针操作超越变量作用域

注意!!!
初始化时置 NULL。
释放时置NULL。

2.空指针

(1)定义
Null是在计算中具有保留的值,用于指示指针不引用有效对象。程序通常使用空指针来表示条件,例如未知长度列表的结尾或未执行某些操作; 这种空指针的使用可以与可空类型和选项类型中的Nothing值进行比较。
空指针不应与未初始化的指针混淆:保证空指针与指向有效对象的任何指针进行比较。但是,根据语言和实现,未初始化的指针可能没有任何此类保证。它可能与其他有效指针相等; 或者它可能比较等于空指针。它可能在不同的时间做两件事。
(仍然需要深入了解)

总结

善于总结,多进一步。

猜你喜欢

转载自blog.csdn.net/m0_51988927/article/details/124197375