文章目录提示:本文为学习记录,若有错误,请联系作者,谦虚受教。
- 前言
- 一、问题点
- 1.C:\Program Files (x86)\SogouInput\Components\
- 2.错误 *** 作
- 3.解决方法
- 二、找出问题点
- 1.Debug
- 三、野指针和空指针
- 1.野指针
- 2.空指针
- 总结
前言
那么热的夏天,少年的后背被女孩的悲伤烫出一个洞,一直贯穿心脏。
一、问题点
之前一直编译运行成功的程序,今天重新运行时发现,程序偶然崩溃了,重新打开程序又可以运行,重复几次后又出现了程序崩溃的情况。
网上冲浪后,找到程序的问题点。
整理如下:
运行程序时出现了这个“**C:\Program Files (x86)\SogouInput\Components**”问题点,这个提示并不是搜狗输入法出现问题,而大部分是内存错误导致程序崩溃,通常是野指针或者是空指针;
如图所示:
调试错误,出现的如图所示:
该错误提示含义是:
接收到信号
由于收到来自 *** 作系统的信号,下位机停止运行。
信号名称:SIGSEGV
信号含义:分段故障
经过一系列的搜索资料以及学习前辈的文章,发现是指针问题。
划重点!!!
错误焦点:是在程序中出现了野指针,即使用了已经被释放了的对象的指针
-
内存未分配成功,却使用了它。
-
内存虽然分配成功,但是尚未初始化就使用它。
-
内存分配成功且已经初始化,但是 *** 作越过了内存的边界。
-
忘了释放内存,造成内存泄漏。
-
释放了内存,继续使用它。
(1)在使用内存前检查指针是否为NULL。
如果p是函数参数,那么在函数入口处assert(p !=NULL)进行检查。
如果用new或者malloc申请的内存,应该用if (p ==NULL) 或者 if (p !=NULL)进行防错处理。
(2)犯这种错误起因有两个,一是没有初始化的概念;二是误以为内存的缺省初值全为零,导致引用初值错误。
(例如数组)。
内存的缺省初值究竟是什么并没有统一的标准。
有时为零值,有时不为零值,宁可信其无吧。
所以,无论用何种方式创建数组,都别忘了赋初值,即便赋零值,也不要省略,不要嫌麻烦。
(3)
① 程序中对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存。
此时应该重新设计数据结构,从管根本上解决对象管理混乱局面。
② 函数的return 语句写错了,注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁了。
③ 用free或delete释放内存后,没有将指针置为NULL,导致“野指针”。
(1)在声明中找到自定义的指针,在构造函数中new出来。
(2)直接ctrl+F,“new”,找到new出来的空间,一个模块一个模块屏蔽掉,然后一个模块一个模块放出来,慢慢找到问题点。
程序太复杂的难度相当大,所以在此警醒自己,调用每一个指针的时候,都要考虑此刻它是否可能已经被释放了。
例如这次找到的问题点是自己的指针data释放后没有置为NULL,导致“野指针”。
(1)定义
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。
(2)成因
1、指针变量未初始化
任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,。
所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
如果没有初始化,编译器会报错“ ‘point’ may be uninitialized in the function ”。
2、指针释放后之后未置空
有时指针在free或delete后未赋值 NULL,便会使人以为是合法的。
别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。
此时指针指向的就是“垃圾”内存。
释放后的指针应立即将指针置为NULL,防止产生“野指针”。
3、指针 *** 作超越变量作用域
注意!!!
初始化时置 NULL。
释放时置NULL。
(1)定义
Null是在计算中具有保留的值,用于指示指针不引用有效对象。
程序通常使用空指针来表示条件,例如未知长度列表的结尾或未执行某些 *** 作; 这种空指针的使用可以与可空类型和选项类型中的Nothing值进行比较。
空指针不应与未初始化的指针混淆:保证空指针与指向有效对象的任何指针进行比较。
但是,根据语言和实现,未初始化的指针可能没有任何此类保证。
它可能与其他有效指针相等; 或者它可能比较等于空指针。
它可能在不同的时间做两件事。
(仍然需要深入了解)
善于总结,多进一步。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)