好的,你们对我的上一个问题很有帮助,所以我会尝试另一个。这也是作业,虽然最后一个很旧,但已经提交,正在等待标记。因此,如果有什么会咬我,那可能就是这个问题。我已经混淆了班级名称等,因为仍然可以提交作业(对于其他学生)。
我有一个类,它的唯一成员是指向对象的指针。此类被构造为从它当前持有的指针公开某些操作 -Object *o_
这是Object{1, 2, 3, ...}
. 现在,我可以在没有任何内存泄漏或崩溃的情况下执行以下操作。
std::vector<ObjectPtr> v;
v.push_back(ObjectPtr(new Object1(..., ..., ...)));
v.push_back(ObjectPtr(new Object2(..., ...)));
v.push_back(ObjectPtr(new Object1(.., .., ..)));
// Copy Constructor Ptr
std::vector<ObjectPtr> v2(v);
// Assignment Operator Ptr
std::vector<ObjectPtr> v3;
v3 = v2;
所有这些都有效,并且没有内存泄漏。但是,如果我尝试从带有 a 的文件中读取内容,istream_iterator<ObjectPtr>
它就会开始泄漏。ObjectPtr 是唯一处理动态内存的类,Object *o_
它要么设置为 NULL,要么由Object{1, 2, 3, ...}
.
要读取的文件如下所示
对象1 ... ... 对象2 ... ... 对象1 ..
std::ifstream is("file.txt");
std::istream_iterator<ObjectPtr> in(is), end;
for (; in != end; ++in)
cout << *in << "\n";
ObjectPtr
用于读取这些值的友元函数看起来像
friend istream &operator>>(istream &is, ObjectPtr &op) {
std::string tmp;
while (std::getline(is, tmp)) {
if (tmp == "Object1") {
op.o_ = new Object1;
return is >> (Object1 &)*(op.o_); // Send it to operator>> for Object1
}
if (tmp == "Object2") {
op.o_ = new Object2;
return is >> (Object2 &)*(op.o_);
}
...
}
return is;
}
在这里的某个地方,它开始在我身上独角兽,我真的很想知道为什么。
简而言之 - istream_iterator 在赋值和复制构造函数正常工作时泄漏内存,这让我相信类Object{1, 2, 3, 4, ..}
的构造正确,问题出在operator>>
.