这段代码安全吗?

时间:2014-01-22 11:21:01

标签: c++

const std::string makeUniqueName()
{
    srand(time(NULL));
    std::string s;                                                                                                             
    std::generate_n(const_cast<char*>(s.c_str()), 10, RndGenerator()); 
    return s;
}

此代码是否安全:编译器不会报告任何警告消息。

4 个答案:

答案 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而抱怨,但仍然是错误的。