Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::tr1::共享\u ptr和动态\u cast_C++_Casting_Smart Pointers - Fatal编程技术网

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时,我开始