复制后子类中的丢失指针
Loosing pointer in subclass after copy
我有两个类:
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
是指向CCandidate的指针,其中包含短语vector。
它会给我
==10013== Invalid read of size 8
查看CCandidate中短语向量的大小。
我有点迷路了,因为我不知道现在在哪里追踪问题,从昨天开始坐在这里。这可能是新手犯的错误。缺少拷贝构造函数/赋值操作符吗?如果是,它们应该是什么样子?比如复制整个短语向量,比如深度复制?到目前为止,我认为默认的复制/赋值应该是可以的。
如果有人能告诉我错误或如何解决这个问题,那就太好了!提前感谢您的时间!您首先使用mergeList.size()
NULL共享指针填充phrases
向量,然后在之后将真实的放在中。
std::vector<std::shared_ptr<PCandidate> > phrases(mergeList.size());
所以第一个mergeList.size()
指针在你的向量是NULL。取消初始大小
std::vector<std::shared_ptr<PCandidate> > phrases;
如果你想保留容量,你可以,但最终共享指针仍然必须通过它们的引用计数算法。我会跳过它,只做上面的
相关文章:
- 通过指向指针数组的指针访问子类的属性
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 将C++子类成员函数(虚拟实现)传递给 C 类型函数指针
- 为什么带有指针子对象的文字类类型的 constexpr 表达式不能是非类型模板参数
- 为什么使用父指针指向子类?
- C++通过基类指针提升子类的序列化
- 如果指针的子类的方法对于子类是唯一的,如何访问这些方法?
- C++基类指针调用子虚函数,为什么基类指针可以看到子类成员
- 为什么指向基类的指针可以指向子类的对象?
- C++ 使用正确的子类指针
- 如何在 BaseClass 指针数组中存储指向子类对象的指针?
- 带有基类指针的强制转换向量,指向子类
- 跨子类的共享指针
- 无法将参数 3 从 'const QGraphicsItem *' 转换为 'const QObject *',这是指针,对象是 QGraphicsObject 的子类
- 如何从其抽象母类上的指针初始化子类?
- 可以将指向子类的指针分配给Varibale的超级类型
- 声明基类类型的指针,但随后通过指向子类来实例化它.这是良好的编程实践吗?
- C++ - 如何使用基指针重写子类方法
- 指向子类对象的指针的静态数组出现问题
- Arduino:指针子类的继承和数组