繁体   English   中英

堆栈上的C可用内存

[英]C free memory on stack

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

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

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

没有。

您不需要为非堆指针调用free() 最简单的方法就是让分配内存的人自己解决问题。 即你的实用程序会照看他们分配的内存,但其他人会照看传递给你的实用程序的内存。

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

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

这种向内存池添加存储的方法在C中无法工作,但是,“免费”的唯一方法是知道要添加到池中的内存量是利用“malloc”存储的信息。 。 通常,信息存储在malloc()给应用程序的存储之前的空间中。 如果指针不是由malloc()生成的,则指针所描述的存储之前的存储将不包含malloc()需要的信息,但更可能包含看起来像是由一个创建的字节模式。分配一些无意义的大小。 这会产生这样的效果:邀请内存管理器用大块存储来做它喜欢的任何事情,这些存储可能会扩展到传递给它的地址对象的边界之外。 当内存管理器在该邀请上提交应用程序时,可能会发生欢闹。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM