标签:
这是我职业生涯的第一个通宵,感觉是挺爽的,还好昨天晚上睡饱了,不然今天是无法通宵的。在这个过程中,我发现自己的专注力和思考能力有了很大的提升,似乎潜在的夜猫子能力被激活了。刚刚想好,就动手写了一堆代码,然后一编译,毫无报错,没有bug直接能运行,这感觉太爽了。
似乎自己变得无所不能了。
好吧,刚刚敲完这句话,客户端主程就叫我去找一个野指针,难度似乎有那么点大。
好吧,解决完bug发现我还没有发送这篇日志,那就继续写吧。
挺逗的那个野指针的问题,就是当普通服务器与跨服服务器连接时,先把普通服务器关了,然后再开,跨服服务器重连了普通服务器之后,就发生内存错误了。究其原因,是挺逗的,大概如下。
void A::Reconnect(void) { A* pA = m_b.doSomething(this); ... } A* B::doSomething(A* pA) { A* newPA = NULL; if(NULL == pA) { newPA = new A; } else { newPA = pA; } ... std::map<int, A*>it = m_aMap.begin(); for(; it != m_aMap.end(); ++ it) { if(it->first == m_serverId) { A* oldPA = it->second; delete(oldPA); oldPA = NULL; break; } } return newPA; }
虽然看起来没什么问题,但是特么的在第一个函数中,将“将要释放的普通服务器”传进去了,而且它肯定不为NULL,毕竟之前就已经new出来使用了,所以肯定会走"newPA = pA"这条路线。而下面遍历m_aMap.begin()的时候,找到要释放的服务器,其实就是pA也即是newPA啊,新旧指针都指向同一块内存。那么把旧指针释放了,新指针肯定也被释放了啊!这样就会导致野指针问题。
所以我在delete之前加了个判断,if(oldPA != newPA)才做释放动作,这样就解决问题了。
好了,有点饿了,该去吃个午饭了,不知道下午能不能及时发布呢。
标签:
原文地址:http://my.oschina.net/chrisforbt/blog/468308