谎言吗? free /ptr/, 在哪里 ptr 是一个 NULL 损坏的记忆?

理论上我可以这么说


free/ptr/;
free/ptr/;


这是对内存的损坏,因为我们释放已释放的内存。

但如果是什么 ...


free/ptr/;
ptr=NULL;
free/ptr/;


只要 OS 将无限期地表现,我无法为这发生这种情况进行真正的理论分析。
无论我做什么,对记忆都造成伤害吗?

允许的指针释放 NULL?
已邀请:

君笑尘

赞同来自:

7.20.3.2 功能
free


概要


#include <stdlib.h> 
void free/void *ptr/;


描述

功能
free

导致了表明的空间的事实
ptr

, 发布,即完成
可用于进一步分配。 如果一个
ptr

是一个指针 null, 然后没有任何动作发生。


http://www.open-std.org/JTC1/S ... 4.pdf
.

尽管如此,当你看看野外的各种代码基础时,你会注意到人们有时会这样做:


if /ptr/
free/ptr/;


这是由于一些事实 C runtimes /我记得它的情况是什么 PalmOS/ 当指针发布时,紧急情况会完成
NULL

.

但现在我相信你可以自信地假设这一点
free/NULL/

-这是 nop 按照标准的说明。
</stdlib.h>

裸奔

赞同来自:

图书馆的所有版本 C, 相关标准解释 free /NULL/ 作为 no-op.

尽管如此,在适当的时候有几个版本 free, 谁会崩溃 free /NULL/ , 因此,您可以看到一些保护性编程方法:


if /ptr != NULL/
free/ptr/;

诸葛浮云

赞同来自:

如果一个 ptr 掠夺 NULL, 不执行该操作。

文献说。

小姐请别说爱

赞同来自:

我记得它是如何工作的 PalmOS, 爆发的地方
free/NULL/

.

二哥

赞同来自:

free/ptr/;
ptr=NULL;
free/ptr/;/*This is perfectly safe */


您可以安全地删除指针 NULL. 在这种情况下,未执行操作。 换一种说法, free// 对指针没有任何东西 NULL.

裸奔

赞同来自:

推荐用途:


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//

, 没有执行操作。

涵秋

赞同来自:

free/NULL/

完全合法 C 也
delete /void */0


delete[] /void */0

合法B. C++.

BTW, 内存释放两次通常会导致执行时间的一些错误,因此它不会损坏任何内容。

小明明

赞同来自:

free /ptr/ 保存B. C, 如果一个 ptr 掠夺 NULL, 然而,大多数人不知道 NULL 它不应该等于 0. 我有一个古老的学校的一个很好的例子:上 C64, 通过地址 0, 有一个IO端口。 如果你写了一个程序 C 要访问此端口,您需要指针,其值相等 0. 然后是图书馆 coresponding c 必须区分 0 和 NULL.

尊敬

喜特乐

赞同来自:

没有损坏内存,但行为取决于实现。
根据标准,这应该是法律代码。

小姐请别说爱

赞同来自:

ptr 指定一些内存区域,让我们说 0x100.

当你豁免时 /ptr/, 主要是你允许 0x100 用于另一个活动或过程的内存管理器,简单的单词这是资源的解放。

当你做的时候 ptr=NULL, 你在一个新的地方制作一个ptr点/让我们不要担心什么是 NULL/. 与此同时,您丢失了内存跟踪 0x100. 这就是记忆泄漏的原因。

因此,不建议使用 ptr=NULL 在有效 ptr.

相反,您可以使用一些安全检查 :

如果一个/ptr != NULL/
{free/ptr/;}

当你豁免时 /ptr/, 在哪里 ptr 已经表明了 NULL, 它没有履行 operation.So, 这是安全的。

要回复问题请先登录注册