簡體   English   中英

如何釋放函數返回的指針?

[英]How do I free a pointer returned from a function?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* f(void) {
  char *x;
  x = malloc(sizeof(char) * 4);
  strcpy(x, "abc");
  return(x);
}

int main(void) {
  char *a;
  a = f();
  printf("%s", a);
  free(a);
  return(0);
}

是否必須釋放函數中的變量x 如果是這樣,當我需要退貨時,這怎么可能呢?

是否必須釋放函數中的變量x?

是的(有點,見我后來的評論)。 每次調用malloc需要稍后調用free 否則,你有泄漏。 但請記住; 你是不是“自由[和] x ”,你在釋放該X指的是內存。

當您返回x (地址)的副本x且已返回給調用者。 聲明了x具有自動存儲持續時間。 它所指的內存必須被釋放。

如果是這樣,當我需要返回時,這怎么可能。

您的設計將責任放在呼叫者身上以釋放記憶。 你已經完成了這個。 當然,使用此方法需要您記錄該函數,以便代碼的用戶知道他們正在接收動態分配的內存地址。

更好的方法(IMO)是將緩沖區作為輸入參數。 現在很清楚誰負責管理這個內存(即調用者)。 也許我甚至不想動態分配它。 有了這個設計,這是我的選擇。

void f(char *buf, size_t buf_size) {
  strncpy(buf, "abc", buf_size - 1);
  buf[buf_size-1] = '\0';
}

另外,您應該始終檢查malloc的返回值。 它可能會失敗,在這種情況下將返回空指針。 此外, sizeof(char)保證標准為1 ,因此您可以刪除該位並只說malloc(n)

是的,應該由呼叫者釋放。 比如你的主要free

在函數f返回x時,地址的副本將傳遞回調用者。 呼叫者可以在該地址free撥打電話。

是的,你需要自由,但是當你自由時它已經被釋放了free(a); main (因為a在行a = f();被指定為等於x )。

退出函數后, x被銷毀。 x的值是指向動態分配的對象的地址。 退出函數后,該對象仍然存在。

要釋放動態對象,必須將f函數返回的x值傳遞給free函數。

當你調用malloc它會分配內存並返回該內存塊的初始地址。

在您的情況下,您將此地址返回給被調用者,現在被調用者main負責解除分配。

解除內存塊所需的唯一內容是初始地址,AFIK負責分配/釋放內存,它使用相當復雜的算法,但程序只需要跟蹤初始內存地址。 這個地址可以像任何其他整數值一樣存儲或移動,因為在32位系統中,它只是一個int值。

你編寫的代碼運行良好,你釋放a由f進行malloced的字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM