std::tr1::shared_ptr and dynamic_cast
std::tr1::shared_ptr and dynamic_cast
我使用 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 *)
。
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- C++类中的二维"dynamic"数组?
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- protobuf in C++ with dynamic binding for google::protobuf::M
- 警告的原因是什么:"when type is in parentheses, array cannot have dynamic size"?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- CUDA 错误:"dynamic initialization is not supported for __device__, __constant__ and __shared__ variabl
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- 如何修复'The procedure entry point SDL_RWclose could not be located in the dynamic link library'
- Shared_ptr cast vs static_cast speed
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- "The ordinal 344 could not be located in the dynamic link library"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- Dynamic Cast C++ Fail
- dynamic-cast-c++dynamic_cast错误处理