C 堆栈上的空闲内存

问题描述 投票:0回答:3

我创建了一些实用程序 帮助我处理动态列表的管理。在我所讲的部分 用于处理列表中元素的删除(如果有) 当我调用

free()
时,添加的元素存储在堆栈中 达到了未定义的行为。

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

所以我认为要解决这个问题我必须处理 由

free()
产生的错误。当我调用
free()
时,有没有办法处理该异常?

c free undefined-behavior
3个回答
9
投票

没有。

对于非堆指针,您不需要调用

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


0
投票

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

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

但是,这种向内存池添加存储的方法在 C 中不起作用,因为“free”可以知道向池添加多少内存的唯一方法是利用“malloc”存储在某处的信息”。通常,信息存储在紧邻 malloc() 提供给应用程序的存储之前的空间中。如果指针不是由

malloc()
生成的,则紧邻指针所描述的存储之前的存储将不包含 malloc() 所需的信息,但更可能包含看起来像是由分配一些无意义的大小。这将产生邀请内存管理器对大块存储执行任何它喜欢的操作的效果,这些存储可能会超出其地址传递给它的对象的边界。当内存管理器接受该邀请时,很可能会引发欢闹。


-1
投票

您可能需要使用

_malloca
_freea
。这样系统会为您确定是在堆栈上分配还是在堆上分配。

© www.soinside.com 2019 - 2024. All rights reserved.