std :: tr1 :: shared_ptr和dynamic_cast

时间:2012-07-08 14:10:31

标签: c++ casting smart-pointers

我使用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吗?

非常感谢任何提示!

3 个答案:

答案 0 :(得分:2)

问题在所提供的代码中并不明显,但很可能是:

  • documents.at(i)未返回有效的TokenizedDocument指针
  • tokenizedDoc->getProperty(TokenizedDocument::_PROPERTY_RAW_DOCUMENT)返回无效指针。

答案 1 :(得分:1)

很难说出可能出现的问题。这可能是由于缓冲区溢出或访问解除分配的指针,因为这样的事情很可能会覆盖vtable指针(发生在对象的开头)。尝试在Valgrind中运行该程序。

通常dynamic_cast不应该崩溃。如果转换无效,则返回nullptr(或在使用引用时抛出std::bad_cast),或者如果转换完全不可能则无法编译。但是它没有调用UB,所以我会在其他地方寻找罪魁祸首。

答案 2 :(得分:0)

不要在C ++代码中使用这样的旧C版:

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

看起来你的document.at(i)会返回指向其他内容的指针。尝试完全删除(TokenizedDocument *)