假设我执行以下操作:
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
}
我希望主线程可用于执行其他操作,而我让分离的线程进行繁重的工作,在这种情况下,我是否正确地说,在scatndsiveFunction()完成之前,dummyData不会超出范围?< / p>
任何建议/评论都会有所帮助。
问题2:所以即使我不在函数B中使用thread.join(),如果functionB()只调用了expendsiveFunction(),那么线程t将在expendsiveFunction()的末尾终止? (如果functionB是另一个类的一部分..)
答案 0 :(得分:1)
我说你不对,因为当dummyData
完成时局部变量functionA
超出范围,functionA
不会等待任何其他函数或线程完成。
然而,dummyData
指向的内存将保持有效,因为您使用new[]
动态分配它。这个内存在堆上,它永远不会“超出范围”,因为它永远不会从堆栈中弹出;它会一直有效,直到您在代码中的某处调用delete[]
。
请注意,只有functionB
和expensiveFunction
拥有对此内存的引用,因此这些函数是唯一可以释放此内存的函数;如果他们不这样做,那么你就会有内存泄漏。
BTW:你的代码没有编译;但这不是问题所在。