我使用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
吗?
非常感谢任何提示!
答案 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 *)
。