1

それで、私は std::stack ライブラリと戦っています。私は自分のコードをデバッグしようとしていますが、ペンと紙で作業するのではなく、Eclipse デバッガーを使用しています。

最初の奇妙なことは、eclipse 式ウィンドウにスタックに関連する式がある場合、プログラムを開始するとすぐにプログラムが停止することです。

もう 1 つのことは、最初に実行したときに、デバッガーがスタックを正常に認識したことです。式ウィンドウからその要素を調べることができました。しかし、何かをスタックにプッシュするとすぐに、式ウィンドウで stack.top() メソッドがエラーを返し始めました。次に、プログラムをステップ実行しようとすると、プログラムが停止します。これは、デバッガーなしで実行したときの動作ではないため、ここで本当に途方に暮れています。

問題のコードは次のとおりです。

ステップ オーバーを押すだけで、Eclipse が stl_deque.h ファイルからウィンドウを開き、ステップ リターンを押すと終了します。

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

1 に答える 1

2

あなたのコードは問題ありません (少なくとも、あなたが私たちに示したコードの一部)。あなたが説明している問題は、Eclipse デバッガーで評価しようとするとクラッシュすることstack.top()です。これは Eclipse のバグ (具体的には、C++ コンテナー タイプを検査するための組み込みサポートのバグ) であり、自分で簡単に修正できるものではありません。

考えられる回避策の 1 つは、独自のコードにデバッグ関数を追加することです。例えば

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

stack.top()次に、デバッグ セッションに参加したいときはいつでも、*stackTop(&stack)代わりに入力します。のこの定義はstackTop、テンプレート、インライン化、参照、およびムーブ セマンティクス (これらはすべて、平均的なデバッガーが問題を抱えていると私が予想するものです)の処理を​​回避していることに注意してください。ポインターを返します。この単純な関数に混乱するには、非常に愚かなデバッガーが必要です。

Eclipse がクラッシュすることなく正常に検査できる場合は、代わりに;std::vector<Cell>を使用するようにコードを書き直すことを検討してください。とにかく、これはおそらくより効率的です。vectorstack

于 2013-10-14T21:26:29.630 に答える