0

私はshared_ptrこのようなオブジェクトを構築する際に使用します:

std::tr1::shared_ptr<RawClusterBase> rawCluster(new RawClusterBase());
// ...
rawCluster->addLabel(p->userFriendlyTerms());
// ...
const TokenizedDocument * tokenizedDoc
   = (TokenizedDocument *)documents.at(i);
const RawDocument * rawDoc
   = dynamic_cast<const RawDocument *>(tokenizedDoc->getProperty(
      TokenizedDocument::_PROPERTY_RAW_DOCUMENT));
rawCluster->addDocument(rawDoc);

:の行でセグメンテーション違反が発生しdynamic_castます

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7b92429 in __dynamic_cast () from /usr/lib/libstdc++.so.6
(gdb) backtrace
#0  0x00007ffff7b92429 in __dynamic_cast () from /usr/lib/libstdc++.so.6
#1  0x0000000000444aa5 in main (argc=1, argv=0x7fffffffe258) at clustering/document_test.cpp:271

誰かが私にそれを解決する方法の指針を与えることができますか?プロジェクトには、dynamic_castサブクラスの分析に使用する別のセクションがあります。私もshared_ptrそこで使うつもりですが、同じトラブルに遭遇するのではないかと思います。dynamic_castで動作していませんshared_ptrか?

ヒントは大歓迎です!

4

3 に答える 3

2

提供されたコードからは問題は明らかではありませんが、おそらく次のいずれかです。

  • documents.at(i)TokenizedDocument有効なポインタを返しません
  • tokenizedDoc->getProperty(TokenizedDocument::_PROPERTY_RAW_DOCUMENT)無効なポインタを返しています。
于 2012-07-08T15:24:28.617 に答える
1

何がうまくいかないのか見分けるのは難しいです。バッファオーバーランまたは割り当て解除されたポインタへのアクセスが原因である可能性があります。これは、vtableポインタ(オブジェクトの先頭で発生する)を上書きする可能性があるためです。Valgrindでプログラムを実行してみてください。

通常dynamic_cast、クラッシュすることはありません。キャストが無効な場合は戻りますnullptr(または参照を使用する場合はスローstd::bad_castします)。キャストが完全に不可能な場合はコンパイルに失敗します。しかし、それはUBを呼び出さないので、私は他の場所で犯人を探します。

于 2012-07-08T15:11:40.700 に答える
0

このような古いCキャストをC++コードで使用しないでください。

const TokenizedDocument * tokenizedDoc
    = (TokenizedDocument *)documents.at(i);

document.at(i)他の何かへのリターンポインタのように見えます。(TokenizedDocument *)完全に削除してみてください。

于 2012-07-08T20:50:00.573 に答える