首页 > 解决方案 > “半释放”一块内存来缩小它是否安全?

问题描述

有人告诉我,即使它是安全的,这绝对是不好的做法。我的问题是,这样做真的安全吗,还是完全未定义的行为?假设我分配了一个 100 字节的内存块,但我想将其缩小到 50。将 50 添加到指针并释放它是否安全?这是代码中的示例:

char *ptr = malloc(100);
//...
free(ptr+50);
//Presumably, since I freed the second half only, would that be equivalent to ptr = realloc(ptr, 50);?

这是跨平台/未定义的行为吗?使用这种缩小内存的方法安全吗?

标签: cmemory-managementmallocheap-memoryfree

解决方案


您只能传递给freemalloc, realloc, . 返回的指针calloc。传递其他任何东西都是未定义的行为

C 标准的第 7.22.3.3p2 节关于free函数状态:

free函数使 所指向的空间ptr被释放,也就是说,可用于进一步分配。如果 ptr是空指针,则不执行任何操作。 否则,如果参数与内存管理函数先前返回的指针不匹配,或者如果空间已通过调用freeor被释放realloc,则行为未定义。

正确的做法是分配一个新的内存块,memcpy用于复制字节和free旧块。


推荐阅读