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;
};

和一个比较器

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();

}

我有一个堆损坏。怎么做才对?

4

2 回答 2

0

您的问题可能是您在state调用后使用m_queue.pop();的,导致访问对不再存在的项目的引用。您需要pop稍后将调用移动到函数中,或者在从堆栈中获得对该项目的引用后制作该项目的副本。

于 2013-04-08T19:17:20.100 回答
0
const SState& state = m_queue.top();

在那里你得到了对堆栈对象的堆副本的引用。但是这个引用不会延长对象的生命周期。

所以那里

  m_queue.pop();

对象正在破坏,您不能再使用对它的引用。

于 2013-04-08T19:18:00.493 回答