由于半路开始学耍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)的入参应该使用引用就不会出现这种问题。
阅读(2170) | 评论(0) | 转发(0) |