在C中释放指向malloc'd内存的指针副本
似乎在别处找不到我问题的答案 以代码为例:在C中释放指向malloc'd内存的指针副本,c,pointers,copy,malloc,free,C,Pointers,Copy,Malloc,Free,似乎在别处找不到我问题的答案 以代码为例: int *ptr = malloc (sizeof (*ptr)); int *dummyPtr = ptr; free (dummyPtr); printf ("ptr: %p, dummy: %p\n", ptr, dummyPtr); 据我所知,free接收一个指针,并使它指向NULL,也称为nil。也就是说,指针被取消引用并且不指向任何地方。这意味着指针指向的内存被有效擦除 这个问题分为两个部分: 如果我运行上面的代码,dummyPtr
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,如果这有区别的话
free函数释放ptr指向的内存空间,这
必须由以前调用malloc、calloc或
realloc。否则,或者如果之前已调用freeptr,
出现未定义的行为。如果ptr为NULL,则不执行任何操作
表演
你从哪里得到的自由设置指针为空-它没有。如果要重用指针,这就是您的工作。如果您没有重用它,那么is对它指向的位置没有影响。Dummyptr仍然保留旧的内存位置。在空闲时间之后,prt和dummyptr都将失效,不应取消引用,因为这将导致未定义的行为 free不会将指针设置为NULL,也不会擦除任何内存。相反,它将指针指向的内存块标记为空闲,即未分配 调用freedummyPtr后,ptr和dummyPtr现在都是无效指针,因为它们不指向分配的内存块 printf行使用无效指针导致未定义的行为。当事情发生时,所有的赌注都没有了 标准参考文献:C116.2.4/2 指针的值在以下情况下变得不确定: 它指向或刚刚经过的对象将达到其生命周期的终点 附件J.2: 在以下情况下,该行为未定义: 具有自动存储持续时间的对象的值在不确定时使用
要理解,请免费查看原型 函数不可能将ptr更改为point为NULL,即使它需要,ptr只是复制到函数中,因此它只能释放ptr指向的内容 为了自由改变,它需要一个像
void free(void **ptr)
一旦使用ptr指向的内存对指针调用free,则该行为是未定义的,因为内存已返回操作系统 使用%p打印未初始化的指针是否是未定义的行为?因此,如果我在ptr或dummyPtr上使用free,结果将是相同的?请参阅,特别是标题下的部分:释放内存但保留现在无效的引用如您的答案所示,但是MattMcNabb的更容易理解。这就是饼干破碎的方式:p饼干可能会破碎,也可能不会破碎;吃它只会成为一种未定义的行为。
void free(void **ptr)