Я внедряю новый модуль с использованием shared_ptr и т. Д. В нашем устаревшем приложении, однако я получаю нарушение прав доступа, когда shared_ptr вызывает деструктор.
app:
case ENUM_DATA:
{
std::tr1::shared_ptr<CDataMsg> msg(new CDataMsg(_stringmsg)); // _stringmsg is initialized before
Process(msg);
break;
}
Process ():
bool Process(std::tr1::shared_ptr<CDataMsg> msg)
{
try
{
switch (msg->getDataType())
{
case ENUM_MYDATATYPE:
{
std::tr1::shared_ptr<CMyData> base(msg->getData());
std::tr1::shared_ptr<CMyDataChild> data(std::tr1::static_pointer_cast<CMyDataChild>(base));
// do some stuff with data
std::tr1::shared_ptr<CRequest> request(new CRequest(data->getParam1(), data->getParam2()));
handler->AddRequest(request->getBin());
break;
}
default:;
}
return true;
}
catch (...)
{
// exception handling
}
return false;
}
Деструктор:
CDataMsg::~CDataMsg()
{
if (m_data)
delete m_data;
m_data = NULL;
}
m_data - это CMyData * (не может быть изменено на этом этапе).
CDataMsg - это контейнер, который содержит данныетипа CMyData.CmyDataChild является подклассом CMyData, который используется здесь.
У меня есть точка останова в деструкторе, но отладчик останавливается только тогда, когда его вызывает shared_ptr, а затем я уже получаю нарушение доступа.