std::tr1::shared_ptr and dynamic_cast

std::tr1::shared_ptr and dynamic_cast

本文关键字:dynamic cast and ptr shared std tr1      更新时间:2023-10-16

我使用 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一起工作吗?

任何提示都非常感谢!

从提供的代码中,问题并不明显,但很可能

也很明显:
  • documents.at(i)不返回有效的TokenizedDocument指针
  • tokenizedDoc->getProperty(TokenizedDocument::_PROPERTY_RAW_DOCUMENT)返回无效指针。

很难说出可能出了什么问题。这可能是由于缓冲区溢出或访问已释放的指针,因为此类事情可能会覆盖 vtable 指针(发生在对象的开头)。尝试在瓦尔格林德运行该程序。

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

不要在C++代码中使用这样的 old-C 强制转换:

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

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