使用const char * literal作为std :: map键是否安全?

时间:2017-05-13 09:20:14

标签: c++ c++11 key stdmap string-literals

我有类,每个类都返回其名称

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中有效,但我不确定它的多平台性。

1 个答案:

答案 0 :(得分:5)

  

const char *字面值用作std::map密钥是否安全?

但是,请注意,这不能保证找到您的对象(但可能会根据实现情况而定):

data["Foo"]

这保证找不到你的对象:

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

使用基于std::strcmp的自定义地图比较器可以使上述两种情况都有效。

然后剩下的唯一陷阱是可能将指向本地缓冲区的指针存储到地图中,这将超过本地缓冲区。如果你当然只存储字符串文字,那就不会发生,但这是你在使用地图时必须记住的事情。 std::string密钥不会有这样的警告。