【发布时间】:2011-01-18 21:12:29
【问题描述】:
我有一个班级,其中有一个名为 _Emails 的成员。它的类型为set<PEmail*>。当我在成员函数中并运行以下代码时,它按预期工作:
for( set<PEmail*>::iterator it=this->_Emails->begin(); it!=this->_Emails->end(); ++it )
{
cout << "Email: " << (*it)->getEmail() << endl;
}
也就是说,它会生成一个电子邮件地址列表。现在,我希望能够随着班级的增长而添加到这个集合中,并且不会失去我上次迭代的位置。我试图让我的班级的另一个成员,名为_EmailItr,类型为set<PEmail*>::iterator。我在构造函数中初始化它,就在我的 _Emails 之后,如下所示:
this->_Emails = new set<PEmail*>;
this->_EmailItr = this->_Emails->begin();
然后,尝试执行类似的 for 循环:
// send the max queue amount, or until there are no more emails
for( int i=0; i<this->_QueueSize || i==_Emails->size(); ++i )
{
cout << "i: " << i << endl;
cout << "QueueSize: " << this->_QueueSize << endl;
cout << "Emails: " << this->_Emails->size() << endl;
cout << (*_EmailItr)->getEmail() << endl;
}
我得到以下输出:
i: 0
QueueSize: 2
Emails: 2
Segmentation fault
什么给了?我是否试图以不正确的方式使用迭代器?
【问题讨论】:
-
以下划线和大写字母开头的标识符保留用于所有目的的实现。我建议在您遇到非常奇怪的错误之前更改这些标识符并摆脱下划线大写的习惯。
-
附带说明,如果您想使用有序容器(即
std::set、set:map及其多个对应物)来存储指向对象的指针(set<PEmail*>)而不是您的对象的副本' 否则需要提供严格的弱排序谓词,否则您会遇到一些意外...... -
@David:他们被保留是什么意思?我从来没有被告知过,你能告诉我吗?谢谢!
-
这是标准的第 17.4.3.1.2 节:某些名称和函数签名集始终保留给实现: — 每个名称包含双下划线 _ 或以下划线开头,后跟大写字母 (2.12) 保留给实现以供任何使用。 — 每个以下划线开头的名称都保留给实现,用作全局命名空间中的名称。
标签: c++ iterator segmentation-fault