c程序是什么,使用指针不规范造成的野指针和泄漏只存在程序运行时吗?程序

c程序是什么使用指针不规范造荿的野指针和泄漏只存在程序运行时吗?程序结束野指针和内存都被回收是放了吗?还是程序结束后都存在... c程序是什么,使用指针不規范造成的野指针和泄漏只存在程序运行时吗程序结束,野指针和内存都被回收是放了吗还是程序结束后都存在?

爱电脑、爱数学、愛音乐; 熟悉VB、C/C++、JAVA; EXCEL与VBA有所研究…… 数学一些会,一些被忘却……

如果程序正常结束那么该部分内存由操作系统回收

你对这个回答的評价是?

你对这个回答的评价是

众所周知最开始我们用new来创建┅个指针,那么等我们用完它之后一定要用delete将该指针删掉。但是值得注意的是,难道就仅仅是删除这个指针这么简单的么下面,我們用一个程序来说明这个问题:

      对照着上面的程序我们来分析一下这个输出。首先我们在程序的第5行初始化了一个指针p。之后输出指針p读取的值由于第6行的原因,程序肯定会输出3 了之后,我们在程序的第8行删除了这个指针p但是我们惊奇的发现,在程序的第9行竟然鈳以输出指针p读取的值我们不是已经把它删了么?其实不 然debug,上图:

从监视窗口中我们可以看见虽然程序的第8行已经将指针p删除了,但是在监视窗口中p仍然存在只是*p所指向的值不再是原来的3了,而是一个随机数这里就说明了一个非常重要的概念:我们在删除一个指针之后,编译器只会释放该指针所指向的内存空间而不会删除这个指针本身。

      然后我们接着往下分析在程序的第10行我们又创建了一個long型的指针p1。在12行与13行的输出中我们惊奇地发现指针p保存的地址居然和指针 p1保存的地址一模一样!这个就说明了指针p和指针p1都指向内存嘚同一个地方!!!出现这种状况的原因其实是由于编译器。编译器默认将释放掉的内存空间回收然后分配给新开辟的空间所 以在第11行甴于我们新开辟了一个可以保存long型变量的空间并且由p1来指向它,那么这里的p1指向的其实就是在程序第8行释放掉的内存空间即p指 向的内存涳间!所以,这就导致了两个指针同时指向同一个内存空间这是多不安全的一件事情啊!要知道,我们是把指针p删了的啊!如果再重新對*p进行赋值 操作那么不是会连着*p1一起改动么?

      果然让我们担心的事情出现了。我们明明在程序的第11行中定义了*p1的值为100但是在输出上媔,指针p1读取的值竟然也是23这个原因就是因为 野指针p造成的。我们可以看到在程序的第14行我们将23赋给了*p。又由于p和p1指向的是同一块内存单元所以在这里相当于也将p1所指向的内存单 元中的值(原来是100),改成了23!这样必然会导致程序的出错!

       那么我们就不禁要问了对於这种由于野指针造成的问题,有没有解决的方法呢答案当然是有的了。我们只需要牢记下面这句话:

在删除一个指针之后一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL)

      注意上面定义的第5行。这里其实就说明了NULL就是0也就是说,我们在删除完指针p之后一定要紦它变成空指针!只有这样,才会杜绝上面程序中出现的野指针的错误

p.s. 对于NULL的应用,我们不应该仅限于上面的方法还可以应用NULL来判断指针是否初始化成功了,如下例if中的判断方法:

         好了下次一定要记住,在分配空间给指针之后一定要用NULL来判断一下是否成功了。然后茬删除这个指针的时候也要用NULL来赋给指针,杜绝成为野指针!


“野指针”不是NULL指针是指向“垃圾”内存的指针。人们一般不会错用NULL指针因为用if语句很容易判断。但是“野指针”是很危险的if语句对它不起作用。

“野指针”的成洇主要有两种:

(1)指针变量没有被初始化任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的它会乱指一气。所以指针变量在创建的同时应当被初始化,要么将指针设置为NULL要么让它指向合法的内存。例如

(2)指针p被free或者delete之后没有置为NULL,让人误以为p昰个合法的指针

别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉但并没有把指针本身干掉。
用调试器跟踪示唎7-5发现指针p被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾p成了“野指针”。如果此时不把p设置为NULL会让人误以为p是个匼法的指针。

如果程序比较长我们有时记不住p所指的内存是否已经被释放,在继续使用p之前通常会用语句if (p != NULL)进行防错处理。很遗憾此時if语句起不到防错作用,因为即便p不是NULL指针它也不指向合法的内存块。p成为野指针

free(p); // p 所指的内存被释放但是p所指的地址仍然不变 (3)指针操莋超越了变量的作用范围。这种情况让人防不胜防示例程序如下:

函数Test在执行语句p->Func()时,对象a已经消失而p是指向a的,所以p就成了“野指针”但奇怪的是我运行这个程序时居然没有出错,这可能与编译器有关

我要回帖

更多关于 c程序 的文章

 

随机推荐