free 不会删除分配给指针(int 数组)的内存,使用 free 两次可以工作,为什么?

2024-04-08

这是出于好奇,我试图找到我对之前问题的疑问的答案,但他们似乎没有答案。所以在这里询问,我刚刚编写了一段代码,试图将内存分配给 int 指针(以填充数组)并扫描 int 值。一旦我完成了数组,我想删除分配给指针的数据/内存。尽管我的代码工作正常并且一切正常,但为什么即使在 free 之后我仍然能够看到 int 数组内的值ing指针。然而,如果我使用 free 两次,它会抛出一个错误(这是在使用一次 free 后预期的)。这不是一种奇怪的行为吗?我在我的 mac 上使用 Xcode 也在 codechef 上尝试过,同样的行为,为什么?

int *num=(int *)malloc(n*sizeof(int));
int i;
for(i=0;i<n;i++)
{
    scanf("%d",&num[i]);        
}    

for(i=0;i<n-1;i++){
    temp = some_function(x);        
}

free(num); 

for(i=0;i<n;i++)
{
    printf("\nnum[%d]= %d\n",i,num[i]);        
}

上面的代码打印 num[] 内的值,理想情况下它不应该打印。


这并不奇怪,也不错误。打电话时free在指针上,您只需告诉内存管理器它可以再次将这部分内存重新用于另一部分malloc称呼。它不会删除内容(这将花费额外的时间且没有任何功能)。但是你can访问它,因为指针仍然指向有效地址。它导致未定义的行为不过,因为内存管理器可以将该内存分配给其他代码段。

Calling free第二次可能会生成错误,因为内存管理器不再知道该指针是否有效(您只需freed它!)。事实上,这是未定义的行为.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

free 不会删除分配给指针(int 数组)的内存,使用 free 两次可以工作,为什么? 的相关文章

随机推荐