C++ boost::make_shared失败,但std::make_shared工作
我在boost::asio中做了一个echo服务器示例。但是使用boost::make_shard将导致“未知异常”,而std::make_shared则不会。请参阅注释行 我正在使用visual studio 2017和boost 1.67。注释部分将崩溃,而未注释部分不会崩溃。在boost/stage/lib中,boost lib似乎符合vs141C++ 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
#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.这实际上是“未知异常”。