簡體   English   中英

從c中的函數返回指針是一種好習慣嗎?

[英]Is it good practice to return pointer from function in c?

例如:

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

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

我想知道這在c中是否是一種好習慣?

返回指針是很常見的。 問題或紀律是確定釋放內存的責任在哪里。 該示例聞起來是因為尚不清楚是否需要在main()中將其釋放。

我認為問題在於免費(a); 我認為您應該添加release_point()函數。

Wikipedia頁面上查看C示例中的不透明指針 這是一種結構化代碼的方式,您可以在界面的一側完全管理內存。

我所知道的唯一返回指針是分配給內存的真正危險是:如果您的庫是在Windows上編譯並鏈接到Visual C ++運行時庫(MSVCRT)的一個實例,則它是靜態鏈接的;並且客戶端程序鏈接到另一個實例,例如,它鏈接到DLL,則它們各自具有不同的malloc競技場,並且該程序無法釋放庫返回的指針。 嘗試這樣做可能會導致程序崩潰。

我主張始終擁有自己的函數來釋放庫返回的內存,除非您要返回一些瑣碎的東西,例如字符串。

這樣做的原因是,如果您更改返回的結構,以至於簡單的free將不再足夠(因為您將返回的對象指針添加到需要釋放的已分配內存中),客戶端將不會需要更改他們的代碼; 您可以更改現有的免費功能。

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

如果您有一個一致的系統來知道哪些函數返回必須釋放的指針(例如,使用函數名稱中的createnew單詞),則可以更輕松地管理內存。

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

這通常是很好的做法,但是您的示例是少數非常不好的例子之一。 您永遠不要對較小的並且本身不包含(也永遠不需要包含)指針的單個對象使用動態分配和指針。 一旦計入簿記開銷,使用malloc獲取4字節的int至少會使用16個字節,但是也許更重要的是,這意味着您必須擔心可能的分配失敗(以及如何處理錯誤)並管理何時釋放對象。

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

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

當然,分配和返回指向此類對象的指針的一次可能是在分配它們的數組時。

暫無
暫無

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

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