码迷,mamicode.com
首页 > 其他好文 > 详细

上班的第五百零九天

时间:2015-06-18 13:44:51      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:

    这是我职业生涯的第一个通宵,感觉是挺爽的,还好昨天晚上睡饱了,不然今天是无法通宵的。在这个过程中,我发现自己的专注力和思考能力有了很大的提升,似乎潜在的夜猫子能力被激活了。刚刚想好,就动手写了一堆代码,然后一编译,毫无报错,没有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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!