首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C++中与free()相关的查询

C++中与free()相关的查询
EN

Stack Overflow用户
提问于 2011-11-22 00:04:26
回答 5查看 216关注 0票数 3

如果您尝试释放未使用malloc/calloc分配的内存,会发生什么情况

我的意思是:

代码语言:javascript
代码运行次数:0
运行
复制
void main()
{
int temp = 0;
int *ptr = &temp;
free(ptr);
}

我以为free()会返回一些错误代码,但是free()没有返回值。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-11-22 00:07:16

如果你在之前没有分配的指针上调用free(),它将触发未定义的行为。

来自Linux man pages

函数释放ptr指向的内存空间,这些内存空间必须是由先前调用malloc()、calloc()或realloc()返回的。否则,或者如果之前已经调用了free(ptr),则会发生未定义的行为。如果ptr为NULL,则不执行任何操作。

票数 8
EN

Stack Overflow用户

发布于 2011-11-22 00:22:07

添加到Malcolm's answer:这是ISO/IEC9899:1999,7.20.3.2未定义的行为:

否则,如果参数与

mallocrealloc函数先前返回的指针不匹配...行为是未定义的。

请参阅此处的标准草案:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

票数 4
EN

Stack Overflow用户

发布于 2011-11-22 00:21:45

我对上面的代码做了一点扩展:

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
#include <stdlib.h>

void main()
{
  int temp = 0;
  int *ptr = &temp;
  printf("Before: %0X\n", ptr);
  free(ptr);
  printf("After: %0X\n", ptr);
  getchar();
}

如果此代码是由Visual Studio2010编译的,则在调试配置中,调用free会启动“调试断言失败”消息。此错误消息来自dbgheap.c:

代码语言:javascript
代码运行次数:0
运行
复制
/*
 * If this ASSERT fails, a bad pointer has been passed in. It may be
 * totally bogus, or it may have been allocated from another heap.
 * The pointer MUST come from the 'local' heap.
 */
_ASSERTE(_CrtIsValidHeapPointer(pUserData));

使用MinGW-GCC编译,生成的exe运行时没有错误( "After:...“行显示与“之前:...”相同的ptr值。行)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8214692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档