释放堆内存后将指针设置为 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语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针