将一块内存“半释放”以缩小它是否安全?

问题描述 投票:0回答:1

有人告诉我,即使它是安全的,但绝对是不正确的做法。我的问题是,这样做实际上安全吗,还是彻头彻尾的不确定行为?假设我分配了一个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);?

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

c memory-management malloc heap-memory free
1个回答
0
投票

您只能将从freemallocrealloc返回的指针传递给calloc。传递其他任何内容都是undefined behavior

关于C standard功能状态的free的第7.23.2.3p2节:

free函数使ptr指向的空格为 释放,即可供进一步分配。如果 ptr是空指针,不执行任何操作。 否则,如果 参数与先前由a返回的指针不匹配 内存管理功能,或者如果空间已被占用 通过调用freerealloc释放,行为是 未定义。

这里要做的正确的事情是分配一个新的内存块,使用memcpy复制字节,并使用free旧块。

© www.soinside.com 2019 - 2024. All rights reserved.