似乎无法在别处找到我的问题的答案。
考虑代码:
int *ptr = malloc (sizeof (*ptr));
int *dummyPtr = ptr;
free (dummyPtr);
printf ("ptr: %p, dummy: %p\n", ptr, dummyPtr);
据我了解,free()
接受指针并指向NULL
又名(nil)
。即,指针被解除引用并且无处可指。这意味着指针指向的内存被有效擦除。
这个问题的两个部分:
dummyPtr
似乎仍然指向内存中的地址,而不是(nil)
。为什么?ptr
会怎样?它仍会指向那块内存还是已被解除引用?我运行此代码和一些变体几次,结果相互矛盾。有时只有副本受影响,有时两者都受影响。有时指向的值甚至设置为零!
坦率地说,我不知道发生了什么。 (我正在运行Debian,如果这有所不同。)答案 0 :(得分:4)
free
未将指针设置为NULL,或擦除任何内存。相反,它将指针指向的内存块标记为空闲(即未分配)。
调用free(dummyPtr)
后,ptr
和dummyPtr
现在都是无效指针,因为它们没有指向已分配的内存块。
您的printf
行会因使用无效指针而导致未定义的行为。当undefined behaviour发生时,所有赌注都已关闭。
标准参考:C11 6.2.4 / 2
当指针变为不确定时,指针的值变得不确定 它指向(或刚刚过去)的对象到达其生命周期的末尾。
附件J.2:
在以下情况下,行为未定义:
- 具有自动存储持续时间的对象的值在不确定时使用
答案 1 :(得分:2)
free()函数释放ptr指向的内存空间 必须由之前调用malloc(),calloc()或 realloc的()。否则,或者如果之前已经调用过free(ptr), 发生未定义的行为。如果ptr为NULL,则不进行任何操作 进行。
你在哪里得到free
将指针设置为NULL
- 它没有。如果你想重用指针,这是你的工作。如果你没有重复使用它,那么它指向的地方没有任何区别。
答案 2 :(得分:1)
了解free()
void free(void *ptr)
函数不可能将ptr更改为指向NULL,即使它想要,ptr只是复制到函数中,因此它只能释放ptr指向的内容。
为了免费更改它需要像
这样的原型void free(void **ptr)
一旦使用ptr指向的内存指针调用了free,因为内存已经返回给操作系统。
答案 3 :(得分:0)
Dummyptr仍然保留旧的内存位置。在释放后,prt和dummyptr都会花费,不应该被解除引用,因为这会导致未定义的行为。