簡體   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