Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将字符串指针传递给在C+中不同线程上运行的函数+;和Xcode 11.1_C++_Xcode_Multithreading_Stdthread - Fatal编程技术网

C++ 将字符串指针传递给在C+中不同线程上运行的函数+;和Xcode 11.1

C++ 将字符串指针传递给在C+中不同线程上运行的函数+;和Xcode 11.1,c++,xcode,multithreading,stdthread,C++,Xcode,Multithreading,Stdthread,我尝试运行下面的简单示例 void printString(const char* s) { std::cout << s << std::endl; } int main() { std::string str = "hello world"; std::thread T3(printString, str.c_str()); } 我使用的是Xcode 11.1 如果要编译,这段代码还能工作吗?由于线程共享同一堆,线程T3应该能够访问

我尝试运行下面的简单示例

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

int main()
{
      std::string str = "hello world";
      std::thread T3(printString, str.c_str());
}
我使用的是Xcode 11.1

如果要编译,这段代码还能工作吗?由于线程共享同一堆,线程
T3
应该能够访问
str.c_str()
对吗?假设在堆上分配了
std::string
缓冲区


谢谢

为了使用std::thread,您需要包含一个适当的头文件。然后,您必须决定等待线程完成其工作,还是将其分离。否则,std::thread将在析构函数中调用std::terminate。另一个问题是,如果main返回并释放字符串,printString函数中将有一个悬空指针

因此,一个可能的解决方案

#include <thread>
#include <iostream>

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

int main()
{
      std::string str = "hello world";
      std::thread T3(printString, str.c_str());
      T3.join();
      return 0;
}
#包括
#包括
无效打印字符串(常量字符*s)
{

STD::CUT< P>我通过设置CGOW使用C++ 11

解决了这个问题。
set (CMAKE_CXX_STANDARD 11)

生成的Xcode项目现在设置了正确的编译器标志,并且发布的代码可以正确编译。

不,此代码将无法工作。这几乎是一个保证崩溃。谢谢。那么,如何将字符串从主线程传递到子线程呢?请先找出编译错误。一旦我添加了,显示的代码对我来说编译没有问题d所有缺少的include。然后,您必须确保传递给新线程的字符串/指针都是有效的。这就是您在问题中的目的。但是您的
main()
立即返回,不能保证新执行线程启动时字符串仍然存在。无论如何,这是一个有保证的崩溃,因为您必须在新执行线程的
std::thread
被销毁之前
main()
返回。为避免崩溃,请按值传递字符串。此代码不会编译。我会收到相同的错误消息。
set (CMAKE_CXX_STANDARD 11)