Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除使用“删除”退出队列的元素;top";来自优先级队列c++;_C++ - Fatal编程技术网

C++ 删除使用“删除”退出队列的元素;top";来自优先级队列c++;

C++ 删除使用“删除”退出队列的元素;top";来自优先级队列c++;,c++,C++,我有一个名为事件的对象优先级队列。事件对象中都包含使用“新建”创建的单元格。我知道,因为我使用了“new”,我需要删除对象中的单元格,但我不确定如何删除。我使用top从队列中获取事件,然后弹出该事件以将其从队列中删除。我担心如果我在调用“pop”之前删除它,我会有一个不一致的队列,因为我从未正式弹出过它。如果我试图在之后删除它,恐怕我将无法引用它。如何正确删除此内存 提前谢谢 priority_queue<Event, vector<Event>, CompareEvent&g

我有一个名为事件的对象优先级队列。事件对象中都包含使用“新建”创建的单元格。我知道,因为我使用了“new”,我需要删除对象中的单元格,但我不确定如何删除。我使用top从队列中获取事件,然后弹出该事件以将其从队列中删除。我担心如果我在调用“pop”之前删除它,我会有一个不一致的队列,因为我从未正式弹出过它。如果我试图在之后删除它,恐怕我将无法引用它。如何正确删除此内存

提前谢谢

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.