2013-04-24 55 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