假设我在内存中有一个包含字符串"ABCDEFG"
的分配,但我只有一个指向'E'
的指针。在win32上,是否有可能释放该块,给定在>>块内的指针,但不是在开始时?任何分配方法都可行,但Heap*
函数将是阻力最小的路径。
如果不是本机解决方案,是否已编写任何提供此功能的自定义内存管理器?
编辑:这不是一个草率的借口。我正在开发一个使用100%编译时元数据的自动内存管理系统。这个奇怪的要求似乎是阻碍它工作的唯一方法,即便如此,只需要基于数组的数据类型(可以切片)。
答案 0 :(得分:3)
运行时库中的内存分配例程可以针对每个已分配块的开头和结尾检查给定的内存地址。搜索完成后,从一开始就很容易释放该块。
即使背后有聪明的算法,这也会导致每次内存释放时的某种搜索。为什么?只是为了支持错误的程序太愚蠢,无法跟踪他们分配的内存块的开始?
标准C惯用法在处理分配的内存块(如数组)方面非常繁荣。从* alloc返回的指针是一个指向数组开头的指针,指针可以与下标一起使用来访问该数组的任何元素,从0开始下标。这已经运行了40年,我不能想一想在这里引入变化的明智理由。
答案 1 :(得分:1)
我想如果你知道malloc()
保护块看起来是什么样的,你可以写一个从你传递它的指针备份的函数,直到它找到原始内存地址的“最佳猜测”,然后调用free()
。为什么不保留基指针的副本?
答案 2 :(得分:1)
如果使用VirtualAlloc
分配内存,可以使用VirtualQuery
找出指针所属的块。获得基地址后,可以将其传递给VirtualFree
以释放整个块。