You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

释放指针后能否再次对其调用malloc()或calloc()?

关于free后复用指针调用malloc/calloc的安全性

我们都知道,绝对不能访问已经被释放的内存,比如下面的代码会直接导致数据损坏:

int * x = calloc(10, sizeof(int));
free(x);
x[0] = 2; // 会造成数据损坏

很多文章提到不应重用已释放的指针,但这里的“重用”指的是直接使用指针指向的旧内存地址,而非重新给指针变量分配新的内存空间。

直接在free后调用malloc/calloc是安全的

你提到的这种写法完全没问题:

int * x = calloc(10, sizeof(int));
free(x);

x = calloc(10, sizeof(int));
x[0] = 2;

当你再次调用calloc时,会重新向内存管理器申请一块新的可用内存,并将这块内存的地址赋值给指针x。此时x指向的是全新的、未被占用的内存区域,对它进行读写操作是安全的,和第一次分配内存的行为没有区别。

中间有其他操作的情况依然安全

即使free(x)之后执行了其他代码,导致原来的内存地址被其他变量占用,后续再调用calloc给x赋值的操作依然安全:

int * x = calloc(10, sizeof(int));
free(x);

// 这里执行其他操作,原地址可能被占用
... 

x = calloc(10, sizeof(int));
x[0] = 2; 

内存管理器会自动找到当前可用的内存块分配给你,新的地址和之前释放的地址是否重合完全由内存管理器决定,但无论是否重合,x都会被更新为新分配内存的有效地址,你操作的始终是合法的内存空间,不会出现访问非法内存的问题。

总结一下:禁止的是“重用已释放指针指向的旧内存”,而不是“复用指针变量本身去申请新内存”,后者是完全安全且常见的编程实践。

内容的提问来源于stack exchange,提问作者wjtwise

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 07:57:03