我很难理解为什么这个代码会抛出。 SO上的所有其他解决方案都说你需要有一个shared_ptr实例才能使用shared_from_this(),我就拥有了它! 但尽管如此,代码仍然像所有其他问题所描述的那样崩溃。
以下是代码的简化版本
的main.cpp
// doesn't work
MultiTcpInOut.h
uint16_t port = 9876;
auto inout = cms::MultiTcpInOut::create(port);
inout->start_accept();
MultiTcpInOut.cpp
#ifndef MULTITCPINOUT_H
#define MULTITCPINOUT_H
#include <memory>
#include <utility>
namespace cms {
using namespace std;
class MultiTcpInOut : private enable_shared_from_this<MultiTcpInOut>
{
public:
static shared_ptr<MultiTcpInOut> create(uint16_t port)
{
return shared_ptr<MultiTcpInOut>(new MultiTcpInOut(port));
}
virtual ~MultiTcpInOut();
// start_accept() can not be called from the constructor because it uses shared_from_this(), and
// make_shared<>() haven't finished yet when it is called. Let the instantiating code call it
void start_accept();
protected:
MultiTcpInOut(uint16_t port);
};
}
#endif // MULTITCPINOUT_H
将void MultiTcpInOut::start_accept()
{
LOG(INFO) << "Starting accept";
auto socket = make_shared<tcp::socket>(io_service);
auto shrd_this = shared_from_this();
acceptor->async_accept(*socket.get(), bind(&MultiTcpInOut::handle_accept, shrd_this, socket, std::placeholders::_1));
}
更改为private enable_shared_from_this<MultiTcpInOut>
解决了问题。
它说它必须公开继承(at least reading the reference),我不明白它为什么没有,因为我是从类方法中调用它的!
那么,为什么必须公开呢? 它是如此清晰,以至于规范中没有提到它?
帮助可能遇到同样问题的人
答案 0 :(得分:1)
这是来自cppreference:'对于enable_shared_from_这是一个常见的(直到C ++ 17)标准(自C ++ 17开始)实现是为此保存弱引用(例如std :: weak_ptr)。 std :: shared_ptr的构造函数检测到enable_shared_from_this base的存在,并将新创建的std :: shared_ptr分配给内部存储的弱引用。也就是说,std::shared_ptr<>
需要对此字段的写访问权限,而不仅仅是您的类。