在C / C ++中,当你想动态分配内存时,通常调用malloc void* malloc (size_t size);
,它返回一个指向大小字节的内存块的指针。
完成使用此内存块后,调用free()
将内存释放回堆中。
这一切都很好,但是如果碰巧调用realloc void* realloc (void* ptr, size_t size);
会改变ptr指向的内存块的大小会发生什么。你完成使用内存后仍然调用free(),但我的问题是编译如何知道要释放多少内存?
直观地说,我可以提出答案,但我对实施细节感兴趣 - 它是如何真正完成的?它是编译器依赖的吗?它是标准的一部分吗?
提前致谢!
答案 0 :(得分:3)
要释放内存,通常不需要说明要释放的多内存。分配器已经知道它给了你多少,并记住了。分配的内存的地址在分配器的内部簿记数据结构中用作一种“密钥”。因此,您需要做的就是提供要释放的内存的地址,并且分配器知道您正在谈论的内存。
要明确:没有“部分释放”某些记忆的事情。你不能指向一些已分配内存的中间并说“这里有100个字节”。你准确地释放你所获得的东西,不多也不少。
最后,realloc
只是malloc
和memcpy
的组合,如果您愿意的话,可能还有一个小优化机会,允许现有分配“增长”而不移动数据。但这个想法是一样的。