簡體   English   中英

c_str使用不當

[英]Improper use of c_str

我有一個定義如下的方法:

const std::string returnStringMethod()
{
    std::string myString;

    // populate myString

    return myString;
}

現在,在調用者中,我做了類似這樣的事情:

const char * ptr = returnStringMethod().c_str(); 

正如我所看到的,這是返回一些我沒想到的截斷字符串。 但是,以下工作正常:

std::string str = returnStringMethod();
const char * ptr = str.c_str();

有人可以幫我理解這里發生的事情嗎?

PS:我們每周構建一次代碼。 我上周提交代碼時測試了這個,事情還不錯。 所以,我真的想知道我在這里可能缺少什么。

謝謝,帕萬。

第一個是未定義的行為,臨時的returnStringMethod()僅在尾隨時才有效; ,所以內部字符串(由c_str()返回)被銷毀,所以你留下了一個懸空指針。

第二個版本是有效的,因為str將在其范圍結束時被銷毀,並且其范圍與ptr相同(至少在您的示例中)。

例如,以下也是錯誤的:

const char * ptr = NULL;
{
    std::string str = returnStringMethod();
    ptr = str.c_str();
}

}之后, ptr不再有效。

returnStringMethod返回值是一個臨時字符串,其生命周期綁定到表達式本身; 這意味着在const char * ptr = returnStringMethod ().c_str ()初始化ptr之后,將立即銷毀調用c_strstd::string

這意味着ptr已被初始化的值與指向內存的點不再可訪問。


在后一種情況下,將returnStringMethod的返回值分配給std::string str您將擁有一個生命周期綁定到當前范圍的副本。 str.c_str ()的值賦值給ptr只要str處於活動狀態就有效。

const char * ptr = returnStringMethod().c_str();

在上面的行中,函數返回臨時字符串,該函數很快就會超出范圍。 (並且調用析構函數並釋放內存)

在以后的版本中,您可以創建字符串的本地副本,從而定義行為。

您還可以使用以下內容

const std::string &str = returnStringMethod();
const char * ptr = str.c_str();

使用const引用會延長臨時變量的生命周期,直到引用在范圍內,並且不存在(顯式)不需要的副本。

你正在返回一個(臨時)副本,那就是你執行c_str()的地方。

當臨時消失時,c_str()返回的char *變為無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM