C++自定义对象存入链表后跨函数调用出现数据丢失问题求解
问题根因
- 核心错误是
EventNode类中存储的是Event的引用(Event& data),而非独立的Event对象:
你写的Roast::addEvent函数是值传递接收Event参数,这个参数e是addEvent函数的局部变量,函数执行结束后就会被销毁。你把局部变量e的引用存到EventNode中,函数返回后这个引用就变成了悬垂引用,指向的内存已经被系统回收复用,后续访问自然就会出现乱码。 - 次要验证:你调用
addEvent时传入的是std::move(e)得到的右值临时对象,该临时对象的生命周期仅维持到addEvent调用结束,进一步加剧了悬垂引用的问题。
修复方案
- 直接修改
EventNode类的定义,把引用成员改为值成员:
class EventNode{ public: Event data; // 把Event&改成Event,直接存储对象 EventNode* next = nullptr; EventNode(Event e); // 构造函数参数同步改为值传递 };
- 修改对应的
EventNode构造函数实现:
EventNode::EventNode(Event e) : data(std::move(e)){};
- (可选优化)调整
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
相关产品推荐
相关产品推荐

