2013-02-07 45 views
2

返回一個值時,如果我有以下兩種功能差異()從一個函數

std::string foo1() 
{ 
    std::string temp; 
    ... 
    return temp; 
} 

const char* foo2() 
{ 
    std::string temp; 
    ... 
    return temp.c_str(); 
} 

而這需要一個const char *作爲輸入的函數;

void bar(const char* input) { ... } 

哪一個是比較安全的事:

bar(foo1().c_str()); 

bar(foo2()); 

如果所有我想要做的就是傳遞一個字符串作爲輸入欄,然後不關心foo函數的返回值是否真的很重要?

+0

感謝您的所有答案,我不會在C中做這樣的事情(我會返回一個malloc'ed指針),但我不確定C++在後臺執行何種操作時轉換std :: string到一個const char *。 – Nobilis

+2

如果有幫助,在C++中'std :: string'就等於malloc'ed指針。它只是自動釋放和strcpy等等。 C++需要一種與C完全不同的思維方式。 –

+0

這就是我對它的想法,並且自己也認爲這是返回c_str()的情況:) – Nobilis

回答

8
const char* foo2() 
{ 
    std::string temp; 
    ... 
    return temp.c_str(); 
} 

foo2()是不安全的,你返回const char*一個局部變量將指向垃圾當函數返回。

只要使用foo1這是一種安全和習慣用C++來返回對象的方式。 NRVO可能會啓動 ,當foo1返回時,將會暫停temp的副本。

std::string foo1() 
{ 
    std::string temp; 
    ... 
    return temp; 
} 
+0

但是,返回的指針不存在於靜態內存中嗎? – 0x499602D2

6
const char* foo2() 
{ 
    std::string temp; 
    ... 
    return temp.c_str(); 
} 

是不是安全可言,因爲temp就會被破壞,所以你會返回一個懸擺指針。

0

foo2返回一個指向局外變量的指針,該變量在退出函數時被銷燬。 (這很糟糕)

2

bar(foo2());僅僅是錯誤的...因爲當foo2返回時,temp std :: string被銷燬,而c_str()返回的指針現在指向一個無效的位置。

2

只要原始字符串對象沒有被銷燬,c_str的字符數組就是有效的。 This has been asked before.。在函數結束時,temp被銷燬,這意味着foo2()返回無效指針。因爲c_str()返回的指針是無效的std::stringtempfoo2返回時被銷燬

1

foo2版本是不安全的。 foo1更安全,因爲它會返回std::stringtemp的副本。