2012-12-25 30 views
4

用下面的範圍內:字符* C++容器

#include <set> 

std::set<const char *> global = std::set<const char *>(); 
void x() { 
    const char *c = "a"; 
    const char *d = "b"; 

    global.insert(c); 
    global.insert(d); 
} 

int main() { 
    x(); 
    for (std::set<const char *>::const_iterator iter=global.begin(), end=global.end(); iter!=end; ++iter) { 
     printf("%s\n", *iter); 
    } 

    return 0; 
} 

最後,正如所料,我接收ab打印。

然而,是否有任何保證,例如,如果該組是bozo對象的一部分,那麼他們將持續到bozo的一生結束?或者我需要strdup的字符串才能確定?

+0

對於相同的效果,所有'= std :: set ()'都可以安全地移除。 – chris

回答

8

你完全沒問題,因爲字符串文字具有靜態存儲持續時間。也就是說,字符串將在程序執行期間在內存中。但是,它不會是好的,如果你已經宣佈你cd像這樣的數組:

const char c[] = "a"; 
const char d[] = "b"; 

這是因爲當數組用於字符串初始化,從字面的字符複製到陣列。該陣列具有自動存儲持續時間,因此內容將在功能x的末尾被銷燬。如果你還在做global.insert(c),你會推入一個指向c數組的第一個元素的指針,但該數組將不會存在很長時間。

這是一些標準的引號。首先,§2.14.5/ 8:

普通字符串文字和UTF-8字符串文字也被稱爲窄字符串文字。窄字符串文字的類型爲「數組nconst char」,其中n是如下定義的字符串的大小,並具有靜態存儲持續時間(3.7)。

現在靜態存儲持續時間的定義(§3.7.1/ 1):

不具有動態存儲時間,不具有線程存儲時限,而不是本地的所有變量有靜態存儲時間。這些實體的存儲應在程序期間持續(3.6.2,3.6.3)。

+0

非字符串文字怎麼樣? (這只是一個例子) – Matoe

+1

要注意的是'char a [] =「c」;',當函數退出時它將消失。 –

+0

@MatsPetersson是的,我就在那! –