- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:我从来没有弄明白这一点——我重构了代码,使其与 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 上的第一篇文章,所以让我知道我可以改进什么。
最佳答案
您可能正在处理内存损坏问题。无论情况是否如此,您绝对应该采取一些故障排除步骤:
make_shared
返回的指针值, 并在调用 shared_from_this
之前再次进入成员函数.检查该指针值是否存在于您的运行对象表中(这实际上就是 set<shared_ptr<...>>
是什么)shared_ptr
count 实际上为零,它将调用您的析构函数,调用堆栈将为您提供有关该问题的信息。如果这没有帮助,您正在使用 make_shared
的事实应该很有用,因为它保证元数据 block 紧挨着对象。
memcpy
在不同时间转储对象之前的原始字节并观察潜在的损坏。大部分此类日志记录将发生在表现出未定义行为的上下文中。如果编译器发现您正在测试一些不应该发生的事情,它实际上可能会删除该测试。在这种情况下,您通常可以通过精确使用 #pragma
设法使测试正常进行。仅在您的调试日志记录代码上禁用优化 - 您不想更改其余代码的优化设置,因为这可能会改变损坏的表现方式而无需实际修复它。
关于C++ shared_ptr shared_from_this 抛出 bad_weak_ptr 异常,即使我有对它的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37891443/
在尝试研究我的问题时,我已经阅读了许多有关 shared_from_this、bad_weak_ptr 异常和多重继承的堆栈溢出文章。他们都建议您从 enable_shared_from_this 继
如您所知,不可能在对象的构造函数中使用 std::enable_shared_from_this 和 shared_from_this() 对,因为包含该类的 shared_pointer 尚不存在。
我正在尝试使用 shared_from_this 函数创建指向 this 的共享指针。 #include #include class foo { public: virtual void
有时一个类需要获得一个shared_ptr对自己。实现此目的的一种方法(当您知道类的对象将始终存在于 shared_ptr 中时)是从 std::enable_shared_from_this 派生。
我正在编写具有类似 Blender 功能的基于 Qt 的应用程序。 它由一个“框架”组成,即 GUI + 插件系统和插件。插件是带有基本上可以创建和显示的对象(例如 Sphere、Box 等)的 Qt
有人能用几句简洁的话总结一下如何 boost shared_from_this<>()应该使用智能指针,特别是从使用绑定(bind)函数在 io_service 中注册处理程序的角度来看。 编辑:一些
我有一个资源管理器,就像 Andrei Alexandrescu 在 Modern C++ Design 一书中提出的那样,它遵循基于策略的设计。不过我遇到了麻烦,因为我的资源管理器需要能够通过 sh
我必须在创建容器时在容器中注册一个对象。如果没有智能指针,我会使用这样的东西: a_class::a_class() { register_somewhere(this); } 使用智能指针我
这个问题在这里已经有了答案: How to enable_shared_from_this of both parent and derived (4 个回答) 1年前关闭。 不能std::share
我有一些派生自 boost::shared_from_this 的类 - 我如何在 Qt 中执行等效的操作? (无需重新实现类似的 shared_from_this;我更喜欢无继承解决方案) 最佳答案
#include #include #include #include class A: public boost::enable_shared_from_this { typedef
我想使用 shared_from_this() 从通过引用传递的对象中获取 std::shared_ptr。但是,我希望对可能不在共享指针中或者甚至可能不是动态分配的对象保持健壮。 在调用 share
我想用一个包含不可复制成员的类来启动一个线程。为了与线程通信,我想在将对象移入线程之前从该对象创建一个共享指针。 移动构造函数是否使共享指针无效?如果是这样,那么优雅的 c++ 方法是什么?一种解决方
假设我们有一个类 Foo 定义如下: // foo.hpp class Foo; using FooCallback = std::function ins)>; class Foo : public
当从继承自 enable_shared_from_this 的类型中调用 shared_from_this 时,如果 this 当前未被 shared_ptr 对象持有(通常是应用程序崩溃),可能会发
当我这样做时出现异常:std::bad_weak_ptr->shared_from_this() template class painter_record_t { ....... private:
我想从继承自 enable_shared_from_this 的类 A 创建一个仿函数,它适用于这样的类: class A: public std::enable_shared_from_this {
在this source file有两个类:tcp_connection 和 tcp_server。在我看来,我已经选择了相关的代码位,但您可能想要引用完整的源代码以获取更多信息。 class tcp
在我的代码中,我使用 boost::threads我有一个通过名为 fnThread() 的成员函数运行线程的类.在此 fnThread() 中,我想创建一个 shared_from_this() 并
这个问题在这里已经有了答案: How to break shared_ptr cyclic reference using weak_ptr (1 个回答) 关闭 6 年前。 我有两个类,A 和 B
我是一名优秀的程序员,十分优秀!