当字符串保存在集合中时,c_str() 仍然有效吗

Tin*_*ggo 5 c++

我有一个旧项目需要维护,它使用了 const char * 。由于某种原因,我想保留大量运行时生成的字符串。所以我创建一个全局变量 std::set 来保存这些字符串。当生成一个新字符串时,除了添加到集合中之外,我还会返回并发送 newString.c_str() ,该字符串将保存在其他地方。例如。

std::set<std::string> g_stringDB;
void ArchieveString( AStruct *container, const char *temporaryString )
{
    auto it = g_stringDB.emplace( temporaryString );
    container->validString = it->first->c_str();
}
Run Code Online (Sandbox Code Playgroud)

我想知道容器何时被外部使用(我的意思是此功能之外的任何地方)。如果指针:validString仍然安全。由于集合内发生的复制、构造,指针是否有可能已经指向其他内容?如果不是,实现这一要求的理想方法是什么?

Mat*_*her 5

退货无效的规则c_str()是:

将对字符串的非常量引用传递给任何标准库函数,或者

对字符串调用非常量成员函数,不包括operator[]、at()、front()、back()、begin()、rbegin()、end() 和rend()。

对于集合元素,由于迭代器没有失效,所以一切都很好,字符串对象没有改变。

因此,如果字符串是固定的,那就没问题。