2012-04-04 9 views
3

verlassen Gesicht ich ein ähnliches Problem wie void pointer returned from function heap corruptionHeapbeschädigung wenn Umfang mit unique_ptr

Die Ähnlichkeit ist, dass ich „Heap Korruption“ Nachricht erhalten, wenn Sie den Umfang zu verlassen, wo unique_ptr verwendet wird.

Hier ist der Code:

void CMyClass::SomeMethod() 
{ 
    std::unique_ptr<IMyInterface> spMyInterface; 
    spMyInterface.reset(new CMyInterfaceObject()); // CMyInterfaceObject is derived from IMyInterface 

    any_list.push_back(spMyInterface.get()); // any_list: std::list<IMyInterface*> 

    any_list.clear(); // only clears the pointers, but doesn't delete it 

    // when leaving the scope, unique_ptr deletes the allocated objects... -> heap corruption 
} 

Jede Idee, warum dies geschieht?

+5

Ist die destructor von IMyInterface virtuellen erklärt? – Henrik

+0

möchten Sie möglicherweise das Betriebssystem und den Compiler hinzufügen, den Sie verwenden. –

+0

Sind Sie sicher, dass 'any_list.clear()' das Objekt nicht löscht? Es scheint, als würde die Heap-Beschädigung aufgrund eines doppelten Löschens gemeldet, wenn der Destruktor der unique_ptr aufgerufen wird. Versuchen Sie, einen Breakpoint im Destruktor für 'CMyInterfaceObject' zu setzen. – mark

Antwort

3

std :: unique_ptr ist ein intelligenter Zeiger, der den alleinigen Besitz eines Objekts über einen Zeiger behält und dieses Objekt zerstört, wenn der Wert von unique_ptr den Gültigkeitsbereich verlässt.

In Ihrem Fall haben Sie std::unique_ptr<IMyInterface> spMyInterface; innerhalb von SomeMethod() deklariert, sobald die Ausführung den Bereich von SomeMethod() verlässt, wird Ihr Objekt zerstört.

Werfen Sie einen Blick auf unique_ptr

+0

OK, aber wie erklärt dies die Heap-Korruption? – ancajic