2017-08-13 66 views
1

我是使用共享和唯一指針的新手,我嘗試使用共享指針創建鏈接列表,但是,我的程序不斷隨機崩潰。C++ make_shared和.get()

請給我有用的建議和/或鏈接的書籍,以便我更好的理解,這是一個新的C++功能。

我試圖解決這個問題,本文給出了https://leetcode.com/problems/add-two-numbers/description/

和API需要ListNode *被作爲參數傳入,所以我只是想在不使用裸新創建一些測試數據...

隨機發生崩潰使用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); 

該工程確定:

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

你到底想通過實現'make_shared(...)得到()'? – melpomene

回答

3

問題是shared_ptr<T>只要沒有指向它的shared_ptr<>的實例就銷燬指向的對象。

當你這樣做:

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

您創建一個臨時的(生活,直到當前的語句已經完成了所有的意圖和目的執行)的std::shared_ptr<ListNode>實例。

因爲你永遠是分配給shared_ptr<>別的,一旦該行代碼執行完畢,並shared_ptr<>被破壞,指向一個新ListNode實例shared_ptr<>療法數量下降到0,ListNode本身被破壞。通過調用get()得到的指針現在是一個懸掛指針。

應該做什麼是以下幾點:

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