2016-01-19 88 views
1

我從this answer知道字符串文字是靜態分配的。但是下面的字符串連接也可以安全使用嗎?連接字符串文字上的c_str()是否安全?

void someFunction(std::string& foo) { 
    functionTakingCString(("start " + foo + " end").c_str()); 
} 

跟進質詢,:正如評論指出,functionTakingCString將存儲指針時,這將是不安全的確實。在這種情況下,以下內容是否有效:

void someFunction(std::string& foo) { 
    std::string bar = "start " + foo + " end"; 
    functionTakingCString(bar.c_str()); 
} 
+6

只要'functionTakingCString'不存儲該指針,並且有東西試圖在臨時'std :: string'的生命週期之外使用它。 – LogicStuff

+0

感謝您的評論 - 我添加了一個關於您的建議的後續問題 – PhilLab

+1

'bar's的生命無論如何都會在'}'處結束,所以它在您的示例中基本上是相同的問題。 – Default

回答

3

級聯字符串僅在functionTakingCString(("start " + foo + " end").c_str());正在運行時分配。然後內存被釋放,並且指針不再安全使用,因爲您可以閱讀here。如果該指針傳遞給functionTakingCString之後運行的任何內容,那麼您將遇到麻煩。