为什么不释放不清除指针值?

问题描述 投票:1回答:4

[我试图向朋友解释免费的工作原理,所以我想到了下面的代码示例尝试对其进行解释(我知道,很复杂):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{

  char *stringPtr = NULL;

  //Pass the size of the string in bytes to malloc
  stringPtr = (char *)malloc(10 * sizeof(char));

  strcpy(stringPtr, "A String. ");
  printf("%s", stringPtr);
  free(stringPtr);

  printf("%s", stringPtr);

  return 0;
}

[认为这段代码将释放分配在堆上的内存,我假设如果我随后打印出分配给指针的字符串,那么它将做一些奇怪的事情或使程序崩溃,因为我认为它将尝试输出一个空值;但是,当我运行它时,它最终只输出了两次字符串。我想我会逐步了解它的原因,因为在我看来,也许它将字符串复制到堆栈或其他内容中,然后指针将指向一个新的内存地址,而旧内存毕竟被清理了(并不是那种情况会有意义,但是,嘿,我不知道那还会是什么),但是当我单步执行代码时,不仅没有释放内存,指针实际上仍然指向相同的位置。内存地址具有相同的值。

当我调查它时,人们说您需要在调用free之后为指针分配一个空值,但是我的问题是为什么?不应该只释放该内存并将指针设置为null吗?保留价值有什么意义?还是我只是不了解某事?

c pointers memory memory-management
4个回答
7
投票

不应该释放...释放该内存

假设您的公司决定移动您的工作区,因此他们为您分配了一张新办公桌,并撤消了您现有的办公桌。他们会立即清理您的旧办公桌吗?除非他们立即需要,否则可能不会。如果您回去检查抽屉,您可能会发现您留在那儿的口香糖,或者可能没有。您的空间为已分配空间,但这并不意味着它会立即为[[已清除或已消失。不再是你的空间了。

不应该释放...将指针设置为空吗?

free获取指针的副本,因为指针是按值传递的。 free无法擦除您持有指针的变量。]​​>


2
投票
成功执行malloc之后,调用进程将获得malloc返回的内存区域的所有权,并且该进程可以存储和读取此内存空间。

0
投票
free函数获取指针


0
投票
我也有同样的问题。我向我自己证明,释放指针后绝对不应该使用指针,并且确实会产生未定义的行为。有时它可以工作,有时它不起作用,并且会以一种奇怪的方式崩溃。示例如下。
© www.soinside.com 2019 - 2024. All rights reserved.