c ++从列表中删除时访问冲突读取位置

时间:2015-10-10 09:25:19

标签: c++ list exception erase

我有以下c ++代码:

typedef std::list< Volume >::iterator   pVolume;
typedef std::list< pVolume >::iterator  ppVolume;
void Node::delVolume( pVolume _volume )
{
    for( ppVolume it = m_volumes.begin( ); it != m_volumes.end( ); )
        if( (*it) == _volume )
        {
            it = m_volumes.erase( it );
            break;
        }
        else
            it++;
}

它出错了

  

Delone3D.exe中0x009a3c79处的未处理异常:0xC0000005:Access   违规阅读地点0xfeeefef2。

正好在擦除时。调试显示它们都不是&#34;它&#34;也不是&#34; _volume&#34;是空指针。

可能出现的其他原因是什么?

2 个答案:

答案 0 :(得分:2)

您显示的代码是正确的,似乎您的应用程序中的其他地方存在问题。内存模式0xfeeefef2(高于0xfeeefeee的几个地址)表示释放的动态内存,请参阅here

顺便说一下,您可以大规模简化代码:

// for std::list, as in your example
m_volumes.remove(_volume);

// for std::vector and std::deque
auto itr = std::remove(m_volumes.begin(), m_volumes.end(), _volume);
m_volumes.erase(itr, m_volumes.end());

答案 1 :(得分:-2)

我找到了产生错误的地方。但我不明白为什么。

整个我的代码实现为抽象事件类

的继承人
class Event
{
public:
    Event( ) { }
    ~Event( ) { }

    virtual void Implement( void ) abstract;
    virtual void ReturnColors( void );      
private:
};

有事件指针deque

std::deque< Event * >   m_triangulationEvents;

以下方式使用

void Delaunay3D::nextEvent( )
        {
            if( !m_triangulationEvents.empty( ) )
            {
                m_prevEvent->ReturnColors( );

                Event * cur = m_triangulationEvents.front( );
                m_triangulationEvents.pop_front( );
                cur->Implement( );

                delete m_prevEvent;
                m_prevEvent = cur;
            }
        }

问题出在

delete m_prevEvent;

的字符串。评论或使用

m_prevEvent.~Event( );

导致良好的工作应用。谢谢大家。

P.S。 @TheOperator感谢提及释放的动态内存