realloc分配失败内存释放问题:为何需要使用tokens_backup变量?
问题解答
为什么需要定义tokens_backup变量
核心原因和realloc的API特性直接相关:
- 当
realloc申请新内存失败时,会返回NULL,但传入的原有内存块不会被自动释放,仍然处于有效可访问的状态。 - 代码中直接把
realloc的返回值赋值给了原指针tokens,如果realloc失败返回NULL,会直接覆盖tokens原本存储的旧内存地址,导致旧内存的地址彻底丢失,后续再也无法找到并释放这块内存,造成内存泄漏。 tokens_backup的作用就是在调用realloc前提前备份旧内存的地址,一旦realloc分配失败,还能通过备份的地址找到旧内存完成释放。
realloc分配错误时能不能直接释放原tokens内存
不能,原因如下:
- 走到
if (!tokens)的判断分支时,tokens已经被realloc的返回值也就是NULL覆盖了,此时tokens已经不指向原来的内存块,直接调用free(tokens)等价于free(NULL),不会产生任何释放内存的作用,原来的内存块会一直泄漏无法回收。 - 只有通过提前备份的
tokens_backup才能拿到旧内存的正确地址,完成释放操作。
内容的提问来源于stack exchange,提问作者hendrix
相关产品推荐
相关产品推荐

