我是使用共享和唯一指针的新手,我正在尝试使用共享指针创建链接列表,但是,我的程序会随机崩溃。
请向我发送有用的建议和/或链接书籍以便我更好地理解,这对我来说是一个新的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);
答案 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);