gpt4 book ai didi

C++ shared_ptr shared_from_this 抛出 bad_weak_ptr 异常,即使我有对它的引用

转载 作者:行者123 更新时间:2023-11-28 02:04:59 30 4
gpt4 key购买 nike

编辑:我从来没有弄明白这一点——我重构了代码,使其与 Boost 示例几乎相同,但问题仍然存在。如果其他人遇到此问题,则您的问题可能是更常见的 shared_from_this() 在不存在 shared_ptr 时(或在构造函数中)被调用。否则,我建议只从 boost asio 示例中重建。

我正在尝试做一些我认为很常见的事情,但我遇到了一些问题。

我正在使用 boost asio,并尝试创建一个 TCP 服务器。我接受与 async_accept 的连接,并创建共享指针。我有一个长期存在的对象(如连接管理器),它将 shared_ptr 插入到一个集合中。这是一个片段:

std::shared_ptr<WebsocketClient> ptr = std::make_shared<WebsocketClient>(std::move(s));
directory.addPending(ptr);
ptr->onConnect(std::bind(&Directory::addClient, &directory, std::placeholders::_1));
ptr->onDisconnect(std::bind(&Directory::removeClient, &directory, std::placeholders::_1));
ptr->onMessage(std::bind(&Directory::onMessage, &directory, std::placeholders::_1, std::placeholders::_2));
ptr->start();

目录有std::set<std::shared_ptr<WebsocketClient>> pendingClients;

添加客户端函数为:

void Directory::addPending(std::shared_ptr<WebsocketClient> ptr){
std::cout << "Added pending client: " << ptr->getName() << std::endl;
pendingClients.insert(ptr);
}

现在,当 WebsocketClient 启动时,它会尝试使用 shared_from_this() 创建一个 shared_ptr,然后启动一个 async_read_until ("\r\n\r\n"),并将该 shared_ptr 传递给 lambda 以保留所有权。它在实际调用 asio 函数之前崩溃,在 shared_from_this() 上。

调用堆栈如下所示:

server.exe!WebsocketClient::start()
server.exe!Server::acceptConnection::__l2::<lambda>(boost::system::error_code ec)
server.exe!boost::asio::asio_handler_invoke<boost::asio::detail::binder1<void <lambda>(boost::system::error_code),boost::system::error_code> >(boost::asio::detail::binder1<void <lambda>(boost::system::error_code),boost::system::error_code> & function, ...)
server.exe!boost::asio::detail::win_iocp_socket_accept_op<boost::asio::basic_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::ip::tcp,void <lambda>(boost::system::error_code) ::do_complete(boost::asio::detail::win_iocp_io_service * owner, boost::asio::detail::win_iocp_operation * base, const boost::system::error_code & result_ec, unsigned __int64 __formal) Line 142 C++
server.exe!boost::asio::detail::win_iocp_io_service::do_one(bool ec, boost::system::error_code &)
server.exe!boost::asio::detail::win_iocp_io_service::run(boost::system::error_code & ec)
server.exe!Server::run()
server.exe!main(int argc, char * * argv)

但是,当我调用 shared_from_this 时,我得到了一个 bad_weak_ptr。我认为当没有 shared_ptr 拥有这个对象时抛出,但是当我调用 addPending 时,我将“ptr”插入到一个集合中,所以应该仍然有一个对它的引用。

有什么想法吗?如果您需要更多详细信息,请询问,我会提供。这是我在 StackOverflow 上的第一篇文章,所以让我知道我可以改进什么。

最佳答案

您可能正在处理内存损坏问题。无论情况是否如此,您绝对应该采取一些故障排除步骤:

  1. 记录从make_shared返回的指针值, 并在调用 shared_from_this 之前再次进入成员函数.检查该指针值是否存在于您的运行对象表中(这实际上就是 set<shared_ptr<...>> 是什么)
  2. 仪器构造函数和析构函数。如果shared_ptr count 实际上为零,它将调用您的析构函数,调用堆栈将为您提供有关该问题的信息。

如果这没有帮助,您正在使用 make_shared 的事实应该很有用,因为它保证元数据 block 紧挨着对象。

  1. 使用memcpy在不同时间转储对象之前的原始字节并观察潜在的损坏。

大部分此类日志记录将发生在表现出未定义行为的上下文中。如果编译器发现您正在测试一些不应该发生的事情,它实际上可能会删除该测试。在这种情况下,您通常可以通过精确使用 #pragma 设法使测试正常进行。仅在您的调试日志记录代码上禁用优化 - 您不想更改其余代码的优化设置,因为这可能会改变损坏的表现方式而无需实际修复它。

关于C++ shared_ptr shared_from_this 抛出 bad_weak_ptr 异常,即使我有对它的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37891443/

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