我们有一个函数GetString()
返回std::string
。然后,我们有了一个使用C样式字符串的ConsumeString(char*)
函数。
编写ConsumeString(GetString().c_str())
是一个错误吗?在我看来,这似乎是一个错误,因为在运行c_str()
之后,原始的匿名字符串将被破坏,并且您将拥有一个不再存在的指针。但是奇怪的是,它似乎总是可以正常工作。
我只是注意到,当我尝试将GetString().c_str()
分配给变量然后在两个单独的ConsumeString()
函数中使用它时,这可能是个问题,这时它打印了损坏的字符串,问题变得很明显。但是我不知道为什么在前一种情况下它会起作用。
它是否可能是恰好起作用的错误,还是C++专门允许这样做?
最佳答案
除非ConsumeString(直接或间接)对提供给它的const char*
进行异步处理,否则此代码非常安全。GetString()
返回的临时文件将一直存在,直到函数ConsumeString
返回为止,因此,如果在返回之前完成所有与参数有关的工作,则一切将正常工作。
在您的其他情况下-我假设您有这样的事情:
const char* s = GetString().c_str(); // 1
ConsumeString(s); // 2
第1行结束后,由GetString
返回的临时文件被销毁,因此ConsumeString
使用了无效的指针。有关临时对象的生存期的更正式的措辞,可以引用cppreference,特别是