thread.detach() 函数的左值何时会超出以下代码的范围
when will the lvalue of a thread.detach() function goes out of scope in the code below?
>假设我执行以下操作:
void functionA(const char const input, int size)
{
char* dummyData = new char[size] ;
thread t(&functionB, dummyData);
t.detach();
}
void functionB(const char* data)
{
thread t2(&expendsiveFunction, data);
t2.join();
}
void expendsiveFunction(const char* data)
{
//do some expendsive stuff
delete[] data;
}
void main()
{
char* dataFromExternalSource; //lets assume this was provided from by an external soruce receive via TCP
functionA(dataFromExternalSource);
//do other stuff
}
我希望主线程可用于做其他事情,而我让分离的线程做艰苦的工作,在这种情况下,我说 dummyData 在 expendsiveFunction(( 完成之前不会超出范围是对的吗?
任何建议/评论都会有所帮助。
问题 2:所以即使我不在函数 B 中使用 thread.join((,如果函数 B(( 只是调用 expendsiveFunction(( ,线程 t 也会在 expendsiveFunction(( 结束时终止?(如果函数 B 是另一个类的一部分。
我会
说你说你不对,因为局部变量dummyData
在functionA
完成时超出范围,functionA
不会等待任何其他函数或线程完成。
但是,dummyData
指向的内存将保持有效,因为您使用 new[]
动态分配它。此内存在堆上,它永远不会"超出范围",因为它永远不会从堆栈中弹出;它将保持有效,直到您在代码中的某处调用delete[]
。
请注意,只有functionB
和expensiveFunction
保存对此内存的引用,因此这些函数是唯一可以释放此内存的函数;如果没有,那么您将有内存泄漏。
顺便说一句:你的代码不会编译;但这不是这里的问题。
相关文章:
- 使用基于数组和范围的 For 循环替换一些基本代码行
- 示例代码中使用分隔符将 std::string 拆分为 std::vector 的范围问题
- C++可以在全局范围内拥有代码吗?
- 函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容
- 代码作为 C 文件工作,但不作为C++文件,错误:'__builtin_types_compatible_p'未在此范围内声明
- 我已经编写了C++代码将 boost::optional 视为一个范围,但它无法编译
- 为什么当我的代码超出函数范围时,"does not name a type"出现编译器错误?
- 为什么我的 RLE 代码显示标准超出 C++ 的范围?
- 代码超出范围.如何动态分配此向量?
- 范围检查检测到的检测代码和超出范围的错误访问
- 为什么代码告诉我vectorsubsibrtion超出了范围
- 这是有效的C++代码吗?(在声明范围之外使用本地类型)
- 如何使用基于范围的循环来重写此代码
- 函数返回本地变量,尽管变量不超出范围,没有编译器问题,并且代码执行
- 代码块编译错误.Cin 未在此范围内声明
- 将代码从 C++ 移植到 C.如何处理这个基于矢量和范围的循环
- 为什么此代码会给出 Vector 超出范围错误
- thread.detach() 函数的左值何时会超出以下代码的范围
- 代码具有特定于函数的变量,用于更改范围之外的值
- 如何在标题文件中获取成员功能的正确代码覆盖范围