Chinaunix首页 | 论坛 | 博客
  • 博客访问: 24426
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 55
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-21 11:31
文章分类

全部博文(9)

文章存档

2016年(4)

2015年(3)

2013年(2)

我的朋友

分类: C/C++

2016-11-15 15:19:02

由于半路开始学耍C++,最近调试代码时,出现代码析构时怎么出现coredump,实在没辙,询问了TX才知道问题所在。
基本代码如下:
XS32 PnasProcMBMSStartRequest(const gtpc::GTPCMessage start_msg);
GTPCMessage::~GTPCMessage()
{
    try{
        if (msg_ != NULL)
        {
            delete msg_;
            msg_ = NULL;
        }
    }
    catch(...){}
}
XS32 PnasProcS11Msg(class A* pXosMsg)
{
    ......
    const struct B* gtpc_head = reinterpret_cast (pXosMsg->value);
    .......
    gtpc::GTPCMessage gtpc_msg;
    gtpc_msg.MsgDecode(pXosMsg->value, pMsg->length);//给gtpc_msg里成员赋值以及申请内存等
    .......
    switch (gtpc_head->type)
    {
    case gtpc::GTPC_MBMS_SESSION_START_REQ:
        PnasProcMBMSStartRequest(gtpc_msg);
        break;
    case gtpc::GTPC_MBMS_SESSION_STOP_REQ:
        break;
    default:
        break;
    }
    return XSUCC;
}
代码总是在执行到PnasProcS11Msg函数最后返回时出现coredump,原因是由于PnasProcMBMSStartRequest接口的入参使用了值传递,
将gtpc_msg内容通过拷贝构造函数拷贝给了start_msg这个形参,在PnasProcMBMSStartRequest()返回时,调用了GTPCMessage的析构
函数,删除了msg_,而在最后PnasProcS11Msg()函数返回时再次调用了GTPCMessage的析构函数,导致了对msg_二次释放而core。

这里PnasProcMBMSStartRequest((const gtpc::GTPCMessage& start_msg)的入参应该使用引用就不会出现这种问题。
阅读(2070) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~