You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:27:47