嗨堆疊溢位社區。我對 C 編程非常陌生,并且已經開始學習動態分配。在我遇到的每個代碼示例中,在分配記憶體的函式中使用 free() 釋放記憶體。我想知道是否可以在分配記憶體的函式之外釋放()動態分配的記憶體。例如,這里有一段代碼可以做到這一點:
這種在函式外釋放記憶體會導致記憶體泄漏嗎?或者這樣可以嗎?我不得不提出的一個后續問題是,是否可以在不使用動態分配的記憶體的情況下訪問主函式中的記憶體(我列印結果的地方)?例如,我可以使用全域陣列并在 ret 函式中修改它嗎?
uj5u.com熱心網友回復:
請不要發布代碼影像。只需將其復制粘貼到帖子中即可。
好吧,要回答您的問題,您可以這樣做。當您擁有動態分配的指標時,您就可以了。
對于您的第二個問題,是的,您也可以這樣做。
uj5u.com熱心網友回復:
是的你可以。如果您在“外部函式”內部動態分配記憶體(在這種情況下,該函式不是main
),很可能是因為您想在函式主體的執行結束后使用該資料。您只需回傳一個型別的指標int
(我認為如果分配的記憶體被自動釋放,這是不可能的,這是沒有意義的)。您可以稍后在main
using中釋放它free(ptr);
。
你也可以使用一個陣列,但你不能釋放它,因為你只能free
用來釋放動態分配的記憶體。
uj5u.com熱心網友回復:
我想知道是否可以在分配記憶體的函式之外釋放()動態分配的記憶體。
當然可以。堆管理器不知道呼叫了哪個函式calloc
。那么,它為什么要關心呼叫了哪個函式free
呢?
只要對每個 alloc ( malloc/calloc/realloc
) 你 [最終] 做一個free
你就可以了。哪些函式進行這些呼叫并不重要。
“記憶體泄漏”是指您分配記憶體但從未釋放它(通過任何方式或功能)
一些代碼將最好地說明這一點,并顯示關于“誰”釋放它的各種釋放記憶體的方法:
void
do_stuff(void *ptr)
{
// do stuff with ptr ...
}
void
do_stuff_free(void *ptr)
{
// do stuff with ptr ...
free(ptr);
}
void
leaker(void)
{
void *ptr;
// this leaks memory
while (1) {
ptr = malloc(1);
do_stuff(ptr);
}
}
void
noleaker(void)
{
void *ptr;
// this does _not_ leak memory
while (1) {
ptr = malloc(1);
do_stuff(ptr);
free(ptr);
}
}
void
noleaker2(void)
{
void *ptr;
// this does _not_ leak memory
while (1) {
ptr = malloc(1);
do_stuff_free(ptr);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/493394.html