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

Cod*_*ity 4 c arrays pointers memory-management

这是出于好奇,我试图在以前的问题上找到我怀疑的答案,但他们似乎没有答案.所以问这里,我刚写了一个代码,我试图将内存分配给一个int指针(填充一个数组)并将int值扫描给它.完成数组后,我想删除分配给指针的数据/内存.虽然我的代码工作正常,一切,为什么我仍然能看到int数组甚至是免费的后内值荷兰国际集团的指针.然而,如果我使用两次免费它会引发错误(这是在单次使用免费后预期的).这不是一个奇怪的行为吗?我在我的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]);        
}
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*chs 10

这不奇怪,也不错.当调用free指针时,您只告诉内存管理器它可以再次使用该部分内存进行另一次malloc调用.它不会删除内容(这将花费额外的时间,没有任何功能).但是,您可以访问它,因为指针仍指向有效地址.但它会导致未定义的行为,因为内存管理器可能已将该内存提供给其他一些代码.

free第二次调用会产生错误,因为内存管理器不再知道该指针是有效的(你只是free它!).实际上,这是未定义的行为.


kib*_*ibu 6

你的程序很顽皮,并且处理未定义的行为.

内存确实在第一次之后返回到系统free,它只是释放内存:

  1. 不一定清除它
  2. 并不一定会阻止您访问它

再次释放它会引发错误,因为您已经将其释放回系统.

这并不意味着你可以只是malloc记忆,free它再次,并依赖于以后仍能够访问它!

首先,您看到的行为是未定义的 - 根据C标准,您的程序并不真正有效.通过编译器,操作系统和环境的特定组合,您仍然可以在空闲后访问该内存的内容,但它可以轻松地中断.此外,"未定义的行为"允许编译器适应各种各样的恶作剧,使后来的代码完全不符合您的期望.

其次,在空闲之后的任何时刻,内存可用于后续的mallocs.因此,即使您依赖于编译器/ os /环境的行为而不是破坏免费使用后的代码,各种其他进程也可能会填充其他内容.

Use-after-free是一个非常大的nono,所以只需释放一次,永远不会访问释放的内存.

有关您可能遇到的安全问题类型,请参阅:https://cwe.mitre.org/data/definitions/416.html.