【发布时间】:2009-10-31 04:10:38
【问题描述】:
我试图在 C++ 中使用 STL 列表,但遇到了一个我无法理解的奇怪异常。
列表定义为list<ASTNode*> m_stats;,ASTNode* 是一个类。当我尝试通过调用添加元素时
ASTNode *node = new ASTNode();
m_stats.push_back(node);
它会抛出以下异常:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00000004
0x91c20fe7 in std::_List_node_base::hook()
我尝试使用 gdb 进行调试并检查插入的值,它不是 null 吗?它正是它应该是的......
回溯是:
#0 0x91c20fe7 in std::_List_node_base::hook ()
#1 0x0000a9fb in std::list<ASTNode*, std::allocator<ASTNode*> >::_M_insert (this=0x180344, __position={_M_node = 0x0}, __x=@0xbffff094) at stl_list.h:1152
#2 0x0000aa27 in std::list<ASTNode*, std::allocator<ASTNode*> >::push_front (this=0x180344, __x=@0xbffff094) at stl_list.h:743
#3 0x0000aa45 in ASTStatements::addStatement (this=0x180340, stat=0x180410) at ast.h:277
我错过了什么吗?
编辑:添加类源
class ASTStatements : public ASTNode
{
list<ASTNode*> m_stats;
public:
ASTStatements() {}
ASTStatements(list<ASTNode*> stats)
{
std::copy(stats.begin(), stats.end(), m_stats.begin());
}
ASTStatements(const ASTStatements &other)
{
std::copy(other.m_stats.begin(), other.m_stats.end(), m_stats.begin());
}
ASTStatements &operator= (const ASTStatements &other)
{
if (&other != this)
{
std::copy(other.m_stats.begin(), other.m_stats.end(), m_stats.begin());
}
}
ASTStatements *clone()
{
return new ASTStatements(*this);
}
u8 type()
{
return 0;
}
const char *generateASM()
{
list<ASTNode*>::iterator it = m_stats.begin();
while (it != m_stats.end())
{
((ASTNode*)*it)->generateASM();
++it;
}
}
void addStatement(ASTNode *stat)
{
m_stats.push_front(stat);
}
u8 typeCheck()
{
return 0;
}
};
我在野牛语法文件中使用它来处理多个语句(没有找到更好的方法来处理非终端中的通用项目列表):
statements:
statement { if ($$ == null) $$ = new ASTStatements(); ((ASTStatements*)$$)->addStatement($1); } statements { $$->generateASM(); }
;
提前致谢
【问题讨论】:
-
问题不在于您发布的任何代码行。显然,您的
list在此之前已经损坏了一段时间。 -
堆栈跟踪与发布的源不对应(push_back vs push_front等)
-
您的程序没有抛出异常,而是您的操作系统正在通过分段错误使您的程序摆脱困境。