C ++ make_shared和.get()

时间:2017-08-13 19:50:17

标签: c++14

我是使用共享和唯一指针的新手,我正在尝试使用共享指针创建链接列表,但是,我的程序会随机崩溃。

请向我发送有用的建议和/或链接书籍以便我更好地理解,这对我来说是一个新的C ++功能。

我试图解决LeetCode问题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);

1 个答案:

答案 0 :(得分:4)

问题是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);