2017-05-08 50 views
0

此代碼是否安全?只是因爲它沒有錯誤地運行,我擔心我正在爲自己設置一個陷阱。將ptr傳遞給返回的std :: string

void targetMethod(const char *arg); 
std::string helperMethod(char *text) { return std::string(text); } 

targetMethod(helperMethod().c_str()); 

helperMethod()返回的std :: string,並調用代碼獲取其潛在的char *,並將它傳遞給targetMethod()。我擔心返回的字符串是臨時的,因此考慮它的底層char *是危險的。所以相反,我應該這樣做:

std::string myTemp = helperMethod("hello"); 
targetMethod(myTemp.c_str()); 
+0

謝謝,科迪。我需要磨礪我的搜尋。 – MJF

回答

2

這取決於targetMethod做什麼。如果它將指針存儲起來供以後使用,則不,這是不安全的。但是如果它只是在函數調用期間使用它,那麼是的,它是安全的。字符串的生命週期延伸到創建它的完整表達式的末尾。

2

臨時將直到表達式結尾(直到分號),因此它是安全的。

話雖如此,我不知道你爲什麼需要helperMethod,因爲你可以從const char *構造一個std :: string。

+0

「所以它是安全的」 - 只要'targetMethod'不保存指針的副本。 – lcs

+0

是的。其他答案添加了「複製指針」警告,並且是正確的。 –

+0

helperMethod()在現實世界中做得更多;它看起來像它在示例中僅用於顯示發生了什麼。 – MJF

相關問題