在参数列表中构造一个对象并将指向该对象内部数据的指针传递给函数是否安全?

Is constructing an object in an argument list and passing a pointer to internal data of the object to the function safe?

提问人:BlueCannonBall 提问时间:7/28/2023 最后编辑:Jan SchultkeBlueCannonBall 更新时间:9/9/2023 访问量:815

问:

下面的 C++ 代码格式是否正确?函数执行完毕之前或之后会被销毁吗?std::string

void my_function(const char*);

...

my_function(std::string("Something").c_str());

我知道我可以做到,但我用这种方式来说明我的观点。my_function("Something")std::string

C++ 字符串 临时对象

评论

5赞 user4581301 7/28/2023
但说真的,暂时的会在表达结束时死亡。这将是在函数调用之后。只要不将指针存储在寿命更长的地方,你就很好。stringmy_function
2赞 user4581301 7/28/2023
一些近乎规范的文档
6赞 Nelfeal 7/28/2023
我很惊讶我找不到一个好的副本。我得到的最接近的是这个
3赞 user4581301 7/28/2023
下面是规范文档有关表达式何时结束的一些支持信息。找到的时间比我想象的要长。但是要去CPP参考的东西。我读起来就像是从火星人翻译过来的,但在某种程度上,那是因为它是。
1赞 John Bollinger 7/29/2023
很难理解为什么你提出这种结构而不是简单的.我的意思是,当然,在 C++ 中比 C 字符串更受青睐,但是当您有一个无论如何都需要 C 字符串的函数时,使用 a 来制作一个非常好的 C 字符串的临时副本以传递给它有什么意义?my_function("Something");std::stringconststd::string

答:

26赞 user17732522 7/28/2023 #1

std::string 会在函数完成执行之前还是之后被销毁?

临时对象在实现它们的完整表达式的末尾(例如,通常是表达式语句的末尾)被销毁(除了一些例外,此处无关)。

这里的对象是跨整个表达式语句的完整表达式中的临时物化对象。因此,在您的示例中,它在返回后被销毁。std::stringmy_function(std::string("Something").c_str());my_function