[英]in C: Why does a stack allocated structure exist outside of the function?
我的功能:
struct hostent * gethost(char * hostname){
if(/*some condition under which I want
to change the mode of my program to not take a host*/){
return null
}
else{
struct hostent * host = gethostbyname(hostname);
return host;
}
}
在主要:
struct hostent * host = gethost(argv[2]);
(忽略代碼中的任何小錯誤,我從內存中噴出)
這很好用。 盡管事實上我沒有自由,但Valgrind並沒有告訴我,我正在失去記憶。
為什么? 我認為在堆棧上分配的東西會隨着函數調用返回而消失? 或者是因為我返回指針? 這有什么危險嗎?
host
沒有在堆棧上分配,只有指向它的指針在堆棧上。 函數返回時會復制指針,因此代碼沒有任何問題。
請注意, gethostbyname
實際上並不動態分配內存。 它總是返回一個指向同一個靜態分配的內存塊的指針,這就是valgrind不報告泄漏的原因。 但要小心,因為這意味着如果要稍后保存值,則必須復制函數返回的hostent
,因為對gethost
進一步調用將覆蓋它。
它很好並且確實泄漏,因為返回的指針不指向堆棧或堆上的數據,而是指向一些靜態變量。
http://linux.die.net/man/3/gethostbyname :
函數gethostbyname()和gethostbyaddr()可能會返回指向靜態數據的指針,這些指針可能會被以后的調用覆蓋 。 復制struct hostent是不夠的,因為它包含指針; 需要深層復印件。
從手冊:
RETURN VALUE
The gethostbyname() and gethostbyaddr() functions return the hostent
structure or a NULL pointer if an error occurs. On error, the h_errno
variable holds an error number. When non-NULL, the return value may
point at static data, ...
一些內存在編譯時保留(即在二進制代碼內部)為結構保留,該函數返回一個指向該內存的指針。
好吧,在所有對它的引用都丟失之前,內存不會被泄露,在你的例子中,指針被返回,所以仍然有對它的引用。
然而,對於大多數情況而言,依賴於代碼的另一部分來釋放動態內存是一個糟糕的設計決策。 如果函數需要返回一個結構,例如,調用者應該這樣做並傳遞指向結構的指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.