Добрый день. Подскажите, пожалуйста, в чем может быть ошибка. В конце срабатывают 2 деструктора и вылетает ошибка: _crtisvalidheappointer(block). Заранее спасибо.
class Call
{
public:
int _id;
string _name;
Call()
{
}
Call(int id, string name): _id(id), _name(name)
{
}
~Call()
{
printf("destructor\n");
}
void Print()
{
printf("id : %d \n", _id);
}
};
int main()
{
std::vector <shared_ptr<Call> > m_vCalls;
Call emptyCall;
shared_ptr<Call> emptyCallPtr(& emptyCall);
m_vCalls.push_back(emptyCallPtr);
m_vCalls[0]->Print();
Call FirstCall(1, "First");
shared_ptr<Call> FirstCallPtr(& FirstCall);
m_vCalls[0] = FirstCallPtr;
m_vCalls[0]->Print();
m_vCalls[0]->_id = 2;
m_vCalls[0]->Print();
FirstCall.Print();
return 0;
}
Вы передаете shared_ptr адрес локальной переменной, а не выделенной с помощью new - а потом shared_ptr пытается его удалить. А удалять то, что не выделено при помощи new, нельзя.
Попробуйте так:
int main()
{
std::vector <shared_ptr<Call> > m_vCalls;
Call * emptyCall = new Call;
shared_ptr<Call> emptyCallPtr(emptyCall);
m_vCalls.push_back(emptyCallPtr);
m_vCalls[0]->Print();
Call *FirstCall = new Call(1, "First");
shared_ptr<Call> FirstCallPtr(FirstCall);
m_vCalls[0] = FirstCallPtr;
m_vCalls[0]->Print();
m_vCalls[0]->_id = 2;
m_vCalls[0]->Print();
FirstCall->Print();
return 0;
}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости