アプリケーションで segfault をデバッグしようとしましたが、何が問題なのかわかりません。完全なコードを投稿するには複雑すぎるため、問題をより単純なバージョンに分解しようとしましたが、私の基本的な例が問題なく機能することを確認するためだけに.
ただし、アプリケーションを実行しようとしてまだ立ち往生しているため、次のエラーに関する情報をいただければ幸いです。非常に役立ちます。
Program received signal SIGSEGV, Segmentation fault.
0x00007fffdd921f38 in main_arena () from /lib/libc.so.6
getType()
これは、次の行に沿って呼び出そうとすると発生します。
std::map<long, QVAbstractElement *> mElements;
<...>//skipping some stuff
LineElement * insert_el = new LineElement();
mElements[0] = insert_el;
<...>//skipping a lot more stuff
AbstractElement * el = mElements.at(0);
if (!el)
{
printf("ERROR");
return (1);
}
int t = el->getType();
この場合、ポインターel
が有効であることはわかっていますが、実際のオブジェクトは、LineElement
から派生したでAbstractElement
あり、基本クラス ( ) にのみ実装されてgetType()
いる関数です。gdb でデバッグすると、次のポインタ アドレスが得られます。virtual
AbstractElement
(gdb) x el
0x11cf600: 0xdd921f48
(gdb) p el
$1 = (class AbstractElement *) 0x11cf600
今、その関数 () を gdb から呼び出そうとするとgetType
、次のようになります。
(gdb) x el->getType()
warning: can't find linker symbol for virtual table for `AbstractElement' value
warning: can't find linker symbol for virtual table for `AbstractElement' value
基本的に、ポインタ チェックが機能し、このオブジェクトを作成したときと比較してアドレスが同じであっても、このオブジェクトの関数を呼び出すことはできないと思います。
最初の質問: これは、異なるスレッドからの呼び出しと関係がありますか? UI に Qt を使用していますが、Qt が独自のスレッドを作成しているかどうか 100% 確信が持てませんか?
2 番目の質問: これは実際には問題がコードのどこかにある可能性があり、結果として関数テーブルが台無しになっていることを意味するのでしょうか?