gpt4 book ai didi

c++ - 移动构造函数是否使 shared_from_this 无效

转载 作者:行者123 更新时间:2023-11-30 03:16:15 30 4
gpt4 key购买 nike

我想用一个包含不可复制成员的类来启动一个线程。为了与线程通信,我想在将对象移入线程之前从该对象创建一个共享指针。

移动构造函数是否使共享指针无效?如果是这样,那么优雅的 c++ 方法是什么?一种解决方案是将 MessageClient 包装到一个共享指针中,但这会绕过移动构造函数。

class MessageClient : public std::enable_shared_from_this<MessageClient> {
private:
boost::asio::io_context io_context;

void send() {
// code
}

void operator() () {
// code
}
};

int main () {
MessageClient client;
auto pclient = client.shared_from_this();
std::thread thread(std::move(client));

pclient->send(); // terminate called after throwing an instance of 'std::bad_weak_ptr'
// what(): bad_weak_ptr
// Aborted (core dumped)
thread.join();
}

编辑

我得到了答案。我现在明白我错误地使用了 enable_shared_from_this ,但真正的答案是,没有办法解决不涉及将对象包装到另一个对象中的问题,例如智能指针或 lambda 函数(将对象包装到仿函数中)。就我个人而言,我发现第二种解决方案更简单,这就是我选择它的原因。

MessageClient client;
std::thread thread([&client](){client.run();});

client.send();

EDIT2

我找到了一个更明显的解决方案。如果我从对象创建引用,则不必包装它:

MessageClient client;
std::thread thread(std::ref(client));

client.send();

最佳答案

源自 enable_shared_from_this暗示每个实例都属于某个shared_ptr秒。你的问题是 client不是,并且与将其移动到线程中无关。

您在此行有未定义的行为:

auto pclient = client.shared_from_this();

只需使用 std::shared_ptr<MessageClient>从一开始。

class MessageClient {
private:
boost::asio::io_context io_context;

void send() {
// code
}

void operator() () {
// code
}
};

int main () {
auto pclient = std::make_shared<MessageClient>();
std::thread thread([pclient]() { (*pclient)(); });

pclient->send();

thread.join();
}

关于c++ - 移动构造函数是否使 shared_from_this 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56489561/

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