2017-08-13 3 views
1

Ich bin neu bei der Verwendung von gemeinsamen und eindeutigen Zeigern, und ich versuche, eine Verknüpfte Liste mit freigegebenen Zeigern zu machen, jedoch stürzt mein Programm zufällig ab.C++ make_shared und .get()

Bitte senden Sie mir nützliche Ratschläge und/oder Links Bücher zu meinem besseren Verständnis zu lesen, das ist eine neue C++ Funktion für mich.

Ich versuche, die LeetCode Frage https://leetcode.com/problems/add-two-numbers/description/

Und die API erfordert ListNode * zu lösen übergeben als Argumente werden, so versuche ich, nur ein paar Testdaten zu erstellen, ohne nackt neu mit ...

Zufällige Abstürze auftreten, können make_shared:

int main(int argc, const char * argv[]) { 

    ListNode* list1 = (make_shared<ListNode>(2)).get(); 
    list1->next = (make_shared<ListNode>(4)).get(); 
    list1->next->next = (make_shared<ListNode>(3)).get(); 

    ListNode* list2 = (make_shared<ListNode>(5)).get(); 
    list2->next = (make_shared<ListNode>(6)).get(); 
    list2->next->next = (make_shared<ListNode>(4)).get(); 

    Solution solution; 
    ListNode* result = solution.addTwoNumbers(list1, list2); 

Dies funktioniert OK:

int main(int argc, const char * argv[]) { 

    ListNode* list1 = new ListNode(2); 
    list1->next = new ListNode(4); 
    list1->next->next = new ListNode(3); 

    ListNode* list2 = new ListNode(5); 
    list2->next = new ListNode(6); 
    list2->next->next = new ListNode(4); 

    Solution solution; 
    ListNode* result = solution.addTwoNumbers(list1, list2); 
+0

Was werden Sie von 'make_shared zu erreichen versuchen (...) get()'.? – melpomene

Antwort

3

Das Problem ist, dass shared_ptr<T> das spitze Objekt zerstört, sobald keine Instanz von shared_ptr<> darauf zeigt.

Wenn Sie das tun:

(make_shared<ListNode>(2)).get(); 

erstellen Sie ein temporäres (Leben, bis der aktuelle satement für jeden Sinn und Zweck der Ausführung beendet hat) Instanz von std::shared_ptr<ListNode>.

Da Sie nie vergeben, dass shared_ptr<> auf etwas anderes, wenn die Codezeile der Ausführung beendet, und die shared_ptr<> zerstört wird, ther Anzahl von shared_ptr<> zu diesem neuen ListNode Beispiel zeigt fällt auf 0 und die ListNode selbst zerstört wird. Der Zeiger darauf, den Sie erhalten haben, indem Sie get() aufrufen, ist jetzt ein baumelnder Zeiger.

Was Sie sollte tun ist folgende:

std::shared_ptr<ListNode> list1 = make_shared<ListNode>(2); 
Verwandte Themen