degel 2017-06-08 12:40 采纳率: 33.3%
浏览 957

boost shared_ptr使用问题求解。

已经对照
http://blog.csdn.net/huang_xw/article/details/8549444
解决了部分使用shared_ptr()的疑惑。

现有代码如下:
1,CGameSession* pgamesession = new CGameSession(this);

2,shared_ptr<CGameSession> gamesession(pgamesession);

3,if (gamesession._Get() != pgamesession)
{
BOOST_ASSERT(gamesession._Get() != pgamesession);
}

4,GetNetSevice()->postConnectService(strIP.c_str(), port, pgamesession);

其中postConnectService最后一个参数要求使用CGameSession*类型参数。

在本范例中,如果按图中的顺序调用,则在函数内使用pgamesession调用他的成员函数时会报错。

然后,我只要去掉2,3句。也就是不经过shared_ptr的一次赋值,则不会出现任何问题,.那么各位爷应该明白了,我查看内存并没有发现经过shared_ptr赋值后pgamesession的内存有变化。那么这个问题到底是为何呢?

//////////////////////////////////////补充一下
问题定位,
在postConnectService有这么一段代码。

5,m_pHandler = pHandler;

//转换一次ip地址

6, boost::asio::ip::address address;
address = address.from_string(ip);
tcp::endpoint endpoint(address, port);

7,m_pSocket->async_connect(endpoint,
    boost::bind(&CTCPClient::handle_connect, this,
    boost::asio::placeholders::error));

其中5中被赋值的pHandler就是外部的pgamesession。

在执行第7句之前,一切正常。
当执行玩第7句,进入异步函数CTCPClient::handle_connect时。
m_pHandler的虚表丢失了。所以导致通过m_pHandler(也就是pgamesession)
调用的重载函数都无法访问了。

但是小弟愚昧,实在没有参透各中原因。
  • 写回答

2条回答 默认 最新

  • oyljerry 2017-06-08 12:51
    关注

    你既然赋值给智能指针了,就应该用它来访问。或者gamesession.get()来获取原始指针访问

    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况