我使用巧舌如簧被釋放,
它有很多的返回應釋放自己的字符串函數。
我可以將這些功能傳遞給其他功能嗎?C /油嘴字符串應該由主叫方
示例:function1返回必須爲調用者釋放的字符串。 function2返回一個指向一個字符串的指針,該字符串也必須被釋放。
gchar *string = function2(function1("something"));
g_free (string);
我該如何釋放從函數1返回的字符串?這是必要的嗎?
非常感謝,
和對不起我的英語
我使用巧舌如簧被釋放,
它有很多的返回應釋放自己的字符串函數。
我可以將這些功能傳遞給其他功能嗎?C /油嘴字符串應該由主叫方
示例:function1返回必須爲調用者釋放的字符串。 function2返回一個指向一個字符串的指針,該字符串也必須被釋放。
gchar *string = function2(function1("something"));
g_free (string);
我該如何釋放從函數1返回的字符串?這是必要的嗎?
非常感謝,
和對不起我的英語
是的,這是必要的,以釋放function1
返回的字符串。爲了讓您能夠做到這一點,你需要採取的返回值的副本: -
gchar* temp = function1("something");
gchar* string = function2(temp);
g_free(temp);
g_free(string);
在你給的例子:
gchar *string = function2(function1("something"));
g_free (string);
您不能無function1()
字符串。這是內存泄漏。因此,雖然我知道這是很好的壓縮東西,你應該慢下來:
gchar *temp, *string;
temp = function1("something");
string = function2(temp);
g_free(temp);
temp = NULL;
g_free(string);
否則,每次代碼運行時,function1()
將分配永遠不會被釋放更多的內存,如果你的應用程序運行很長一段時間,您的程序將開始緩慢地耗盡可用內存(因爲所有分配的內存永遠不會是free()
d)。
另一種方法是寫周圍function2()
的包裝:
gchar *function2_wrapper(gchar *c)
{
gchar *ret = function2(c);
free(c);
return ret;
}
gchar *string = function2_wrapper(function1("something"));
但在我看來,這可能是更多的努力比它的價值,任何人都在看你的代碼可能會丟失,認爲這是一個內存泄漏時沒有,並改寫它,並獲得在運行時一個雙free()
錯誤擊中,根本不知道發生了什麼事情,
是的,這是真的,因爲@DaveRigby等是pointed出來,那你需要獲取從function1()
返回的指針值以釋放它。但是如果有大的!
如果您指的是這樣的glib功能爲function1()
,您應該不是免費的。因爲這些函數返回你傳遞的內容。
比方說,你有
GString *s = g_string_new("foo");
和你想有"http://foo/bar"
,你可以這樣做:
s = g_string_prepend(g_string_append(s, "/bar"), "http://");
use_my_string(s);
g_string_free(s);
我知道上面的例子是不是最好的之一,但希望你能看到這一點。GString函數可以說是破壞性的。它不會創建給定字符串的副本。
我們可以在主頁面和問題頁面看到一個問題是否已被回答或關閉,您不需要更改問題的標題。 – 2009-11-07 01:20:14