2017-06-16 47 views
0

以下代碼正在工作,我正試圖瞭解如何。引用C++臨時字符串的內容

int Process::processTextFile(const boost::filesystem::path& infile) 
{ 
    const char *file = infile.string().c_str(); 
    uint16_t num_lines = 0; 
    . 
    . 
    . 
    FILE *fp; 
    fp = fopen(file, "r"); 
    . 
    . 
    //Use fp for reading and stuff. 
} 

從我所瞭解的infile.string()創建一個臨時文件指向內容。當語句結束時(;)臨時字符串應該超出範圍,導致文件成爲懸掛指針。

我將使用字符串而不是char*但仍需要了解我所缺少的。

編譯器 - GCC 4.8.4
優化 - O3

+0

如果在調用'c_str()'和使用'const char * file'之前沒有其他局部變量被創建,你可能會很幸運*。該臨時字符串的內容仍可能存在於內存中,但您無法保證。結論:這是未定義的行爲,**不這樣做**。 – zett42

+0

@ zett42。更新我的問題。文件之後創建了局部變量。這段代碼已經使用了很長時間,並沒有失敗AFAIK。如果每次幸運我都有一分錢,現在我會成爲地球上最富有的人。 :)只是想確保我的理解沒有差距。 –

回答

-2

C++指定一個臨時的物體結合到參考爲const堆棧上的臨時的壽命延長到參考本身,這意味着的壽命const char *文件位於堆棧中。

這個C++機制可以避免您指定爲懸掛參考錯誤。 在上面的代碼中,臨時生命直到函數processTextFile的大括號。

您可以檢查GOTW瞭解更多信息。

+0

代碼中沒有const引用,並且沒有生命週期擴展。指針*是*搖晃。 – Quentin

+0

@Quentin:錯了。指針不是懸空的,我只是在上面的代碼上運行一個memcheck,並且沒有檢測到內存錯誤。 – PerelMan

+0

[見自己](http://coliru.stacked-crooked.com/a/e715101a0bb0c38d)。 – Quentin

2

infile.string()返回std::string類型的對象。並且.c_str()返回一個指向該對象某些內容的指針,所以file是一個指向該對象內容的指針。但在聲明結束時,std::string對象及其內容遭到破壞。結果,在下一個語句開始時,指針file指向任何地方。