C free()分配了两次内存,是否会导致segfault?
如果我们两次释放()与malloc()分配的同一个字符指针,会导致segflut吗C free()分配了两次内存,是否会导致segfault?,c,malloc,core,C,Malloc,Core,如果我们两次释放()与malloc()分配的同一个字符指针,会导致segflut吗 void Allocate() { char *y; y = (char *) malloc (sizeof(char) * 200); free (y); strcpy(y,"helloworld"); free (y); } int main() { Allocate(); return 0; } 这是未定义的行为,所以不要这样做 更重
void Allocate()
{
char *y;
y = (char *) malloc (sizeof(char) * 200);
free (y);
strcpy(y,"helloworld");
free (y);
}
int main()
{
Allocate();
return 0;
}
这是未定义的行为,所以不要这样做 更重要的是,在调用
free()
后不要使用内存,这是一个完全不允许的情况:
free (y);
strcpy(y,"helloworld");
以上也是未定义的行为
另外,.两次释放同一内存将导致未定义的行为,写入已释放的内存也会导致未定义的行为(请参见
strcpy
)
C标准将§1.3.12节中未定义的行为定义为:
使用错误的程序结构或错误的数据时可能出现的行为,本国际标准对此不作要求[3]
当本国际标准省略任何明确的行为定义时,也可能出现未定义的行为
(3) =允许的未定义行为范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境特有的文件化方式(发出或不发出诊断消息)行为,到终止翻译或执行(发出诊断信息)
至于发生了什么,我猜如下:
y
y
执行strcpy,这可能会损坏堆;这本身不太可能发生故障,但可能(见上文)z
,这会使用可能已损坏的堆,并可能导致内存错误或分配错误(即返回无法使用的地址)strcpy
插入可能分配错误的内存位,从而可能导致故障y
,释放的堆可能已损坏,可能会出错等如果您真的想知道,请使用debug
libc
和gdb
找出答案。释放同一指针两次可能会导致堆损坏。在取消分配后的程序中,您试图复制一个字符串,这将导致segfault。我检查过它不会转储内核。@mangusta:自检会验证特定编译器的某些内容呃,在一个特定的月球阶段。有时这就足够了,其他时候最好检查一下标准(或其他)。在我的应用程序中,我得到了核心转储,但在这个示例代码中,我没有得到核心转储。@Jeyamaran是的,那是因为未定义的行为。你不能依赖于得到任何特定的结果。它是未定义的。清楚吗?哦,但在某些情况下,它肯定会正确创建核心转储。但我没有得到任何核心转储。我尝试了各种方法,但没有得到核心转储即使是一次转储。你可以在这里找到如何启用核心转储。永远不能保证你会因为违反了程序的内存而得到一个核心转储。我已经知道了这些东西。但我只需要它在任何情况下都会进行核心转储。问题是“它会导致segfalut”(原文如此),而不是“它会导致核心转储吗”.Segfaults并不总是导致核心转储。在运行它以获得核心转储之前,必须执行(依赖操作系统)ulimit-c unlimited
。