[英]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
將不再足夠(因為您將返回的對象指針添加到需要釋放的已分配內存中),客戶端將不會需要更改他們的代碼; 您可以更改現有的免費功能。
因此,擁有自己的免費功能可使客戶端與庫返回的對象結構隔離,從而使您可以自由更改對象的結構而不會影響客戶端。
如果您有一個一致的系統來知道哪些函數返回必須釋放的指針(例如,使用函數名稱中的create
或new
單詞),則可以更輕松地管理內存。
int *createPoint()
{
int *q = malloc(sizeof(int));
if (*q)
*q = 20;
return q;
}
這通常是很好的做法,但是您的示例是少數非常不好的例子之一。 您永遠不要對較小的並且本身不包含(也永遠不需要包含)指針的單個對象使用動態分配和指針。 一旦計入簿記開銷,使用malloc
獲取4字節的int
至少會使用16個字節,但是也許更重要的是,這意味着您必須擔心可能的分配失敗(以及如何處理錯誤)並管理何時釋放對象。
您不應該這樣分配的一些對象示例:
當然,分配和返回指向此類對象的指針的一次可能是在分配它們的數組時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.