gpt4 book ai didi

c++ - 为什么 std::make_unique(somefun()) 在我没有调用 release() 时会产生崩溃,而在调用时会产生崩溃?

转载 作者:行者123 更新时间:2023-11-30 01:40:02 26 4
gpt4 key购买 nike

我的代码:

{
t = std::make_unique<std::thread>(std::bind(&Widget::generateNum, this));
}

~thread() 处崩溃,错误消息是“r6010 abort() has been called”。如果我在破坏 t 之前没有调用 t.release(),将导致崩溃。

最佳答案

在销毁线程之前必须分离或加入线程。

auto t = std::make_unique<std::thread>(std::bind(&Widget::generateNum, this));

// Either do this:
t->detach();
// or do this:
t->join();
// before *t gets destroyed.

分离还是加入取决于您,但您必须选择其中之一。如果一个非空的 std::thread 被销毁,它将调用 std::terminate,结束你的程序。

参见 std::thread::~thread :

If *this has an associated thread (joinable() == true), std::terminate() is called.

默认的 std::terminate 处理程序调用 std::abort,因此调用了 abort 的消息。

不要调用 t.release()

调用 t.release() 是错误的。这会泄漏 std::thread 对象。

关于c++ - 为什么 std::make_unique<std::thread>(somefun()) 在我没有调用 release() 时会产生崩溃,而在调用时会产生崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44297234/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com