来自构造函数的段错误

时间:2015-03-29 14:43:28

标签: c++

我在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;
 };

2 个答案:

答案 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();
}