gpt4 book ai didi

c++ - 在我的 C++ 链表实现中取消引用节点指针给出了意想不到的结果

转载 作者:行者123 更新时间:2023-11-30 05:15:59 25 4
gpt4 key购买 nike

我正在基于第一性原理在 C++ 中实现一个无序列表。我的(到目前为止部分完成)实现是:

#include <iostream>

class Node {
int m_data;
Node *m_next;

public:
Node(int data)
{
m_data = data;
m_next = nullptr;
}

int getData() { return m_data; }
void setData(int data) { m_data = data; }
Node* getNext() { return m_next; }
void setNext(Node *next) { m_next = next; }
};

class UnorderedList {
public:
Node *m_head;

public:
UnorderedList()
{
m_head = nullptr;
}

bool isEmpty() { return m_head == nullptr; }

void appendToHead(int data)
{
Node temp = Node(data);
temp.setNext(m_head);
m_head = &temp;
}

void remove(int data);
bool search(int data);
};

int main()
{
UnorderedList list1;
list1.appendToHead(32);
list1.appendToHead(47);
list1.appendToHead(90);
std::cout << list1.m_head->getData() << '\n';
std::cout << list1.m_head->getNext()->getData() << '\n';
return 0;
}

我能够正确地将列表的头部打印为“90”​​,但下一行(即 getNext()->getData())被打印为一个大的随机数 (281314120)。这是什么原因?

最佳答案

void appendToHead(int data)
{
Node temp = Node(data);
temp.setNext(m_head);
m_head = &temp;
}

永远不要用 automatic storage duration 存储对象的地址.当 appendToHead 方法完成时,该对象(在本例中为 temp)将不复存在。

您这样做并调用了未定义行为。你可能想做:

void appendToHead(int data)
{
Node* temp = new Node(data);
temp->setNext(m_head);
m_head = temp;
}

您还应该考虑满足 The Rule Of Five

而不是原始指针,另外探索 std::unique_ptr 的使用.

关于c++ - 在我的 C++ 链表实现中取消引用节点指针给出了意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42874161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com