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

文章目录

  • 前言
  • 一、问题点
    • 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值进行比较。
空指针不应与未初始化的指针混淆:保证空指针与指向有效对象的任何指针进行比较。但是,根据语言和实现,未初始化的指针可能没有任何此类保证。它可能与其他有效指针相等; 或者它可能比较等于空指针。它可能在不同的时间做两件事。
(仍然需要深入了解)

总结

善于总结,多进一步。

QT--内存错误导致程序崩溃相关推荐

  1. 服务器内存不足导致程序(tomcat)崩溃

    服务器内存不足导致程序(tomcat)崩溃 场景 场景 在同一台服务上部署了多个tomcat,每个tomcat上都运行项目: 通过命令netstat -ntlp查看运行的java进程及对应的端口信息 ...

  2. goroutine中使用recover,解决协程中出现panic,导致程序崩溃的问题。recover panic 协程的错误处理

    package mainimport ("fmt""time" )//goroutine中使用recover,解决协程中出现panic,导致程序崩溃的问题. f ...

  3. OpenCV中waitKey()函数失效问题汇总(按键失效、按键不灵、按键导致程序崩溃)

    提示:阅读文章,大约需要3分钟 问题描述 在使用OpenCV编程的时候,我们经常会使用按键等待函数:waitKey(),大家可能会用它来作为 延迟.等待用户输入按键的功能使用,以下列出了在使用过程中遇 ...

  4. laravel清理缓存(config:clear)后导致程序崩溃

    laravel清理缓存(config:clear)后导致程序崩溃 前情提要:导致这个错误的可能性有很多,如此不人性化的提示是因为在config:clear后laravel重载出错,然后尝试从log输出 ...

  5. NodeJS 导入包的时候出现的 @types 错误导致程序无法运行

    在一次开发 NodeJS 项目的时候,我们希望包的导入是用 import 导入的方式. 但是在具体导入的时候发现是使用 @types 导入的. 如果上面的图显示的导入方式,结果结果是导致程序错误无法运 ...

  6. MFC使用GetDlgItem获取控件导致程序崩溃的问题

    对于MFC窗口,在没有被创建完成时,是无法获取控件资源的.如果将GetDlgItem写在窗口类构造函数中,就会导致程序崩溃 正确方法是将GetDlgItem放在窗口类的OnInitDialog函数中执 ...

  7. java调用dll报内存溢出错误或者程序崩溃

    因为业务需要,需要用Java去调用dll动态库来分析图片,结果调用后导致程序内存溢出,或者直接崩溃:再经过反复检查后,发现本身的我写的java代码并没有问题,最终去验证图片的时候: 1.图片访问不到, ...

  8. QT多线程网络编程程序崩溃问题与解决

    环境:Ubuntu14.04,Qt5.5 平台:QtCreator 场景:有以下三个线程:1.gstreamer循环取摄像头视频帧,25fps:2.HTTP循环请求消息并显示在QDoubleSpinB ...

  9. unity openxr导致导致程序崩溃的一种可能

    程序忽然发生了点击运行就崩溃的灾难, 崩溃无数次后从log中摘录出来的,总体来说大的error就是这些了 [XR] [38468] [15:34:14.581][Error ] xrGetSystem ...

  10. c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题

    代码 总结下c语言中字符串数组的地址存放问题 #include <iostream> using namespace std; #include<bits/stdc++.h>i ...

最新文章

  1. 以太坊区块链Ethereum开发资料汇总
  2. R语言I绘制等高线图
  3. Detail-Preserving Pooling in Deep Networks
  4. QT的QSemaphoreReleaser类的使用
  5. 安装win7系统不能开机启动服务器,win7系统开机启动项不能加载的原因分析及解决...
  6. 如何调整标题字体大小_软网推荐:找回调整Windows 10字号功能
  7. 函数指针 和 函数指针数组 和 函数指针数组
  8. 递增运算符练习(JS)
  9. canvas 边界模糊_Canvas绘制线条模糊的解决方案
  10. Windows Servers2019没有无线网卡驱动
  11. element引入的组件大小高度不对_ElementUI 在 按需引入时定义 default size?
  12. thinkphp5 两个控制器传参数_PID参数整定:看大神是如何整定参数
  13. csdn博客登录不上-why?
  14. 绘制AutoCad中的曲线(Curve)
  15. 万年历的c语言程序代码含节假日,用C语言编写的万年历程序代码
  16. 联合概率分布与边缘分布
  17. Mysql8.x主从基础同步
  18. Dedecms 前端RCE分析
  19. 大数据高频面试题总结
  20. 隐藏IP的功能和原理

热门文章

  1. vs 2017官网下载、QT下载
  2. 为什么float只有四个字节,存储范围却大于有八个字节的long类型?
  3. Linux开发环境搭建之cmake安装
  4. i2c-tools 编译安装和使用
  5. 解决microsoft visual c++ build tools安装包丢失或损坏
  6. WinRAR去除广告弹窗(完整版)
  7. Winform开发技术详解 - 应用环境 相关技术介绍
  8. PPT精典基础教程 .
  9. ztree 右键菜单功能
  10. java 中uuid生成算法_UUID生成算法,UUID还是snowflake