我刚开始经历安东尼威廉姆斯'本书" C ++并发行动"所以我试了一些东西。
我创建了一个基本上只是std :: string容器的类:
class stringTest {
public:
stringTest(std::string& text) : text{text} {}
void operator() () const { std::cout << text << std::endl; }
void changeText(std::string&& newText)
{
this->text = newText;
newText = std::string{ "here we go" };
}
private:
std::string text;
};
using bigObjectPtr = std::unique_ptr<stringTest>;
现在我想用函数processObject启动一个新的Thread,并使用std :: move将唯一指针移动到新线程。
void processObject(bigObjectPtr object)
{
object->changeText(std::string{"bla"});
object->operator() ();
}
int main()
{
stringTest text{ std::string{"this is a test"} };
bigObjectPtr object{ &text };
std::thread t{ processObject, std::move(object) };
t.join();
return 0;
}
这段代码编译得很好但是我遇到了运行时错误:
Debug Assertion Failed!
...
File: minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp
Line: 892
Expression: is_block_tpye_valid(header->block_use)
...
我做了一些更改,发现如果我只调用processObject而不是启动一个新线程并且只在调用operator()时出现错误消息,我会得到相同的错误,changeText工作得很好。
你能告诉我为什么这个错误信息出现在这里以及我做错了什么?
谢谢你, 最大