首页 文章

复制后松散子类中的指针

提问于
浏览
1

我有2个班:

class CCandidate {
public:
    float score;
    BitSet documents;
    std::vector<std::vector<int> > phrases;
    int cardinality;

    /** For merging. */
    CCandidate()
    : score(0.0), documents(1), phrases(1), cardinality(0) {}

    /** */
    CCandidate(
    std::vector<int>& phraseIndices, BitSet& documents,
    int cardinality, float score) {

    this->phrases.reserve(1);
    this->phrases.push_back(phraseIndices);

    this->documents = documents;
    this->score = score;
    this->cardinality = cardinality;
    }
};

class PCandidate {
public:
    CCandidate * topics;
    float coverage;

    bool selected;
    bool mostGeneral;
    bool mostSpecific;

    PCandidate(CCandidate * c, float coverage)
    : topics(c), coverage(coverage), 
      selected(true), mostGeneral(true), mostSpecific(true) {}
};

在使用这些类的另一个类中,我有这样的东西:

// ...
std::vector<std::shared_ptr<PCandidate> > phrases(mergeList.size());

for (size_t i = 0; i < mergeList.size(); i++) {
    CCandidate * cc = baseTopics.at(mergeList.get(i));
    std::wcout << cc->toString() << std::endl;
    float coverage = cc->cardinality / result->cardinality;
    std::wcout << "coverage=" << coverage << std::endl;
    phrases.push_back(std::make_shared<PCandidate>(PCandidate(cc, coverage)));

    std::for_each(phrases.begin(), phrases.end(),
        [&](const std::shared_ptr<PCandidate>& pc) { 
            std::wcout << pc->toString() << " "; }); // error
    }
}

anotherMethod(phrases);

// ...

CCandidate cc 一切都很好(现在在这个版本中它是一个原始指针),我可以打印它的内容(方法toString()没有在这里复制),一切都很好 . 然后我使用 make_shared 构造PCandidate对象,将其推入短语向量,当尝试访问“短语”向量以向我显示Pcandidate的内容时,主题群集我得到了分段错误 .

我做不了类似的事情

std::wcout << ptr->topics->phrases.size() << std::endl

其中 ptr 是指向 PCandidate 的指针 . topics 是指向包含短语vector的CCandidate的指针 .

它会给我

==10013== Invalid read of size 8

在CCandidate中查看短语向量的大小 .

我有点失落,因为我现在没有在哪里追查问题,从昨天起就坐在这里 . 这可能是一个血腥的初学者错误 . 缺少复制构造函数/赋值运算符吗?如果是,他们应该怎么样?例如,复制整个短语向量,就像一个深层副本?到目前为止,我认为默认的副本/作业应该没问题 .

如果有人能告诉我错误或如何解决这个问题会很棒!在此先感谢您的时间!

1 回答

  • 1

    你最初使用 mergeList.size() NULL 共享指针填充你的 phrases 向量,然后在那些之后推送真正的向量 .

    std::vector<std::shared_ptr<PCandidate> > phrases(mergeList.size());
    

    所以向量中的第一个 mergeList.size() 指针是NULL . 丢失最初的尺寸 .

    std::vector<std::shared_ptr<PCandidate> > phrases;
    

    如果你想保留容量,你可以,但最终共享指针仍然必须通过他们的引用计数算法 . 我会跳过它而只是做上面的事情 .

相关问题