後,我有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