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

前端之家收集整理的这篇文章主要介绍了c – 使用const char * literal作为std :: map键是否安全?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_0@
我有课,每个都返回它的名字
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,但我不确定它的多平台性.

解决方法

Is it safe to use const char * literal as a std::map key?

是.

但是,请注意,这不能保证找到您的对象(但可能会取决于实现):

data["Foo"]

这保证找不到你的对象:

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

使用基于std :: strcmp的自定义映射比较器将允许上述两种情况都起作用.

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

猜你在找的C&C++相关文章