const std::string makeUniqueName()
{
srand(time(NULL));
std::string s;
std::generate_n(const_cast<char*>(s.c_str()), 10, RndGenerator());
return s;
}
此代码是否安全:编译器不会报告任何警告消息。
答案 0 :(得分:3)
代码显然通过写入尚未分配的内存来调用未定义的行为。构造具有足够空间的字符串(std::string s(10, 0);
)并将std::begin(s)
传递给generate_n
或使用std::back_inserter
。
此外,通过在const_cast
指针上使用const
,您再次调用未定义的行为(从const
对象中删除const
,然后写入未定义的行为)
另外:不按const
值返回,它会禁止移动语义,而不想要这样做。
答案 1 :(得分:2)
好吧,如果要写入字符串,则需要为字符串分配一些存储空间。
也许更重要的是,您必须停止在const_cast
上使用c_str()
。您不能修改c_str()
指向的内存。就目前而言,您的代码会调用未定义的行为。
即便如此,您的代码每次调用时都不一定会生成唯一的名称。您可以将它调用两次非常接近,time(NULL)
为两个调用返回相同的内容。或者您可能会发现即使使用不同的种子,您的RNG也会返回相同的值。
答案 2 :(得分:2)
不,这不安全!
您的字符串中没有任何内容,并且您尝试向其中添加10个项目。您需要在字符串中保留空格,如下所示:
std::string s(10,' ');
如果您要开始直接写作。
答案 3 :(得分:2)
绝对不安全。 C ++标准明确禁止修改c_str指向的值。编译器不会因为const_cast而抱怨,但仍然是错误的。