【问题标题】:How to solve the problem of boost shared_ptr?如何解决 boost shared_ptr 的问题?
【发布时间】:2021-05-01 04:42:02
【问题描述】:
#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>

using namespace boost::asio;
typedef boost::shared_ptr<ip::tcp::socket> socket_ptr;
boost::asio::io_service service;
boost::asio::ip::tcp::endpoint ep(ip::tcp::v4(), 2001);
boost::asio::ip::tcp::acceptor acc(service, ep);
socket_ptr sock_ptr(new ip::tcp::socket(service));

void handle_accept(socket_ptr sock, const boost::system::error_code &err);
void start_accept(socket_ptr sock);

void handle_accept(socket_ptr sock_ptr_, const boost::system::error_code &err) 
{
    if (err) return;
    socket_ptr sock_ptr_(new ip::tcp::socket(service));
    start_accept(sock_ptr_);
}

void start_accept(socket_ptr sock_ptr_) 
{
    acc.async_accept(*sock_ptr_, boost::bind(handle_accept, sock_ptr_, _1) );
}


int main()
{
    start_accept(sock_ptr);
    service.run();
}

编译后的代码报错,但不清楚错误在哪里。我想请你帮忙解决这个难题

/mnt/hgfs/share/home/Cpp/tcp/io_service/task_3/service/server.cpp: In function ‘void handle_accept(socket_ptr, const boost::system::error_code&)’:
/mnt/hgfs/share/home/Cpp/tcp/io_service/task_3/service/server.cpp:21:25: error: declaration of ‘socket_ptr sock_ptr_’ shadows a parameter
     socket_ptr sock_ptr_(new ip::tcp::socket(service));
                         ^

    "g++"  -ftemplate-depth-128 -O0 -fno-inline -Wall -g -fPIC -std=c++11    -c -o "bin/gcc-4.8/debug/server.o" "/mnt/hgfs/share/home/Cpp/tcp/io_service/task_3/service/server.cpp"

...failed gcc.compile.c++ bin/gcc-4.8/debug/server.o...
...skipped <p/mnt/hgfs/share/home/Cpp/tcp/io_service/task_3/stage>service for lack of <pbin/gcc-4.8/debug>server.o...
...failed updating 1 target...
...skipped 1 target...

【问题讨论】:

  • 这正是错误消息所说的:handle_accept 接受一个名为sock_ptr_ 的参数,并且还声明了一个名为sock_ptr_ 的局部变量。一旦声明了局部变量,就不能再访问该参数。作为第一步,给变量一个不同的名字,以避免混淆。但是,handle_accept 采用了一个它无意使用的参数,这是值得怀疑的。你真的是想创建一个新的套接字,而不是使用作为参数传递的那个吗?
  • 非常感谢。我好像一下子就明白自己错在哪里了。
  • 书中描述“使用这个socket后,你创建一个新的socket,然后再次调用start_accept()创建另一个‘等待客户端连接’的异步操作,让服务.run () 循环一直很忙”。我应该处理传入的参数 sockt
  • 我不知道,我对您使用的库不熟悉。如果您确实应该操作两个不同的 socket_ptr 实例,请给它们不同的名称。

标签: c++ boost-asio shared-ptr


【解决方案1】:

错误是因为函数handle_accept的一个参数和一个局部变量共享sock_ptr_。给其中一个(或两个)另一个不同的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2018-07-07
    • 2019-01-30
    相关资源
    最近更新 更多