gpt4 book ai didi

c++ - 将指向临时 std::string 的指针传递给另一个线程

转载 作者:太空宇宙 更新时间:2023-11-04 15:55:31 26 4
gpt4 key购买 nike

考虑以下 C++ 程序

#include <iostream>
#include <thread>
#include <string>

std::string getString() {
return "hello world";
}

void printString(const char* s)
{
std::cout << s << std::endl;
}

int main()
{
std::thread T(printString, getString().c_str());

T.join();

return 0;

}

getString() 的调用将返回一个临时的 std::string 并且值 getString().c_str() 是一个指向临时堆栈变量的指针。

由于每个线程都有自己的堆栈(但共享堆),因此将指向主线程上的字符串的指针传递给某个线程 T 在理论上应该行不通,对吧?

为什么这段代码编译并运行打印 hello world ?还是我遇到了某种未定义的行为?

编辑:

如果程序看起来像这样(没有线程)怎么办

#include <iostream>
#include <thread>
#include <string>

std::string getString() {
return "hello world";
}

void printString(const char* s)
{
std::cout << s << std::endl;
}

int main()
{
printString(getString().c_str());
return 0;

}

最佳答案

Or am I running into some kind of undefined behavior?

这正是发生的事情。从 getString 返回的字符串只存在到 epxresion 结束

std::thread T(printString, getString().c_str());

这意味着在 printString 中,您有一个指向不再有效的数据的指针。您可能会得到它包含的内容,或者可能会发生其他事情。访问指针是未定义的行为,因此您得到的任何结果都是“正确的”。


如果将 getString 更改为

const char * getString() {
return "hello world";
}

然后像这样创建线程

std::thread T(printString, getString());

那么这就没问题了,因为 "hello world" 具有静态存储持续时间,因此它将在程序的剩余生命周期中存在

关于c++ - 将指向临时 std::string 的指针传递给另一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58840418/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com