我创建了一些实用程序
帮助我处理DinamicList的管理。在本节中
用于处理列表中元素的删除(如果有)
当我调用free()
时添加了存储在堆栈中的元素
达到未定义的行为。
我在网上冲浪 无法确定指针是否指向堆栈 内存或堆内存。
所以我认为要解决此问题,我必须处理
由free()
产生的错误。当我致电free()
时,是否可以处理该异常?
答案 0 :(得分:7)
否。
您不需要为非堆指针调用free()
。最简单的方法是让分配内存的任何人都可以释放它。即您的实用程序会照顾他们分配的所有内存,而其他人则负责传递给您的实用程序的内存。
答案 1 :(得分:0)
尽管“ malloc”和“ free”是在创建分配和销毁分配方面进行描述的,但其实际作用与之相反。 “ malloc()”函数从池中获取一些内存,并指示不允许内存管理器使用已分配范围内的任何字节(尽管超出该范围的字节,包括紧接分配之前和之后的那些字节,保持可用状态)。 “ free()”函数将内存添加回池中,以供将来使用。
在某些分配系统中,释放内存的函数接受一个参数,该参数指示要释放多少内存。其他人可能会要求每个池仅用于分配固定大小的对象。一些执行此类操作的系统将允许代码通过简单地“释放”它来将程序不需要的任何其他目的的任何内存块添加到池中,内存管理器知道或关心该内存是否来自内存。在第一种情况下池。实际上,在某些这样的系统中,首先可能是如何创建池的:初始化一个空内存池的描述符,然后方便地将存储块“释放”到其中。
这种在内存池中添加存储的方法在C中不起作用,因为“空闲”可以知道要添加到池中的内存的唯一方法是利用存储在某个位置的信息。 “ malloc”。通常,信息会在存储malloc()提供给应用程序之前立即存储在该空间中。如果malloc()
并未产生指针,则该指针所描述的存储之前的存储将不包含malloc()所需的信息,但更有可能包含看起来像是已创建的字节模式通过分配一些没有意义的大小。这将导致邀请内存管理器对大容量的存储执行任何其喜欢的操作,这很可能会扩展到地址传递给对象的对象的边界之外。当内存管理器按照邀请来处理应用程序时,很可能会引起热闹。