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

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

最佳答案

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

是的。

但是,考虑到这不能保证找到您的对象(但可能,具体取决于实现):

data["Foo"]

并且保证找不到您的对象:

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

使用基于 std::strcmp 的自定义 map 比较器将允许上述两种情况都有效。

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

关于c++ - 使用 const char * literal 作为 std::map 键是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43951388/

相关文章:

javascript - 如何使用 Javascript、URL 和 key 对数据库进行 ajax 调用

c++ - 读取内存指针卡住进程

c++ - 使用 CRITICAL_SECTION 锁定/解锁功能

c++ - 这个赋值运算符后面的 & 是什么意思?

c++ - 根据维度启用一个operator()

javascript - 从对象中删除特定键

java - 在 Java 中拦截/禁用系统键

c++ - std::string 赋值时出现段错误

c++ - 为什么 difftime 只返回整数?

c++ - 在 C++ 中定义自己的异常类