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

C++重载<<运算符时传入对象导致内部数据被修改如何解决

你遇到的现象和operator<<重载本身没有关系,核心问题出在push函数的错误实现上:

  • 你在push中创建的Node newNode是栈上的局部对象,它的生命周期仅存在于push函数执行期间,函数执行结束后这个对象会被自动销毁,你存到head和tail里的&newNode就变成了悬空指针。后续调用operator<<访问list.head->data时,实际访问的是已经被释放的栈内存,这块内存可能已经被其他程序逻辑覆盖,所以会出现值被篡改的假象,本质上是未定义行为,也可能出现程序崩溃等其他异常结果。
  • 你的push逻辑还存在冗余错误,else分支里重复给tail->next赋值了两次,且最后没有更新tail指向新的节点,后续添加多个节点时逻辑也会出错。

修正方案

把节点改为堆上动态分配,调整push逻辑即可:

void LinkedList::push(int data) {
    // 用new在堆上分配节点,生命周期由你手动控制
    Node* newNode = new Node(data);
    if (size == 0) {
        head = newNode;
        tail = newNode;
    } else {
        tail->next = newNode;
        newNode->prev = tail;
        tail = newNode;
    }
    size++;
}

额外注意事项

作为C++入门学习者需要注意:

  • 堆上用new分配的内存需要手动释放,你后续需要给LinkedList类实现析构函数,遍历链表逐个delete所有节点,避免内存泄漏。
  • 参考C++三五法则,你还需要实现拷贝构造函数、拷贝赋值运算符等函数,避免默认浅拷贝导致的重复释放、悬空指针问题。

修正后运行测试代码即可输出你预期的[5]。

内容的提问来源于stack exchange,提问作者DCoxshall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:06:04