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

QT--内存错误导致程序崩溃,第1张

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

文章目录
  • 前言
  • 一、问题点
    • 1.C:\Program Files (x86)\SogouInput\Components\
    • 2.错误 *** 作
    • 3.解决方法
  • 二、找出问题点
    • 1.Debug
  • 三、野指针和空指针
    • 1.野指针
    • 2.空指针
  • 总结


前言

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


一、问题点

之前一直编译运行成功的程序,今天重新运行时发现,程序偶然崩溃了,重新打开程序又可以运行,重复几次后又出现了程序崩溃的情况。

网上冲浪后,找到程序的问题点。


整理如下:

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值进行比较。


空指针不应与未初始化的指针混淆:保证空指针与指向有效对象的任何指针进行比较。

但是,根据语言和实现,未初始化的指针可能没有任何此类保证。

它可能与其他有效指针相等; 或者它可能比较等于空指针。

它可能在不同的时间做两件事。


(仍然需要深入了解)

总结

善于总结,多进一步。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/673367.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存