释放堆内存后将指针设置为 NULL [重复]

Posted

技术标签:

【中文标题】释放堆内存后将指针设置为 NULL [重复]【英文标题】:set pointer to NULL after free the heap memory [duplicate] 【发布时间】:2015-05-01 06:05:14 【问题描述】:

我看到了一个简单的C程序:

//create a pointer to 3 bytes on heap
char *start = malloc(3);

*start = 'u';
*(start + 1) = 'v';
*(start + 2) = 'w';

printf("%s has %zu characters.\n", start, strlen(start));

// Free the memory so that it can be reused
free(start);
//Why we need to set start = NULL if we have already freed the memory above
start = NULL;

除了最后一行 start = NULL; 之外的所有内容我都了解,为什么我们需要将其设置为 NULL?是否只是让指针指向NULL 而不是无意义的内存空间?

start = NULL; 是必须采取的行动还是必须采取的行动?

【问题讨论】:

您的代码中有错误。您的字符串不是 \0 终止的,因此 strlen 将不起作用。您应该 malloc 4 个字节并将最后一个设置为 \0 以获取长度为 3 的字符串 【参考方案1】:

你问:

start = NULL; 是必须采取的行动还是必须采取的行动?

虽然技术上没有要求,但将指针 NULL 以避免出现“悬空指针”是一种良好的编程习惯,该指针指向不再无效的内存。

如果start 变量立即超出范围(即悬空指针将立即消失),那么这是有限的值。但如果这个start 变量的范围更广,最好是NULL 它。

【讨论】:

您可能会从重复阅读答案 2 中受益。或者你可能已经知道,把东西扫到地毯下面是一种糟糕的尝试。 大声笑。这个答案很荒谬。充其量,它是一个稻草人(没有人问“如果我NULL 我的指针,这解决了我所有的双重free 问题,对吧?”)。 与特定的故障模式无关,更多的是关于是否总是在定义时将传递给 free / delete / 的指针置空是个好主意。

以上是关于释放堆内存后将指针设置为 NULL [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C 语言二级指针作为输入 ( 自定义二级指针内存 | 为 二级指针 分配内存 - 存放 一维指针 | 为每个 一级指针 分配内存 | 释放二维指针内存 )

C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针

free() 在 c 代码和代码中收集垃圾值即使在释放后将指针设置为 NULL 也不起作用

智能指针

智能指针--转

智能指针的原理和实现