縱觀我從前輩繼承的程序,有以下格式的功能:多次調用的strdup()使用相同的左值
somefunc(some_type some_parameter, char ** msg)
換句話說,最後一個參數是一個char **
,這是用於返回消息。 即:somefunc()
將「更改」msg
。 在某些情況下,有問題的變化的形式爲:
sprintf(txt,"some text. Not fixed but with a format and variables etc");
LogWar("%s",txt); //call to some logging function that uses txt
*msg = strdup(txt);
我知道,每次調用strdup()
應該有一個相關的呼叫free()
釋放它分配的內存。
由於該內存用於返回某些內容,因此顯然不應在somefunc()
的末尾釋放。
但那麼在哪裏?
如果將somefunc()
與相同的 msg多次調用,那麼該指針將四處移動,我假設。所以以前的通話分配的空間會丟失,對吧?
程序結束前的某處我當然應該free(*msg)
。 (在這種情況下*msg
是用作調用somefunc()
參數的版本。) 但我認爲,呼叫只會釋放最後分配的內存,而不是存儲在早期呼叫分配給somefunc()
,對不對?
所以,我在說somefunc()
應該是這樣的更正:那麼有free()
的strdup()
前
sprintf(txt,"some text. Not fixed like here, but actually with variables etc");
LogWar("%s",txt); //call to some logging function that uses txt
free(*msg); //free up the memory that was previously assigned to msg, since we will be re-allocating it immediatly hereafter
*msg = strdup(txt);
。
我正確嗎?
通常當你傳遞類似於這個函數的指針地址時,通常調用者有責任釋放返回的任何分配的資源。作爲一個經驗法則,當你不再需要內存時,就可以釋放它。 –