内存分配和免费

时间:2011-03-11 13:15:18

标签: c windows winapi memory memory-leaks

是否可以通过任何Windows API分配7个字节的内存并释放前3个字节以形成4个字节的块。

3 个答案:

答案 0 :(得分:3)

您可以使用memmove()将最后四个字节移动到已分配块的开头,然后使用realloc()将其缩小到四个字节。

但你为什么要这样做?您总是可以使用另一个指向malloced内存最后四个字节的指针,如下所示:

typedef unsigned char uint8;

uint8* psevenbytes = (uint8*)malloc(sizeof(uint8) * 7);

if (psevenbytes != NULL)
{
    uint8* pfourbytes = psevenbytes + 3;

    // ... do stuff

   free(psevenbytes);
   psevenbytes = NULL;
}

或者您可以使用struct

答案 1 :(得分:2)

没有。 Windows堆分配API需要返回自然对齐的值(换句话说,块地址%sizeof(void *)== 0)。对于32位处理器,这意味着每个分配都是4字节对齐的。如果有一种方法可以做你想要的,那么新重新分配的块将在3字节边界上对齐(初始的7字节块将在4字节边界上对齐,添加3个字节会产生3字节对齐的指针。

正如其他人所建议的,复制内存可以让你最接近你的要求。但是会有一些与之相关的性能成本。

答案 2 :(得分:1)

没有

但你可以很好地使用memmove和realloc来减少使用的内存量:

memmove(ptr, ptr + 3, 4);
ptr = realloc(ptr, 4)

但这很可能比仅将内存保持在初始大小要慢。