使用 const char * literal 作为 std::map 键是否安全?
Is it safe to use const char * literal as a std::map key?
我有类,每个return名字
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
键不会有这样的警告。
我有类,每个return名字
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 astd::map
key?
是的。
但是,考虑到这不能保证找到您的对象(但可能,具体取决于实现):
data["Foo"]
而且保证找不到你的对象:
char[] str = "Foo";
data[str];
使用基于 std::strcmp
的自定义地图比较器将允许上述两种情况都有效。
那么剩下的唯一陷阱就是将指向本地缓冲区的指针存储到映射中的可能性,这将超过本地缓冲区。如果您只存储字符串文字,当然不会发生这种情况,但这是您在使用地图时必须记住的事情。 std::string
键不会有这样的警告。