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

Ima*_*ist 6 c c++ memory-management

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

Rod*_*ddy 12

不要尝试和猜测内存管理.它通常比你聪明;-)

你唯一能做到的就是第一个"解除分配"最后1K的场景

char * foo = malloc(4096);

foo = realloc(foo, 4096-1024);
Run Code Online (Sandbox Code Playgroud)

但是,即使在这种情况下,也没有保证"foo"不会改变.您的整个4K可能会被释放,并且realloc()可能会将您的内存移动到其他位置,从而使您可能拥有的任何指针无效.

这对C和C++都有效 - 但是,在C++中使用malloc()是一种糟糕的代码味道,大多数人都希望你使用new()来分配存储空间.并且使用new()分配的内存不能被realloc()编辑 - 或者至少不是以任何可移植的方式.在C++中,STL向量是一种更好的方法


laa*_*lto 5

如果您有n字节的mallocated 内存,您可以realloc m字节(其中m< n),从而丢弃最后的n-m字节。

要从头开始扔掉,您可以使用malloc一个新的、更小的缓冲区和memcpy您想要的字节,然后是free原始的。

后一个选项也可以使用 C++newdelete. 也可以效仿第一种realloc情况。


Ste*_*iss 5

您没有"分配给指定4096字节的指针",您有一个指向4096字节的已分配块的指针.

如果您的块已分配malloc(),realloc()将允许您减少或增加块的大小.但是,块的起始地址不一定保持不变.

你不能改变malloc'内存块的起始地址,这正是你的第二个场景所要求的.也没有办法拆分malloc'd区块.

这是malloc/ calloc/ realloc/ freeAPI 的限制- 实现可能依赖于这些限制(例如,在起始地址之前保留有关分配的簿记信息,这会使起始地址难以移动.)

现在,malloc是不是唯一的分配器在那里-你的平台或库可以提供其他的,或者你也可以写你自己的(通过其从系统中获取内存malloc,mmap,VirtualAlloc或者一些其他的机制),然后手出来给你的程序以任何你想要的方式.

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