2010-03-25 70 views
22

現在我有一個函數必須返回一個字符串。我看到了一個特殊的實現,他從函數中返回一個const char *。從函數返回「const char *」是個好主意嗎?

事情是這樣的:

const char * GetSomeString() 
{ 
    ........ 
    return somestlstring.c_str(); 
} 

SomeOtherFoo() 
{ 
    const char * tmp = GetSomeString(); 
    string s = tmp; 
} 

現在我覺得有一些潛在的錯。我的直覺是對的嗎?或者這是一個完全安全的代碼?

請給我你的建議。我有一種感覺,回報爲const char *這樣可能會導致混亂..

感謝, 阿瓊

回答

26

根據什麼somestlstring是什麼,正在做那裏。

如果你是返回一個指針到內存GetSomeString完成時被釋放一個局部變量,所以它是一個懸擺指針和錯誤。

這一切都歸結爲somestlstring壽命,你就可以進行操作。由.c_str()返回的指針保證僅對字符串中的下一個變異操作有效。因此,如果有什麼東西從撥打.c_str()並且s被修建之前將somestlstring更改,您將處於未定義的行爲狀態。

6

如果你問有關的std::stringc_str()函數返回的const char *的一生,直到你修改你,或者直到字符串被破壞獲取的字符串,它是有效的。從函數中返回它是可以的(儘管我會說不是很好的做法),前提是你牢記這兩個事實。

2

這不是偉大的 - 多長時間你的字符串的內存留下來?誰負責刪除它?它是否需要刪除?

你最好返回一個字符串對象,負責分配和釋放字符串內存 - 這可能是一個的std :: string,或爲QString(如果你使用Qt),或CString的(如果你'使用MFC/ATL)。在一個稍微不同的音符

,將您的字符串永遠是Unicode?大多數串類可以使用Unicode數據處理透明,但爲const char不會...

1

這取決於其中的somestlstring變量所在。

如果它是一個變量區域的GetSomeString()功能,那麼這顯然是錯誤的。實際上,somestlstring變量在函數結束時被銷燬,因此const char *指向的東西不再存在。

如果它是一個全局變量,那麼這段代碼是正確的。

3

在@Neil闡述的條件下,這是行得通的。但是更好的辦法是參考返回字符串

string const& GetSomeString() 
{ 
    ........ 
    return somestlstring; 
} 

string s = GetSomeString(); 

仍然牢記'somestlstring`不能是局部自動變量,但保存在其他地方在命名空間或類。否則,你可以通過值

string GetSomeString() 
{ 
    ........ 
    return somestlstring; // can be a local automatic variable 
} 

string s = GetSomeString(); 
+2

除非somestlstring是一個本地函數作用域。 :-) – Konrad 2010-03-25 10:22:40

+2

@Konrad肯定,但我也說過,在我的答案後,我展示了代碼。 :) – 2010-03-25 10:40:08

1

返回字符串添加一些場景中,這將是確定的:

  • somestlstring是GetSomeString在同一個翻譯單元(的.cpp)初始化的全局變量( )
  • somestlstring是一個非靜態類成員,GetSomeString是該類的成員。在這種情況下,返回的指針的生命週期必須被記錄下來(基本上 - 正如其他人所說的 - 直到嚴重的更改或對象被銷燬)
  • 您正在將字符或編譯時初始化字符串返回到char const *
相關問題