C free()分配内存两次,会导致段错吗?

时间:2014-03-17 09:55:00

标签: c malloc core

如果我们两次释放()使用malloc()分配的相同char指针,它会导致segfalut吗?

void Allocate() 
{     
   char *y;
   y = (char *) malloc (sizeof(char) * 200);    
   free (y);
   strcpy(y,"helloworld");
   free (y);
}

int main()
{
     Allocate();
     return 0;
}

3 个答案:

答案 0 :(得分:2)

这是未定义的行为,所以不要这样做。

更重要的是,在调用free()后,不要使用内存,这是完全禁止的:

free (y);
strcpy(y,"helloworld");

以上是 未定义的行为。

另外,don't cast the return value of malloc() in C

答案 1 :(得分:0)

将相同的内存释放两次将导致未定义的行为,写入已释放的内存(请参阅strcpy)。

C标准将第1.3.2节中的未定义行为定义为

  

行为,例如在使用错误的程序结构或错误数据时可能出现的行为,本国际标准没有规定[3]。

     

当本国际标准忽略任何明确的行为定义的描述时,也可能会出现未定义的行为。

     

(3)=允许的未定义行为范围从完全忽略不完全结果的情况到在翻译或程序执行期间以环境特征(有或没有发出诊断消息)的文档化方式表现,终止翻译或执行(发布诊断信息)。

至于发生了什么我会猜到以下几点:

  1. 您可以免费y

  2. 然后strcpy了解曾经y可能会破坏堆的内容;这本身不太可能是段错误,但可能(见上文)

  3. 然后分配z,它使用可能已损坏的堆,并且可能会段错误或错误分配内存(即返回一个无法使用的地址)。

  4. 然后你strcpy进入一个可能错误分配的内存,因此可能会出现段错误。

  5. 然后再次使用可能已损坏的堆释放y,这可能会出现段错误等。

  6. 如果您真的想知道,请使用调试libcgdb查找。

答案 2 :(得分:0)

两次释放相同的指针可能会导致堆损坏。在解除分配后的程序中,您正在尝试复制一个会导致段错误的字符串。