C++ 删除使用“删除”退出队列的元素;top";来自优先级队列c++;
我有一个名为事件的对象优先级队列。事件对象中都包含使用“新建”创建的单元格。我知道,因为我使用了“new”,我需要删除对象中的单元格,但我不确定如何删除。我使用top从队列中获取事件,然后弹出该事件以将其从队列中删除。我担心如果我在调用“pop”之前删除它,我会有一个不一致的队列,因为我从未正式弹出过它。如果我试图在之后删除它,恐怕我将无法引用它。如何正确删除此内存 提前谢谢C++ 删除使用“删除”退出队列的元素;top";来自优先级队列c++;,c++,C++,我有一个名为事件的对象优先级队列。事件对象中都包含使用“新建”创建的单元格。我知道,因为我使用了“new”,我需要删除对象中的单元格,但我不确定如何删除。我使用top从队列中获取事件,然后弹出该事件以将其从队列中删除。我担心如果我在调用“pop”之前删除它,我会有一个不一致的队列,因为我从未正式弹出过它。如果我试图在之后删除它,恐怕我将无法引用它。如何正确删除此内存 提前谢谢 priority_queue<Event, vector<Event>, CompareEvent&g
priority_queue<Event, vector<Event>, CompareEvent> events;
Event *firstEvent = new Event(*start, time);
events.push(*firstEvent); //Add first event to queue
while (!(events.empty())){
//Get next event
currentEvent = events.top();
// if some condition, add another event
newEvent1 = new Event(*daughterCell, time, newDir);
events.push(*newEvent1);
events.pop();
唯一令人满意的解决方案是使用or 无论如何,您应该始终避免使用原始的新指针,使用智能指针可以确保异常安全,并且不会出现内存泄漏。unique_ptr的开销几乎不存在,shared_ptr需要更多的开销,但您可以获得复制功能 对于C++14,您应该使用或
编辑: 但是,您不需要动态分配内存(来自Java?)。
只需在堆栈上创建对象(无需新建)。然后,您不必手动(或使用RAII)删除。您正在堆上分配
事件的实例,从而获得指向该实例的指针,但随后您决定将该实例按值传递给优先级队列。要取消分配堆分配的实例,请使用delete
操作符
priority_queue<Event, vector<Event>, CompareEvent> events;
Event *firstEvent = new Event(*start, time);
events.push(*firstEvent); //Add first event to queue
delete FirstEvent; // free that instance up
创建新事件
并存储*事件
是内存泄漏,请忽略该新事件@迪特吕克,我承认,即使是我也犯了罪!这将导致编译器抛出错误(取决于警告级别)。我相信一个简单的delete
可以在你处理完它后消除漏洞。当然,但是提问者要求解决他具体的问题,这是我所知道的最简单的方法。OP不需要指针。看看优先级队列的类型。他问我如何才能正确删除分配的内存,我给了他答案。但你是对的,因为他正在解除对指针的引用,他其实并不需要它。(看到你的编辑太晚了)答案不是动态分配。是的,来自Java和C#。。。哈哈哈谢谢你!首先,我将事件对象切换为非指针,这似乎有所帮助。
priority_queue<Event, vector<Event>, CompareEvent> events;
Event *firstEvent = new Event(*start, time);
events.push(*firstEvent); //Add first event to queue
delete FirstEvent; // free that instance up
priority_queue<Event, vector<Event>, CompareEvent> events;
Event firstEvent (*start, time);
events.push(*firstEvent); //Add first event to
// no delete necessary
priority_queue<Event*, vector<Event*>, CompareEvent> events;
Event *firstEvent = new Event(*start, time);
events.push(firstEvent); // no dereferencing
priority_queue<Event, vector<Event>, CompareEvent> events;
events.emplace(*start, time); // no temporary variable needed.