我在main()
中调用此代码for (COwnerList l=b1.ListOwners(10); !l.AtEnd(); l.Next())
cout << l.Surname() << ", " << l.Name () << endl;
for (CCarList l=b1.ListCars("Peter","Smith"); !l.AtEnd(); l.Next ())
cout << l.RZ () << ", " << l.VIN() << endl;
for (COwnerList l=b1.ListOwners(10); !l.AtEnd(); l.Next())
cout << l.Surname() << ", " << l.Name() << endl;
我尝试调试并发现seg fault来自COwnerList的构造函数
COwnerList CRegister::ListOwners (unsigned int vin) const
{
vector<Car>::const_iterator it;
COwnerList tmp;
it = lower_bound(byVINList.begin(), byVINList.end(), Car("",vin), cmpVIN);
if(it != byVINList.end())
tmp.car = &(*it);
tmp.in = it->owners.end() - it->owners.begin();
return tmp;
}
构造函数im调用看起来像这样:
COwnerList::COwnerList(void)
{
here = car->owners.begin();
i = 0;
in = car->owners.end() - car->owners.begin();
}
有趣的是它在main()之后没有崩溃,所以在main()中循环的那些2之间的代码肯定有问题,但是我不知道它可能是什么我不修改任何相关的东西到ListOwners()那里
EDIT1
汽车构造函数:
Car::Car( const string & pid,
const unsigned int & pvin = 0,
const string & cname = "",
const string & csurname = "")
{
rz = pid;
VIN = pvin;
name = cname;
surname = csurname;
}
EDIT2
class COwnerList
{
public:
COwnerList(void);
string Name ( void ) const;
string Surname ( void ) const;
bool AtEnd ( void ) const;
void Next ( void );
//vector<pair<string, string> > powners;
const Car *car;
int in;
private:
vector<pair<string, string> >::const_iterator here;
int i;
};
答案 0 :(得分:1)
在将tmp.toto
指针保存到向量的内部存储器后,错误更可能是在修改向量。
请注意,执行tmp.car = &(*it)
时,您正在指向向量的内部存储。
如果稍后在向量上调用push_back()
,则不能依赖之前的指针,因为在调用push_*
方法后,向量可以在其他内存地址中重新分配其内容。 / p>
另请注意,调试器可能无法确定必须更正的确切行,即使崩溃发生在那里也是如此。调试器可能会告诉您问题明显的第一行,但问题的原因可能在几行之前发生过。
答案 1 :(得分:1)
问题是在COwnerList构造函数的调用期间未初始化car指针。在第一个循环中,你可能很幸运。像这样的事情一直在发生。有时,当您调用尚未分配的代码时,操作系统不会每次都抛出一个seg错误。
只需在你的代码中添加一个条件守卫:
if (car != NULL) {
here = car->owners.begin();
i = 0;
in = car->owners.end() - car->owners.begin();
}