2016-04-11 12 views
0

Der folgende Code führt zu Laufzeitfehler. Offensichtlich, wenn unique_ptra den Geltungsbereich verlässt, versucht es, den Speicher zu löschen, der bereits gelöscht worden ist, so verursacht ein Heap-Problem. Meine Frage ist, welche Änderungen ich in Zeile X vornehmen sollte, da sie denselben Speicher teilen und es auch nach der Verwendung des Aufrufs delete keinen Laufzeitfehler gibt.Laufzeitfehler mit unique_ptr

#include <iostream> 
#include <memory> 
using namespace std; 
int main() 
{ 
    int* p = new int (10); 
    unique_ptr<int> a (p); // Line X 
    delete p; 
    return 0; 
}   

Antwort

2

On line X, sind übertragen Sie das Eigentum an dem Objekt zu dem erstellten unique_ptr<int> a von p hingewiesen. Sie sollten es später nicht explizit löschen, anderenfalls haben Sie einen doppelten Löschfehler.

Wenn Sie nicht die unique_ptr wollen das Objekt löschen es zu den Punkten, sollten Sie es vor Zerstörung lösen, zB:

int main() { 
    int * p = new int(10); 
    unique_ptr<int> a(p); 
    a.release(); // <--- Release ownership of the integer 
    // unique_ptr a no longer "owns" the integer 
    delete p; 
} 

Der ganze Sinn der unique_ptr ist, dass es „besitzt“ und Objekt und gibt seine Ressourcen auf RAII-Weise frei.

0

mit C++ Ab 14 kann Ihr Snippet wie folgt festgesetzt:

#include <iostream> 
#include <memory> 
using namespace std; 
int main() 
{ 
    auto a = make_unique<int>(10); // = unique_ptr<int>(new int(10)) 
    return 0; 
}