C++ std::tr1::共享\u ptr和动态\u cast
我使用C++ std::tr1::共享\u ptr和动态\u cast,c++,casting,smart-pointers,C++,Casting,Smart Pointers,我使用shared\u ptr构建如下对象: std::tr1::shared_ptr<RawClusterBase> rawCluster(new RawClusterBase()); // ... rawCluster->addLabel(p->userFriendlyTerms()); // ... const TokenizedDocument * tokenizedDoc = (TokenizedDocument *)documents.at(i); co
shared\u 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\u cast
分析子类。我还计划在那里使用共享\u ptr
但是我担心我会遇到同样的麻烦。dynamic\u cast
是否与shared\u ptr
一起工作
任何提示都将不胜感激 很难说到底出了什么问题。这可能是由于缓冲区溢出或对解除分配的指针的访问,因为这类情况可能会覆盖vtable指针(发生在对象的开头)。尝试在Valgrind中运行该程序
通常情况下,
dynamic\u cast
不应崩溃。如果强制转换无效,它将返回nullptr
(或在使用引用时抛出std::bad_cast
),如果强制转换完全不可能,它将无法编译。但它不会调用UB,所以我会在别处寻找罪犯。很难判断出哪里出了问题。这可能是由于缓冲区溢出或对解除分配的指针的访问,因为这类情况可能会覆盖vtable指针(发生在对象的开头)。尝试在Valgrind中运行该程序
通常情况下,
dynamic\u cast
不应崩溃。如果强制转换无效,它将返回nullptr
(或在使用引用时抛出std::bad_cast
),如果强制转换完全不可能,它将无法编译。但是它没有调用UB,所以我会在别处寻找罪魁祸首。从提供的代码中看问题并不明显,但很可能:
不返回有效的documents.at(i)
指针TokenizedDocument
正在返回无效指针tokenizedDoc->getProperty(TokenizedDocument::_PROPERTY_RAW_DOCUMENT)
不返回有效的documents.at(i)
指针TokenizedDocument
正在返回无效指针tokenizedDoc->getProperty(TokenizedDocument::_PROPERTY_RAW_DOCUMENT)
不要在C++代码中使用这样的旧C转换:
const TokenizedDocument * tokenizedDoc
= (TokenizedDocument *)documents.at(i);
看起来像您的
文档。at(i)
返回指向其他内容的指针。尝试删除<代码>(ToKeEndEdvest*)< /C>完全> ./P> < P>不要在C++代码中使用这样的旧C转换:
const TokenizedDocument * tokenizedDoc
= (TokenizedDocument *)documents.at(i);
看起来像您的
文档。at(i)
返回指向其他内容的指针。尝试完全删除(标记化文档*)
。什么是标记化文档?它是如何初始化的?调用的方法返回什么?最后,被调用的方法是做什么的?您不是在共享指针上使用dynamic cast,而是在tokenizedDoc->getProperty上使用它。。。发布代码的其余部分,最好是一个简单的示例。将tokenizedDoc->getProperty(TokenizedDocument::\u PROPERTY\u RAW\u DOCUMENT)
的返回值放在某个临时变量中,并确保它指向有效的多态对象。也许不是。@Mahesh:对不起,忘了那句话。我刚刚加了。TokenizedDocument是从向量中提取的对象,指向属性值。@eran:我需要像这样强制转换该行,不能将其放入tmp中。变量,因为必须将其从基对象强制转换为派生类型RawDocument。如果没有这个强制转换,我会得到一个编译器错误。什么是tokenizedDoc?它是如何初始化的?调用的方法返回什么?最后,被调用的方法是做什么的?您不是在共享指针上使用dynamic cast,而是在tokenizedDoc->getProperty上使用它。。。发布代码的其余部分,最好是一个简单的示例。将tokenizedDoc->getProperty(TokenizedDocument::\u PROPERTY\u RAW\u DOCUMENT)
的返回值放在某个临时变量中,并确保它指向有效的多态对象。也许不是。@Mahesh:对不起,忘了那句话。我刚刚加了。TokenizedDocument是从向量中提取的对象,指向属性值。@eran:我需要像这样强制转换该行,不能将其放入tmp中。变量,因为必须将其从基对象强制转换为派生类型RawDocument。如果没有这个强制转换,我会得到一个编译器错误。我会尽力在代码的其他地方找到问题,为什么它会失败。。。。也许在我的propertyProvider课程中。只是我看不到其他问题,即使valgrind告诉我,如果我不使用shared_ptr,也不会有太多问题。但我会进一步看…已经过了几个星期了,但我通过对属性提供程序类的一些更改解决了这个问题,这些更改确实返回了一个无效指针,该指针带有在其他部分调用的对象克隆。我删除了这段代码(因为它是冗余的),并且对属性类本身的克隆方法做了一些更改。我认为是罪魁祸首,因为由于这些代码的更改,错误消失了,现在有问题的部分的动态_cast工作正常!我尽我最大的努力在我的代码的其他地方找到问题,为什么它失败了。。。。也许在我的propertyProvider课程中。只是我看不到其他问题,即使valgrind告诉我,如果我不使用shared_ptr,也不会有太多问题。但我会进一步看…已经过了几个星期了,但我通过对属性提供程序类的一些更改解决了这个问题,这些更改确实返回了一个无效指针,该指针带有在其他部分调用的对象克隆。我删除了这段代码(因为它是冗余的),并且对属性类本身的克隆方法做了一些更改。我认为是罪魁祸首,因为由于这些代码的更改,错误消失了,现在有问题的部分的动态_cast工作正常!你说的有道理,但是如果没有共享的ptr,我看不到任何问题,如果存在无效的ptr,动态的\u cast将失败。但事实并非如此。当我添加共享_ptr时,我开始