释放指针后能否再次对其调用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
相关产品推荐
相关产品推荐

