C和C ++:释放已分配指针的PART

时间:2009-08-20 08:29:43

标签: c++ c memory-management

假设我有一个分配给4096字节的指针。如何释放C中的最后1024个字节?在C ++中怎么样?相反,如果我想释放第一个 1024个字节,并保留其余部分(使用两种语言),该怎么办?如何从中间解除分配(在我看来,这需要将它分成两个指针,在解除分配的区域之前和之后)。

6 个答案:

答案 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并不是唯一的分配器 - 您的平台或库可能提供其他分配器,或者您可以自己编写(通过mallocmmap获取内存,{ {1}},VirtualAlloc或其他一些机制)然后以您想要的任何方式将其交给您的程序。

对于C ++,如果使用std::malloc分配内存,则上述信息适用。如果您正在使用newdelete,那么您正在为对象分配存储空间,因此更改已分配块的大小没有意义 - C ++中的对象是固定大小的。

答案 2 :(得分:2)

如果您拥有n字节的malloc内存,则可以realloc m个字节(其中m< n和因此扔掉最后n-m个字节。

要从头开始,你可以malloc一个新的,更小的缓冲区和memcpy你想要的字节,然后free原始字节。

使用C ++ newdelete也可以使用后一个选项。它还可以模拟第一个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。