我有以下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;是空指针。
可能出现的其他原因是什么?
答案 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感谢提及释放的动态内存