0

我使用shared_ptrwith 构造这样的对象:

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

Don't use such old-C cast in your C++ code:

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

Looks like your document.at(i) returns pointer to something else. Try to remove (TokenizedDocument *) completely.

于 2012-07-08T20:50:00.573 回答