C 堆栈上的空闲内存

C free memory on stack

我创建了一些实用程序 帮助我处理 DinamicList 的管理。在我的部分 用于处理列表中元素的删除,如果有 当我调用 free() 时添加的元素存储在堆栈中 达到了未定义的行为。

网上冲浪我发现 没有办法确定指针是否指向堆栈 内存或堆内存。

所以我认为要解决这个问题我必须处理 free() 产生的错误。当我调用 free() 时,有没有办法处理该异常?

没有

您不需要为非堆指针调用 free()。最简单的方法是让分配内存的人负责释放它。 IE。您的实用程序负责管理它们分配的任何内存,但其他人负责管理传递给您的实用程序的内存。

虽然"malloc"和"free"描述的是创建分配和销毁分配,但它们的实际作用恰恰相反。 "malloc()" 函数从池中获取一些内存并指示内存管理器不允许使用分配范围内的任何字节(尽管超出该范围的字节,包括分配之前和之后的字节,保持可用)。 "free()" 函数将内存添加回池中,以供将来使用。

在某些分配系统中,释放内存的函数接受一个参数,指示释放了多少内存;其他人可能要求每个池只能用于分发固定大小的对象。一些执行此类操作的系统将允许代码通过简单地 "releasing" 将程序不需要用于任何其他目的的任何内存块添加到池中,内存管理器知道或关心内存是否来自在第一种情况下来自游泳池。事实上,在一些这样的系统中,池首先可能是如何创建的:为一个空内存池初始化一个描述符,然后 "release" 存储块方便地放入其中。

这种向内存池中添加存储的方法在 C 中行不通,但是,因为 "free" 知道要向池中添加多少内存的唯一方法是利用以下信息: "malloc" 存储在某处。通常,信息存储在 malloc() 提供给应用程序之前的 space 中。如果指针不是由 malloc() 生成的,则紧接在指针描述的存储之前的存储将不包含 malloc() 需要的信息,但更可能包含看起来像是创建的字节模式通过分配一些无意义的大小。这将具有邀请内存管理器对大块存储做任何它喜欢的事情的效果,这些存储可能会超出其地址传递给它的对象的边界。当内存管理器根据该邀请接受应用程序时,可能会引起欢呼。