我在C ++中有以下代码:
EventQueue * EventQueueNode::map(std::function<LoggerEvent *(LoggerEvent *)> func,
bool stop_propagate = true){
auto old_node = this->event_node;
this->event_node = func(this->event_node);
delete old_node;
return this->right()->map(func, stop_propagate);
};
如果用户返回相同的指针,此代码会中断,但如果我不删除它,则会泄漏内存。
EventQueue是一个循环的双向链表。并且它有一个头部,它保持两端,但作为端点起作用:
EventQueue * EventQueue::map(std::function<LoggerEvent *(LoggerEvent *)> func,
bool stop_propagate = false) {
if(stop_propagate)
return this;
return this->right()->map(func, true);
};
现在我遇到了问题。我真的想把地图函数写成:
EventQueue * EventQueueNode::map(std::function<LoggerEvent(LoggerEvent)> func,
bool stop_propagate = true){
this->event_node = func(this->event_node);
return this->right()->map(func, stop_propagate);
};
因为前面的地图无论如何都需要被破坏,并且不会导致内存泄漏。传统上地图取代了一个值。但是,我还必须使event_node成为一个值,这将导致它被复制到任何地方。我是一个初学者,所以我会陷入我应该采取的方法。
解决这个问题的好方法是什么?
完整代码:
http://pastebin.com/NT1pD5ar(大多数代码处于构造状态,我有更多问题)
答案 0 :(得分:2)
您可以使用shared_ptr<LoggerEvent>
之类的智能指针将其存储在容器中并传递它。一旦智能指针的所有副本都被销毁,智能指针指向的对象将被销毁。