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

C++自定义对象存入链表后跨函数调用出现数据丢失问题求解

问题根因
  • 核心错误是EventNode类中存储的是Event的引用(Event& data),而非独立的Event对象:
    你写的Roast::addEvent函数是值传递接收Event参数,这个参数e是addEvent函数的局部变量,函数执行结束后就会被销毁。你把局部变量e的引用存到EventNode中,函数返回后这个引用就变成了悬垂引用,指向的内存已经被系统回收复用,后续访问自然就会出现乱码。
  • 次要验证:你调用addEvent时传入的是std::move(e)得到的右值临时对象,该临时对象的生命周期仅维持到addEvent调用结束,进一步加剧了悬垂引用的问题。
修复方案
  1. 直接修改EventNode类的定义,把引用成员改为值成员:
class EventNode{
public:
    Event data; // 把Event&改成Event,直接存储对象
    EventNode* next = nullptr;
    EventNode(Event e); // 构造函数参数同步改为值传递
};
  1. 修改对应的EventNode构造函数实现:
EventNode::EventNode(Event e) : data(std::move(e)){};
  1. (可选优化)调整Roast::addEvent的逻辑减少不必要拷贝:
void Roast::addEvent(Event e){
    EventNode *tmpNode = new EventNode(std::move(e));
    if (eventList != nullptr){
        tmpNode->next = eventList;
    }
    eventList = tmpNode;
}
补充说明

你目前写的Event类的拷贝构造、拷贝赋值函数已经正确实现了EventValue指针的深拷贝,所以直接存储Event值对象不会出现内存泄漏、重复释放的问题,不需要额外修改Event类的现有逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:54:09