2013-04-08 4 views
0

У меня есть объектмагазин объект стека в приоритетной очереди

priority_queue<SState,vector<SState>,greater<SState> > m_queue; 

, который является членом класса, в котором SState является внутренним strtuct, который определен

struct SState 
{ 
    SState(int p, int b):priority(p),bbb(b){} 
    ~SState(){} 
    int priority; 
    int bbb; 
}; 

и компаратор

inline bool operator > (const MyClass::SState& left, const MyClass::SState& right) 
{ 
    return left.priority > right.priority; 
} 

У меня есть метод, который создает объект SState.

m_queue.push(SState(p,b)); 

и другой метод

if (!m_queue.empty()) 
{ 

     const SState& state = m_queue.top(); 
     ... 
     m_queue.pop(); 

} 

Я получил повреждение кучи. Как это сделать правильно?

+1

Вы делаете что-либо с помощью справки 'state' после вызова' pop'? Если это так, вы используете свисающую ссылку, которая, безусловно, может привести к повреждению кучи. Если нет, то проблема не в том коде, который вы опубликовали. –

+0

использовать bbb как индекс для массива – iliam14

ответ

0

Возможно, ваша проблема связана с использованием state после вызова m_queue.pop();, что дает доступ к ссылке на элемент, который больше не существует. Вам нужно будет либо переместить вызов pop позже в функцию, либо сделать копию элемента после того, как вы получите ссылку на него из стека.

+0

I Использовать состояние между этими командами 2 – iliam14

0
const SState& state = m_queue.top(); 

У вас есть ссылка на кучную копию объекта стека. Но эта ссылка не продлевает срок жизни объекта.

Так

m_queue.pop(); 

объект разрушающие и вы не можете использовать ссылку на него больше.

+0

Я использую его между этими командами 2 – iliam14

Смежные вопросы