2013-04-08 138 views
0

我有一個對象存儲在一個優先級隊列

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

是類的一個成員,其中SState是定義

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

和比較器的內strtuct堆疊對象

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

在調用'pop'之後,你是否在做'state'引用?如果是這樣,你正在使用一個懸而未決的參考,這肯定會導致堆損壞。如果沒有,那麼問題不在您發佈的代碼中。 – 2013-04-08 19:14:55

+0

使用bbb作爲數組的索引 – iliam14 2013-04-08 19:17:22

回答

0

您的問題可能是因爲您在致電m_queue.pop();後使用state,導致訪問對不再存在的項目的引用。您可能需要稍後將pop調用移入該函數中,或者在從堆棧中獲取對該項目的引用後複製該項目。

+0

我在這兩個命令之間使用狀態 – iliam14 2013-04-08 19:35:11

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

在那裏你得到了堆棧對象的堆副本的引用。但是這個引用不會延長對象的生命週期。

所以有

m_queue.pop(); 

對象被破壞,你不能再使用引用。

+0

我在這兩個命令之間使用它 – iliam14 2013-04-08 19:33:45