2013-04-24 12 views
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()不在這裏複製),一切都很好。然後我構建PCandidate對象與make_shared,將其推入短語載體,當嘗試訪問`短語矢量給我看Pcandidate的內容,主題聚類我得到一個分段錯誤。

我不能這樣做

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

其中ptr是指向PCandidatetopics是包含短語向量的CCandidate的指針。

它會給我

==10013== Invalid read of size 8 

看到CCandidate短語向量的大小。

我,因爲我現在不到哪追查問題,因爲昨天坐在這個有點失落。這可能是一個血腥的初學者的錯誤。缺少複製構造函數/賦值運算符嗎?如果是,他們應該怎麼樣?例如複製整個短語矢量,就像是一個深層複製?我認爲迄今爲止默認的複製/分配應該是確定的。

將是巨大的,如果有人可以告訴我的錯誤或如何解決這個問題!在此先感謝您的時間!

+0

@DrewDormann:沒錯。我編輯了我的問題來澄清這一點。 – 2013-04-24 05:07:09

+0

什麼'std :: wcout << ptr'輸出?什麼關於'std :: wcout << ptr->主題'? – 2013-04-24 05:08:23

+0

@DrewDormann:ptr是一個指向'PCandidate'的指針。 'PCandidate'有一個指向'CCandidate'類的指針。所以,如果我想打印'CCandidate'的短語矢量的'大小()',我會做一個'ptr-> topics-> phrases.size()'。正如您在for循環中看到的那樣,'CCandidate'的副本被保存到'PCandidate'中。 – 2013-04-24 05:12:45

回答

1

你最初填充你的phrases向量與mergeList.size()NULL共享三分球,然後推真正那些在這些之後。

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

因此,向量中的第一個mergeList.size()指針是NULL。失去初始尺寸。

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

如果你想儲備能力,你可以,但最終的共享指針仍不得不通過他們的引用計數算法兩種方式。我會跳過它,只是做到了上述。

+0

這就是問題所在!我刪除了初始大小,現在該部分運行正常!謝謝你的提示! – 2013-04-24 06:01:47