const std::string makeUniqueName()
{
srand(time(NULL));
std::string s;
std::generate_n(const_cast<char*>(s.c_str()), 10, RndGenerator());
return s;
}此代码是否安全:编译器不报告任何警告消息。
发布于 2014-01-22 11:28:27
代码显然通过写入尚未分配的内存来调用未定义的行为。要么用足够的空间构造这些字符(std::string s(10, 0);)的字符串,然后将std::begin(s)传递给generate_n,要么使用std::back_inserter。
此外,通过在const_cast指针上使用const,您再次调用未定义的行为(从const对象中移除const,然后写入它是未定义的行为)。
另外:不要返回const值,它会抑制移动语义,而您不希望这样做。
发布于 2014-01-22 11:22:51
如果您想要写入字符串,则需要为它分配一些存储空间。
也许更重要的是,您必须停止在c_str()上使用c_str()。不允许修改c_str()指向的内存。目前,您的代码调用未定义的行为。
即使这样,您的代码也不一定会在每次调用时生成唯一的名称。您可以将它称为非常接近的两次,time(NULL)对这两个调用都返回相同的内容。或者您可能会发现,即使有不同的种子,RNG也会返回相同的值。
发布于 2014-01-22 11:24:41
不,不安全!
您的字符串中没有任何内容,您正在尝试向其中添加10项。您需要在字符串中保留如下空间:
std::string s(10,' ');如果你要直接写信给它的话。
https://stackoverflow.com/questions/21281509
复制相似问题