2016-12-20 36 views
1

我遇到這種模式的多個實例(與升壓::文件系統只作爲例子):終身返回的字符串和它們的.c_str()

boost::filesystem::path path = ...; 
someFunctionTakingCStrings(path.string().c_str()); 

其中

const std::string path::string() const 
{ 
    std::string tmp = ... 
    return tmp; 
} 

雖然我從來沒有遇到過這種模式的問題,但我想知道sting()返回的字符串何時被銷燬,以及訪問c_str()的代碼是否安全如c_str() lifetime is bound to std::string lifetime

+0

爲什麼它被標記爲C問題? – wasthishelpful

+0

因爲它有c_str()在裏面 – PhilLab

+2

@PhilLab:但是這並不意味着它會編譯*在C ;-) – Bathsheba

回答

2

someFunctionTakingCStrings(path.string().c_str());是安全的,因爲該標準保證了匿名臨時的path.string()的生命期在該函數調用中仍然存在。所以c_str()返回的指針是someFunctionTakingCStrings的有效參數。

const std::string path::string() const是安全的,因爲,從概念上講,你是返回的tmp的值複製,但在實踐中,編譯器將優化出來的值複製(稱爲命名返回值優化過程)。

喜歡的東西const std::string& path::string() const具有相同功能的身體,你必須將定義(因爲引用將吊着)之一,並

const char* ub_server() 
{ 
    std::string s = "Hello"; 
    return s.c_str(); 
} 

也是不確定的,因爲s超出範圍在函數返回時。

最後,請注意,在函數調用中將一個指向匿名臨時參數的指針用作標準C++允許的而不是,儘管煩人的是Visual C++允許它作爲擴展。

+0

謝謝。快速跟進:所以,'functionTakingPointer(&path.string())''也是安全的? – PhilLab

+0

@PhilLab:不,它在標準C++中是不安全的。我已經把答案放在了最後。 – Bathsheba

+0

hm,那麼我完全沒有理解path.string()的生命週期。或者是匿名的,他們自己會關注內存管理的一整章內容? – PhilLab

相關問題