繁体   English   中英

内存分配和空闲

[英]Memory allocation and free

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

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

但是你为什么要呢? 您总是可以像这样用另一个指针指向已分配内存的最后四个字节:

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

否。需要Windows堆分配API返回自然对齐的值(换句话说,块地址%sizeof(void *)== 0)。 对于32位处理器,这意味着每个分配都是4字节对齐的。 如果有一种方法可以完成所需的操作,则新分配的块将在3字节边界上对齐(初始的7字节块将在4字节边界上对齐,添加3字节将创建3字节的对齐指针。

正如其他人所建议的那样,向下复制内存可以使您最接近您的要求。 但与此相关的是一些性能成本。

没有。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM