2015-03-29 9 views
0

Я называю этот код в основном()ошибка Seg из конструктора

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; 

Я пытался отладки и выяснил, сегментную вина происходит от конструктора 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; 
} 

конструктор им вызов выглядит следующим образом:

COwnerList::COwnerList(void) 
{ 
    here = car->owners.begin(); 
    i = 0; 
    in = car->owners.end() - car->owners.begin(); 
} 

интересно, оно не зависания после 1 для в основной(), так что должно быть что-то неправильно в коде между го новления 2 для циклов в основной(), но я понятия не имею, что это может быть, я все, что связано владельцы рассылок() там

не изменяя 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

Есть слишком много пространства. –

+0

Что находится в 'lower_bound()' и что находится в конструкторе 'Car()'? – MondKin

+0

сбой на этой линии COwnerList tmp; во втором вызове – lllook

ответ

1

Проблема заключается в том, что указатель автомобиля не инициализируется во время вызова в конструкторе COwnerList. В первом цикле вам, возможно, повезло. Такие вещи случаются все время. Иногда ОС не будет генерировать ошибку seg каждый раз, когда вы вызываете код, который еще не выделен.

Просто поместите условие охранник в вашем коде, как это:

if (car != NULL) {  
    here = car->owners.begin(); 
    i = 0; 
    in = car->owners.end() - car->owners.begin(); 
} 
1

ошибка, скорее всего, вы изменяете вектор после сохраняя tmp.toto указатель на внутреннее хранилище вектора.

Обратите внимание, что когда вы делаете tmp.car = &(*it), вы делаете указатель на внутреннюю память вектора.

Если после этого вы назовете push_back() на вектор, вы не можете положиться на указатели, которые у вас были до этого, потому что вектор может перераспределить его содержимое в других адресах памяти после вызова методов push_*.

Также обратите внимание, что отладчик может не указывать точную строку, которая должна быть исправлена, даже если произошел сбой. Отладчик может сообщить вам первую строку, где проблема очевидна, но причиной проблемы может быть несколько строк раньше.

Смежные вопросы