2010-08-06 22 views
3

我有一個函數foo(),它分配內存並返回它。我的標準做法是在我的主要功能結束時釋放它嗎?C編程 - 返回指向Freed的指針

char* foo(){ 
char * p; 

p = malloc(sizeof(char) * 4); /* edit - thanks to msg board */ 
p[0] = 'a'; 
p[1] = 'b'; 
p[2] = 'c'; 
p[3] = '/0'; /* edit: thanks to the msg board. */ 

return p; 
} 

int main(int argc, char *argv[]) 
{ 
char * p2; 

p2 = foo(); 

printf("%s", p2);  

free(p2); 

return 0; 
} 
+0

請注意,這是一個樣式問題:如果沒有釋放,它將在退出時返回到操作系統。主要做可能更好,但不是必需的。 – 2010-08-06 18:31:31

+5

我一直希望在退出之前釋放它,以防您的主函數的主體稍後被移動或複製。另外,我意識到這只是一個例子,但如果你正在做這樣的事情,你可能想看看strdup。 – 2010-08-06 18:33:02

回答

6

main()結束時釋放會是正確的事情,是的。不過,您可能會考慮使用null來終止該字符串。可以這麼說,更爲習慣的設計是對所有「同級」的內存管理。例如:

void foo(char *p) 
{ 
    p[0] = 'a'; 
    p[1] = 'b'; 
    p[2] = 'c'; 
    p[3] = '\0'; 
} 

int main(int argc, char **argv) 
{ 
    char *p2 = malloc(4); 
    foo(p2); 
    printf("%s", p2); 
    free(p2); 
    return 0; 
} 
+0

認爲在那裏有一個錯字,你想要:'void foo(char * p)' – 2010-08-06 18:30:12

+0

哎呀,謝謝@Justin。現在解決。 – 2010-08-06 18:31:02

+0

謝謝,卡爾。我的foo函數有什麼優點,它沒有狀態,即它是否有功能? – 2010-08-06 18:33:00

0

我不知道這是否是「標準做法」,但free()是必要的,否則你會泄漏memeory。

我想提出兩個函數,new_foo()delete_foo(),像這樣:

char* new_foo() 
{ 
    char * p; 
    p = malloc(sizeof(int) * 4); 
    /* ... */ 
    return p; 
} 

void delete_foo(char* p) 
{ 
    free(p); 
} 

int main() 
{ 
    char * p2; 
    p2 = new_foo(); 
    /* ... */ 
    delete_foo(p2); 
    return 0; 
} 

這在我看來, 「更有意義」。

+3

我們正在討論'main()'函數的最後一行。它幾乎沒有資格內存泄漏,因爲所有資源都將被返回到系統。 – Bolo 2010-08-06 18:29:38

+0

'sizeof(int)* 3' - >'sizeof(char)* 4' – 2010-08-06 18:31:34

+0

@Bolo:清理後仍然是一個好習慣。畢竟,如果系統不回收泄漏的資源呢? C語言不保證您的程序退出時會泄露泄露的資源。 – 2010-08-06 18:37:34

0

當您不再需要引用該變量時,您需要釋放它。但是,當您的程序退出分配給它的所有資源時。

而且,即使程序在下一行退出,當您完成使用時,也可以釋放它。

+0

在程序結束時釋放所有資源是OS功能,而不是C環境功能。這在目前的操作系統中或多或少是標準的,但對於C環境並不是必需的。 – 2010-08-06 18:31:11

+0

嗯,是的,我提到,由於不釋放內存的程序會導致內存泄漏,如果它永遠運行。但這個例子退出,因此我補充說。 – 2010-08-06 18:35:27

0

和爲什麼你會malloc(sizeof(int)* 3)當你分配一個3個字符的?

+0

我只注意到我的錯誤。謝謝 – 2010-08-06 18:33:55

1

「標準實踐」,如果有這樣的事情,一旦完成它就釋放記憶。

我個人的看法是,即使你知道該程序即將結束,也應該釋放內存,因爲這是一種很好的練習,並且因爲某一天,你會遇到一個不會自動釋放鼠標的環境內存當程序退出時。

0

我原以爲這會是更好的做法,分配和釋放內存在相同的功能(在這種情況下,main())。

例如:

void foo(char *p) 
{  
p[0] = 'a'; 
p[1] = 'b'; 
p[2] = 'c'; 

return ; 
} 

int main(int argc, char *argv[]) 
{ 
char * p2; 

p = malloc(sizeof(int) * 3); 
foo(p2); 

printf("%s", p2);  

free(p2); 

return 0; 
} 
+0

除了(在現實世界中)你幾乎肯定不會知道實際調用之前有多少內存給malloc – KevinDTimm 2010-08-07 00:41:18

0

一個很好的理由這樣做是爲了讓你有匹配的malloc的/自由的。如果代碼被移動,程序員會自然地尋找與malloc一起使用的匹配。如果它不在那裏,它可能是一個混亂的來源(希望不會太長)。

總之,它使資源使用更加明顯。

0

一般規則是,只要您注意到不再需要記憶,就應該釋放記憶。在程序終止之前需要的特定內存情況下,有兩個有效的觀點。

  • 保持簡單:每malloc必須有相應的free。主要優點是,如果您想將獨立程序轉換爲更大程序的組件,您的main將變爲庫調用,並且需要調用free

  • 保持簡單:釋放程序資源是操作系統的工作。這是一個有效的管理策略 - 該程序的內存是一個內存,當程序退出時一舉釋放。主要好處是你不需要跟蹤每個分配的塊,這有時很難(但你可能想考慮一個垃圾收集器)。