我有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 回答
你最初使用
mergeList.size()
NULL 共享指针填充你的phrases
向量,然后在那些之后推送真正的向量 .所以向量中的第一个
mergeList.size()
指针是NULL . 丢失最初的尺寸 .如果你想保留容量,你可以,但最终共享指针仍然必须通过他们的引用计数算法 . 我会跳过它而只是做上面的事情 .