已经对照
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)
调用的重载函数都无法访问了。
但是小弟愚昧,实在没有参透各中原因。
你既然赋值给智能指针了,就应该用它来访问。或者gamesession.get()来获取原始指针访问
因为
postConnect(boost::asio::io_service& io_service_, const char* ip, int port, ITCPClientHandler* pHandler)原型如此:
所以智能通过pgamesession本身或者使用gamesession.get()来访问。
但是很遗憾,调用结果一个天上一个地下。如果没有使用2,shared_ptr gamesession(pgamesession);
则可以使用pgamesession正常通过。
如果使用2,那么即使使用pgamesession作为参数都无法通过。
如果使用gamesession.get(),那么无论如何都无法通过。
这让我感觉boost的shard_ptr用起来很方丈·····