VC ++ 2015:std :: move on unique pointer runtime assertion failure

时间:2015-08-12 18:36:51

标签: c++ c++11 visual-c++ unique-ptr

我刚开始经历安东尼威廉姆斯'本书" 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工作得很好。

你能告诉我为什么这个错误信息出现在这里以及我做错了什么?

谢谢你, 最大

0 个答案:

没有答案