2010-11-08 133 views
7

對於防爆:從c中的函數返回指針是否是好習慣?

int *point() { 
int *q = malloc(sizeof(int)); 
*q=20; 
return q; 
} 

int main() { 
    int *a = point(); 
    free(a); 
} 

我不知道這是在C好的做法呢?

+0

根據目前的答案,這顯然是一個主觀問題。似乎沒有確定這種編碼實踐的優劣的客觀標準,並且有爭論和反對的論據。 – 2010-11-08 00:30:59

+1

@Mark:那是無稽之談。當然,有人贊同和反對返回指針,但那是因爲它有時是一個明智的事情,有時候不是。一個好的答案,因爲你似乎有疑問,這將解釋*當*返回一個指針是一個好習慣,*爲什麼*它是/不是。 – jalf 2010-11-08 02:19:15

+0

而下一次您決定投票結束問題時,我建議您在點擊它之前閱讀最近的原因。緊密的原因並不是說「主觀」。它說「主觀和議論」。這是「論證性」的部分,非常重要。畢竟,沒有人想要一場火焰戰爭。但是,這個問題與其他許多主觀問題一樣,可以客觀地回答。例如,@ DGM的答案是客觀的。它觀察了這種做法的普遍性,解釋瞭如何完成返回指針,並解釋了OP示例的問題。 – jalf 2010-11-08 02:21:51

回答

13

返回指針是相當普遍的。需要解決的問題或紀律是確定釋放記憶的責任在哪裏。這個例子的味道,因爲它不清楚它需要在main()中free'd。

+2

更正:從整個代碼示例中可以看出,但如果API用戶無法訪問「point()」的代碼,則不清楚。當一個函數返回一個指針時,文檔是否需要'free()'-d(或者需要使用其他更專用的清理)。 – 2010-11-08 00:22:12

+0

是的,當功能正好在你面前時很容易。當它被埋在10,000線庫中並不容易。 :) – DGM 2010-11-08 13:34:33

8

我覺得問題是免費的(一);我認爲你應該添加一個release_point()函數。

+3

不同意。如果需要更多的清理而不是'free()',那麼是的,添加一個析構函數。但是,如果你的清理函數不過是'void release(mytype * p){free(p); }'那麼你的清理函數是不必要的。你可以記錄任何使用你的數據類型的人需要調用'free()'就像你可以調用你自定義的釋放/析構函數一樣容易。另外,每個人都知道'free()'做了些什麼。 – 2010-11-08 00:19:32

+7

@Chris:使用release_point()函數可以確保,如果將來需要進行清理,則不需要重構整個應用程序。 – 2010-11-08 00:25:56

+4

同意,但點應該被稱爲像create_point()。這樣,它使我立即認爲我應該在以後消滅這一點。 – 2010-11-08 00:32:57

1

如果您知道哪些函數返回必須被釋放的指針(例如在函數名中使用createnew這個詞),那麼它可以更容易地管理您的內存。

int *createPoint() 
{ 
    int *q = malloc(sizeof(int)); 
    if (*q) 
     *q = 20; 
    return q; 
} 
3

唯一真正的危險,我知道與返回一個指向分配的內存是這樣的:如果你的庫被編譯在Windows和鏈接到Visual C++運行時庫(MSVCRT)的一個實例,例如,它靜態鏈接到它,並且客戶端程序鏈接到另一個實例,例如,它鏈接到DLL,然後它們每個都有不同的malloc舞臺,並且庫返回的指針不能被程序釋放。任何嘗試這樣做都可能導致程序崩潰。

3

我會主張永遠有自己的函數來釋放庫中返回的內存,除非你返回一些不重要的東西,比如字符串。

原因是,如果你改變你正在返回的結構,使得一個簡單的free將不再是足夠的(因爲你添加到返回的對象指針分配的內存本身需要被釋放) ,客戶不需要更改他們的代碼;你可以改變你現有的免費功能。

因此,擁有自己的免費功能可以將客戶端從庫中返回的對象結構中隔離出來,讓您可以自由地更改對象的結構而不會影響客戶端。

0

這通常是很好的做法,但是你的例子是少數情況下非常糟糕的做法之一。你絕對不應該使用動態分配和指針來處理那些很小但不包含(並且永遠不需要包含)指針本身的對象。獲取4字節的intmalloc一旦考慮了簿記開銷,至少會使用16個字節,但也許更重要的是,這意味着您不得不擔心可能的分配失敗(以及如何處理它們)以及管理何時釋放對象。

你不應該分配這樣的對象的一些示例:

  • 任何基本類型
  • 有序對/座標/向量/矩陣/等。(只要他們是固定尺寸)
  • IP地址
  • 顏色值

過程的一個時間也許更合理分配,並返回一個指針這樣的對象是,當你分配他們的數組

相關問題