[英]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.