C++链表添加元素时覆盖旧数据问题求助
问题分析与解决方案
你的问题核心在于所有链表节点都指向了同一个Bid对象的内存地址,导致后续修改会覆盖之前所有节点的数据。
具体原因拆解
在main函数里,你把Bid bid;定义在了while循环的外面——这意味着整个程序运行期间,这个bid始终是同一块栈内存。每次调用getBid()时,都是把新输入的数据写入这块内存,然后你把&bid(这块内存的地址)传给Append方法添加到链表。链表的每个节点保存的都是这个相同的地址,所以当你输入新的bid时,原来的内存内容被直接覆盖,最后打印时所有节点自然都显示最后一次输入的值。
修复方案
你需要为每个新的Bid分配独立的内存空间,也就是用new在堆上创建对象,这样每个节点都有自己的专属内存,不会互相干扰。
1. 修改main函数的case 1逻辑
case 1: // 每次创建新Bid时,在堆上分配独立内存 Bid* newBid = new Bid(); *newBid = getBid(); // 将getBid返回的内容拷贝到新对象中 bidList.Append(newBid); displayBid(*newBid); break;
2. 完善链表析构函数,避免内存泄漏
因为现在节点是在堆上分配的,程序结束时需要手动释放这些内存,否则会造成内存泄漏:
LinkedList::~LinkedList() { Bid* current = head; while (current != nullptr) { Bid* nextNode = current->nextNode; delete current; // 释放当前节点的堆内存 current = nextNode; } head = nullptr; tail = nullptr; size = 0; }
额外注意事项
如果后续实现了Remove方法,也要记得在删除节点时调用delete释放对应的堆内存,避免出现内存泄漏问题。
内容的提问来源于stack exchange,提问作者Bowser
相关产品推荐
相关产品推荐

