0

私は最近ここで質問をしましたが、残念ながら私が使用できる答えが得られませんでした:

C ++ STLリスト関数は、空のリストでセグメンテーション違反を起こします

問題をデバッグするために gdb を使用しようとしてきましたが、何かが何を意味するのかについて質問があります。

次のように、リストをクラスのメンバーとして宣言します。

std::list<Thing*> inventory;

...そして、それが入っているクラス (「pc」というオブジェクト) をインスタンス化します。gdbでは、これはメモリが割り当てられていることを示していると思いますか?

(gdb) p &pc.inventory
$7 = (std::list<Thing*, std::allocator<Thing*> > *) 0xbffff22c

さらに、コードの問題行の 1 行前 (本質的に、'inventory.size()' を呼び出すと segfault が発生します)、これはまだ保持されます。

(gdb) p &inventory
$8 = (std::list<Thing*, std::allocator<Thing*> > *) 0xbffff22c

...しかし、まだセグメンテーション違反が発生します:

(gdb) n
558   if (inventory.size() == 52) {
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x0804e3fe in std::_List_const_iterator<Thing*>::operator++ (this=0xbfff94e0)
at /usr/include/c++/4.4/bits/stl_list.h:223
223     _M_node = _M_node->_M_next;

私の質問は本質的にこれです:確かに、メンバーリストのアドレスがあれば、リストは存在し、それで size() を使用できるはずですか?? そうでない場合、なぜですか?そして、どうすればさらにデバッグできますか?

皆さんありがとう!

4

1 に答える 1

1

メモリ エラーをデバッグするには、プログラムを valgrind で実行することをお勧めします

valgrind --tool=memcheck プログラム名

valgrind によって指摘されたすべてのエラーを修正します

于 2013-02-27T19:31:54.907 に答える