C++ boost::make_shared失败,但std::make_shared工作

C++ boost::make_shared失败,但std::make_shared工作,c++,boost-asio,make-shared,C++,Boost Asio,Make Shared,我在boost::asio中做了一个echo服务器示例。但是使用boost::make_shard将导致“未知异常”,而std::make_shared则不会。请参阅注释行 我正在使用visual studio 2017和boost 1.67。注释部分将崩溃,而未注释部分不会崩溃。在boost/stage/lib中,boost lib似乎符合vs141 #include <iostream> #include <boost/asio.hpp> #include <b

我在boost::asio中做了一个echo服务器示例。但是使用boost::make_shard将导致“未知异常”,而std::make_shared则不会。请参阅注释行

我正在使用visual studio 2017和boost 1.67。注释部分将崩溃,而未注释部分不会崩溃。在boost/stage/lib中,boost lib似乎符合vs141

#include <iostream>
#include <boost/asio.hpp>
#include <boost/make_shared.hpp>
using boost::asio::ip::tcp;
using std::cout;
using std::endl;
using std::size_t;

class session :public std::enable_shared_from_this<session> {
public:
    session(tcp::socket socket) :socket_(std::move(socket)) {
    }
    void start() {
        do_read();
    }
private:

    void do_read() {
        auto self(shared_from_this());
        socket_.async_read_some(boost::asio::buffer(buffer_, maxlen),
            [this, self](boost::system::error_code error, size_t read_len) {
            if (!error) {
                do_write(read_len);
            }
            else {
                cout << error.message() << endl;
            }
        });
    }
    void do_write(size_t len_write) {
        auto self(shared_from_this());
        boost::asio::async_write(socket_, boost::asio::buffer(buffer_, len_write),
            [this, self](boost::system::error_code error, size_t byte_transferred) {
            if (!error) {
                do_read();
            }
            else {
                cout << "error 3,only " << byte_transferred << " bytes writen" << endl;
            }
        });
    }
    tcp::socket socket_;
    enum { maxlen = 1024 };
    char buffer_[maxlen];
};


class server {
public:
    server(boost::asio::io_context& io_context, short port)
        :acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) {
        start();
    }

    void start() {


        acceptor_.async_accept(
            [this](boost::system::error_code ec, tcp::socket socket)
        {
            if (!ec)
            {
                std::make_shared<session>(std::move(socket))->start();
        //      boost::make_shared<session>(std::move(socket))->start();

            }

            start();
        });
    }
private:
    tcp::acceptor acceptor_;
};

int main(int argc, char **argv) {
    if (argc != 2) {
        cout << "usage: server.exe  Port" << endl;
    }
    try {
        boost::asio::io_context io_context;
        server server(io_context, std::atoi(argv[1]));
        io_context.run();
    }
    catch (std::exception e) {
        cout << e.what() << endl;
    }
}
#包括
#包括
#包括
使用boost::asio::ip::tcp;
使用std::cout;
使用std::endl;
使用std::size\u t;
类会话:public std::从\u中启用\u共享\u{
公众:
会话(tcp::套接字):套接字(std::移动(套接字)){
}
void start(){
你读过吗;
}
私人:
void do_read(){
自动自我(从_this()共享_);
套接字异步读取一些(boost::asio::buffer(buffer,maxlen),
[this,self](boost::system::error\u code error,size\u t read\u len){
如果(!错误){
写(读)字;
}
否则{

当您想要使用boost共享指针时,cout

boost::make_shared<session>(std::move(socket))->start();
boost::make_shared(std::move(socket))->start();
您必须从boost适配器类继承您的类,如下所示:

class session :public boost::enable_shared_from_this<session> {
类会话:public boost::从\u启用\u共享\u{
@S.M.这实际上是“未知异常”。