QT--内存错误导致程序崩溃
提示:本文为学习记录,若有错误,请联系作者,谦虚受教。
文章目录
- 前言
- 一、问题点
- 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.错误操作
内存未分配成功,却使用了它。
内存虽然分配成功,但是尚未初始化就使用它。
内存分配成功且已经初始化,但是操作越过了内存的边界。
忘了释放内存,造成内存泄漏。
释放了内存,继续使用它。
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值进行比较。
空指针不应与未初始化的指针混淆:保证空指针与指向有效对象的任何指针进行比较。但是,根据语言和实现,未初始化的指针可能没有任何此类保证。它可能与其他有效指针相等; 或者它可能比较等于空指针。它可能在不同的时间做两件事。
(仍然需要深入了解)
总结
善于总结,多进一步。
QT--内存错误导致程序崩溃相关推荐
- 服务器内存不足导致程序(tomcat)崩溃
服务器内存不足导致程序(tomcat)崩溃 场景 场景 在同一台服务上部署了多个tomcat,每个tomcat上都运行项目: 通过命令netstat -ntlp查看运行的java进程及对应的端口信息 ...
- goroutine中使用recover,解决协程中出现panic,导致程序崩溃的问题。recover panic 协程的错误处理
package mainimport ("fmt""time" )//goroutine中使用recover,解决协程中出现panic,导致程序崩溃的问题. f ...
- OpenCV中waitKey()函数失效问题汇总(按键失效、按键不灵、按键导致程序崩溃)
提示:阅读文章,大约需要3分钟 问题描述 在使用OpenCV编程的时候,我们经常会使用按键等待函数:waitKey(),大家可能会用它来作为 延迟.等待用户输入按键的功能使用,以下列出了在使用过程中遇 ...
- laravel清理缓存(config:clear)后导致程序崩溃
laravel清理缓存(config:clear)后导致程序崩溃 前情提要:导致这个错误的可能性有很多,如此不人性化的提示是因为在config:clear后laravel重载出错,然后尝试从log输出 ...
- NodeJS 导入包的时候出现的 @types 错误导致程序无法运行
在一次开发 NodeJS 项目的时候,我们希望包的导入是用 import 导入的方式. 但是在具体导入的时候发现是使用 @types 导入的. 如果上面的图显示的导入方式,结果结果是导致程序错误无法运 ...
- MFC使用GetDlgItem获取控件导致程序崩溃的问题
对于MFC窗口,在没有被创建完成时,是无法获取控件资源的.如果将GetDlgItem写在窗口类构造函数中,就会导致程序崩溃 正确方法是将GetDlgItem放在窗口类的OnInitDialog函数中执 ...
- java调用dll报内存溢出错误或者程序崩溃
因为业务需要,需要用Java去调用dll动态库来分析图片,结果调用后导致程序内存溢出,或者直接崩溃:再经过反复检查后,发现本身的我写的java代码并没有问题,最终去验证图片的时候: 1.图片访问不到, ...
- QT多线程网络编程程序崩溃问题与解决
环境:Ubuntu14.04,Qt5.5 平台:QtCreator 场景:有以下三个线程:1.gstreamer循环取摄像头视频帧,25fps:2.HTTP循环请求消息并显示在QDoubleSpinB ...
- unity openxr导致导致程序崩溃的一种可能
程序忽然发生了点击运行就崩溃的灾难, 崩溃无数次后从log中摘录出来的,总体来说大的error就是这些了 [XR] [38468] [15:34:14.581][Error ] xrGetSystem ...
- c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题
代码 总结下c语言中字符串数组的地址存放问题 #include <iostream> using namespace std; #include<bits/stdc++.h>i ...
最新文章
- 以太坊区块链Ethereum开发资料汇总
- R语言I绘制等高线图
- Detail-Preserving Pooling in Deep Networks
- QT的QSemaphoreReleaser类的使用
- 安装win7系统不能开机启动服务器,win7系统开机启动项不能加载的原因分析及解决...
- 如何调整标题字体大小_软网推荐:找回调整Windows 10字号功能
- 函数指针 和 函数指针数组 和 函数指针数组
- 递增运算符练习(JS)
- canvas 边界模糊_Canvas绘制线条模糊的解决方案
- Windows Servers2019没有无线网卡驱动
- element引入的组件大小高度不对_ElementUI 在 按需引入时定义 default size?
- thinkphp5 两个控制器传参数_PID参数整定:看大神是如何整定参数
- csdn博客登录不上-why?
- 绘制AutoCad中的曲线(Curve)
- 万年历的c语言程序代码含节假日,用C语言编写的万年历程序代码
- 联合概率分布与边缘分布
- Mysql8.x主从基础同步
- Dedecms 前端RCE分析
- 大数据高频面试题总结
- 隐藏IP的功能和原理