当前位置:  开发笔记 > 编程语言 > 正文

ptr为NULL的free(ptr)是否会损坏内存?

如何解决《ptr为NULL的free(ptr)是否会损坏内存?》经验,为你挑选了7个好方法。

从理论上讲,我可以这么说

free(ptr);
free(ptr); 

是一个内存损坏,因为我们释放已经释放的内存.

但是如果

free(ptr);
ptr=NULL;
free(ptr); 

由于操作系统将以不确定的方式运行,我无法对此进行实际的理论分析.无论我在做什么,这种记忆是否会腐败?

释放空指针有效吗?



1> Gregory Pako..:

7.20.3.2 free功能

概要

#include  
void free(void *ptr); 

描述

free函数使得指向的空间ptr被释放,即可用于进一步分配.如果ptr是空指针,则不执行任何操作.

见ISO-IEC 9899.

话虽这么说,当你在野外查看不同的代码库时,你会注意到人们有时会这样做:

if (ptr)
  free(ptr);

这是因为一些C运行时(我肯定记得在PalmOS上就是这种情况)在释放NULL指针时会崩溃.

但是现在,我认为free(NULL)根据标准的指示,假设是一个nop是安全的.


不,ptr = NULL无法替代free(ptr),两者完全不同
@WereWolfBoy他的意思是通过在调用`free()之前测试指针`NULL`来避免`free(NULL)`
不,这意味着`free(ptr)`其中`ptr`为null没有副作用.但无论如何,使用`malloc()`或`calloc()`分配的每个内存必须在使用`free()之后释放.
ptr = NULL确保即使您意外地调用free(ptr),您的程序也不会出现段错误.
请注意,虽然C标准说它是无操作,但这并不意味着每个C库都会像这样处理它.我已经看到免费崩溃(NULL),所以最好避免首先调用free.

2> R Samuel Kla..:

所有符合标准的C库版本都将free(NULL)视为no-op.

也就是说,曾经有一些版本的免费版本会免费崩溃(NULL),这就是为什么你会看到一些防御性编程技巧的建议:

if (ptr != NULL)
    free(ptr);


@Tomas - 我从不建议改变风格,我只是解释了为什么你仍然可以在某些风格中看到这个推荐.
-1 [需要引证].由于一些陈旧的传闻实现的理论而改变代码风格是一个坏主意.
@Tomas:问题在于版本7 Unix.当我学习时,free(xyz)其中xyz == NULL是我学习的机器上的即时灾难的一个秘诀(ICL Perq运行PNX,它基于版本7 Unix和一些System III附加功能).但是我很长时间没有用这种方式编码.
@Tomas 3BSD(http://www.winehq.org/pipermail/wine-patches/2006-October/031544.html)和PalmOS for two(两者都是第二手).
Netware也因释放NULL而崩溃...(只是调试了崩溃而已...)

3> Michael Krel..:

如果ptr为NULL,则不执行任何操作.

说文件.


本杰明,这正是它的含义.如果它知道参数的无效性,你会期望它执行什么?

4> 小智..:

我记得在PalmOS上工作过free(NULL).


有趣 - 这使得第二个平台(在3BSD之后)崩溃.

5> Prasoon Saur..:
free(ptr);
ptr=NULL;
free(ptr);/*This is perfectly safe */

您可以安全地删除NULL指针.在这种情况下不会执行任何操作.换句话说,free()对NULL指针不执行任何操作.



6> stefanB..:

推荐用法:

free(ptr);
ptr = NULL;

看到:

man free

     The free() function deallocates the memory allocation pointed to by ptr.
     If ptr is a NULL pointer, no operation is performed.

将指针设置为NULL之后free(),可以free()再次调用它并且不执行任何操作.


这也有助于发现调试器的段错误.很明显,p-> do()与p = 0的段错误是使用释放指针的人.在调试器中看到p = 0xbfade12时不太明显:)

7> n0rd..:

free(NULL)在C语言中是完全合法的,delete (void *)0并且delete[] (void *)0在C++中是合法的.

顺便说一下,释放内存两次通常会导致某种运行时错误,所以它不会破坏任何东西.


在C ++中,“删除0”是非法的。`delete`明确需要一个指针类型的表达式。将“删除”应用于类型化的空指针值是合法的,但不适用于“ 0”(而不是“ NULL”)。
推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有