假设我有一个分配给4096字节的指针。如何释放C中的最后1024个字节?在C ++中怎么样?相反,如果我想释放第一个 1024个字节,并保留其余部分(使用两种语言),该怎么办?如何从中间解除分配(在我看来,这需要将它分成两个指针,在解除分配的区域之前和之后)。
答案 0 :(得分:12)
不要尝试并猜测内存管理。它通常比你聪明; - )
你唯一能做到的就是第一个'解除分配'最后1K
的场景char * foo = malloc(4096);
foo = realloc(foo, 4096-1024);
然而,即使在这种情况下,也没有保证“foo”不会改变。您的整个4K可能会被释放,而realloc()可能会将您的记忆移动到其他位置,从而使您可能拥有的任何指针无效。
这对C和C ++都有效 - 但是,在C ++中使用malloc()是一种糟糕的代码味道,大多数人都希望你使用 new()来分配存储空间。并且使用new()分配的内存不能被realloc()编辑 - 或者至少不是以任何可移植的方式。 STL向量在C ++中是一种更好的方法
答案 1 :(得分:5)
你没有“分配一个指针来保存4096字节”,你有一个指向4096字节的已分配块的指针。
如果您的区块已分配malloc()
,realloc()
将允许您减少或增加区块的大小。但是,块的起始地址不一定保持不变。
您无法更改malloc
'内存块的起始地址,这正是您的第二个场景所要求的。也无法拆分malloc
'阻止。
这是malloc
/ calloc
/ realloc
/ free
API的限制 - 实施可能依赖于这些限制(例如,保留有关的簿记信息紧接在起始地址之前的分配,这将使起始地址难以移动。)
现在,malloc
并不是唯一的分配器 - 您的平台或库可能提供其他分配器,或者您可以自己编写(通过malloc
从mmap
获取内存,{ {1}},VirtualAlloc
或其他一些机制)然后以您想要的任何方式将其交给您的程序。
对于C ++,如果使用std::malloc
分配内存,则上述信息适用。如果您正在使用new
和delete
,那么您正在为对象分配存储空间,因此更改已分配块的大小没有意义 - C ++中的对象是固定大小的。
答案 2 :(得分:2)
如果您拥有n
字节的malloc
内存,则可以realloc
m
个字节(其中m
< n
和因此扔掉最后n-m
个字节。
要从头开始,你可以malloc
一个新的,更小的缓冲区和memcpy
你想要的字节,然后free
原始字节。
使用C ++ new
和delete
也可以使用后一个选项。它还可以模拟第一个realloc
案例。
答案 3 :(得分:1)
你可以用realloc()缩短它。我不认为其余的是可能的。
答案 4 :(得分:1)
你可以使用realloc()显然缩短内存。请注意,对于某些实现,这样的调用实际上什么都不做。你不能释放块的第一位并保留最后一位。
如果您发现自己需要此类功能,则应考虑使用更复杂的数据结构。对于每个编程问题,数组都不是正确答案。
答案 5 :(得分:1)
http://en.wikipedia.org/wiki/New_(C%2B%2B)
总结:与C的realloc相比,它 是不可能直接重新分配 用new []分配的内存。扩展 或减少一个块的大小 必须分配一个足够的新块 大小,复制旧记忆,和 删除旧块。 C ++标准 library提供了一个动态数组 可以延长或减少 std :: vector template。