Good day. Tell me, please, what could be the error. At the end, 2 destructors are triggered and the error crashes: _crtisvalidheappointer (block). Thank you in advance.

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; } 

    1 answer 1

    You pass the address of a local variable to shared_ptr , not allocated to new - and then shared_ptr tries to delete it. And it is impossible to delete what is not selected with the help of new .

    Try this:

     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; }