2017-05-13 90 views
7

我有課,他們每個人返回其名稱使用const char * literal作爲std :: map key是否安全?

struct IFoo { 
    virtual const char * GetName() const = 0; 
} 

struct Foo : IFoo { 
    const char * GetName() const { return "Foo"; } 
} 

struct Bar: IFoo { 
    const char * GetName() const { return "Bar"; } 
} 

而且別的地方:

Foo* a = new Foo(); 
Foo* b = new Foo(); 

std::map<const char *, int> data; 
data[a->GetName()] = 0; 
printf("%i", data[b->GetName()]); 

字符串文字應被存儲在內存中的一個地方,但它是100%?這段代碼適用於gcc,但我不確定它的多平臺。

+2

是的,這是安全的,事實上提供是專門添加到C++標準,所以這個工作 –

+1

這是安全的,只要你用'GetName()'的結果調用operator []'。如果您嘗試用另一個翻譯單元的硬編碼「」Foo「調用它,結果不能保證。在'gcc'上它會起作用,因爲它默認會合並常量池。 – dasblinkenlight

+1

非常相關,幾乎是重複的:[字符串文字翻譯單元地址](http://stackoverflow.com/q/26279628/335858) – dasblinkenlight

回答

5

使用const char *作爲std::map的鍵是否安全?

是的。

然而,認爲這是不能保證找到你的對象(但可能取決於執行):

data["Foo"] 

,這是保證沒有找到你的對象:

char[] str = "Foo"; 
data[str]; 

使用基於std::strcmp的自定義映射比較器將允許上述兩種情況都起作用。

然後剩下的唯一陷阱就是存儲指向本地緩衝區的指針到地圖中的可能性,該指針會超過本地緩衝區。如果你僅僅存儲字符串文字,這種情況不會發生,但這是在使用地圖時必須牢記的事情。一個std::string鍵不會有這樣的警告。

相關問題