后,我有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()不在这里复制),一切都很好。然后我构建PCandidate对象与make_shared
,将其推入短语载体,当尝试访问`短语矢量给我看Pcandidate的内容,主题聚类我得到一个分段错误。
我不能这样做
std::wcout << ptr->topics->phrases.size() << std::endl
其中ptr
是指向PCandidate
。 topics
是包含短语向量的CCandidate的指针。
它会给我
==10013== Invalid read of size 8
看到CCandidate短语向量的大小。
我,因为我现在不到哪追查问题,因为昨天坐在这个有点失落。这可能是一个血腥的初学者的错误。缺少复制构造函数/赋值运算符吗?如果是,他们应该怎么样?例如复制整个短语矢量,就像是一个深层复制?我认为迄今为止默认的复制/分配应该是确定的。
将是巨大的,如果有人可以告诉我的错误或如何解决这个问题!在此先感谢您的时间!
@DrewDormann:没错。我编辑了我的问题来澄清这一点。 – 2013-04-24 05:07:09
什么'std :: wcout << ptr'输出?什么关于'std :: wcout << ptr->主题'? – 2013-04-24 05:08:23
@DrewDormann:ptr是一个指向'PCandidate'的指针。 'PCandidate'有一个指向'CCandidate'类的指针。所以,如果我想打印'CCandidate'的短语矢量的'大小()',我会做一个'ptr-> topics-> phrases.size()'。正如您在for循环中看到的那样,'CCandidate'的副本被保存到'PCandidate'中。 – 2013-04-24 05:12:45