Ошибка boost :: make_shared, но работа std :: make_shared - PullRequest
0 голосов
/ 13 мая 2018

Я делал пример с эхо-сервером в boost :: asio. Но использование boost :: make_shard вызовет «неизвестное исключение», а std :: make_shared - нет. Смотрите закомментированную строку.

Я использую Visual Studio 2017 и Boost 1.67. Комментируемая часть будет зависать, а некомментированная - нет. Похоже, что Boost lib соответствует vs141 в boost / stage / lib.

#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;
    }
}

1 Ответ

0 голосов
/ 13 мая 2018

Когда вы хотите использовать общие указатели boost

boost::make_shared<session>(std::move(socket))->start();

Вы должны наследовать свой класс от класса повышающего адаптера, как показано ниже:

class session :public boost::enable_shared_from_this<session> {
...