1

所以我在最后一天左右一直在与 std::stack 库进行斗争。我正在尝试调试我的一些代码,而不是用笔和纸做事,我正在使用 eclipse 调试器。

第一个奇怪的事情是,如果我在 eclipse 表达式窗口中有一个与堆栈相关的表达式,程序将在我启动它时立即死亡。

另一件事是,它第一次运行时,调试器看到堆栈正常。我可以通过表达式窗口检查它的元素。但是,一旦我将某些东西压入堆栈,stack.top() 方法就开始在表达式窗口中返回错误。然后,如果我尝试执行程序,它就会死掉。这不是在没有调试器的情况下运行时的行为,所以我真的很茫然。

这是问题代码:

我需要做的就是点击 step over,Eclipse 从 stl_deque.h 文件打开一个窗口,然后我点击 step return,它就死了。

int main() {
    std::stack<Cell> path;
    return 0;
}
4

1 回答 1

2

您的代码很好(至少,您向我们展示的部分代码)。您描述的问题只是当您尝试在其中进行评估时Eclipse 调试器stack.top()崩溃。这是 Eclipse 中的一个错误(特别是它对检查 C++ 容器类型的内置支持),而且您自己也不能轻易修复它。

一种可能的解决方法是将调试功能添加到您自己的代码中;例如

const Cell *stackTop(const std::stack<Cell> *stk)
{ return &stk->top(); }

然后,每当您想进入stack.top()调试会话时,请输入*stackTop(&stack)。请注意,这个定义stackTop避免了处理模板、内联、引用移动语义——所有这些都是我预计普通调试器会遇到麻烦的事情——相反,它只是一个接受指针和返回一个指针。一个非常愚蠢的调试器会被这个简单的函数弄糊涂。

如果 Eclipse 可以成功检查std::vector<Cell>而不会崩溃,那么您可能会考虑重写代码以使用vector而不是stack; 无论如何,这可能会更有效。

于 2013-10-14T21:26:29.630 回答