Segfault на ровном месте

240
20 апреля 2018, 16:06

Доброго времени суток. Пишу достаточно простую программку под Linux. Вот кусок кода в котором вылазит ошибка сегментации:

void GetNames(vector<string> &names, vector<string> &types) { // Cчитывание и запись нужных sm-переменных из текст. файла в матрицу
if (!FlashHere()) return;
string buf;
unsigned int num = 0;
ifstream in(NAMES_DIR);
while (!in.eof()) {
    getline(in, buf, ';');
    num++;
            cout << num << endl;
}
    num = num -1;
names.resize(num);
types.resize(num);
    in.clear();
in.seekg(0, ios::beg); //возврат потока в начало файла
for (unsigned int i = 0; i < names.size(); i++)
    {
            getline(in, buf, '.');
            types[i] = buf;
    getline(in, buf, ';');
    names[i] = buf;
            cout<< "|" << names[i] << "|" << types[i] << "|" << endl;
}
in.close();

}

void InitFBD(vector<string> &names, vector<string> &types, Shm &mymem) {

    for (unsigned int num = 0; num < names.size(); num++) {
        if (types[num] == "bool" && mymem.getType(names[num].c_str()) == BOOL)
                    {cout<< num << names[num] << " is ok"<< endl;continue;}
        else if (types[num] == "float" && mymem.getType(names[num].c_str()) == FLOAT)
             {cout<< num << names[num] << " is ok"<< endl;continue;}
        else if (types[num] == "short" && mymem.getType(names[num].c_str()) == SHORT)
             {cout<< num << names[num] << " is ok"<< endl;continue;}
        else if (types[num] == "long" && mymem.getType(names[num].c_str()) == LONG)
             {cout<< num << names[num] << " is ok"<< endl;continue;}
                    else{ cout<< num << " "<< "oooops";exit(1);}
    }
            cout << "oooops";
}

Видно я что то не понимаю. За пределы массива вроде нигде не выхожу. Последний цикл успешно завершается, но вместо последнего вывода в консоли видно Segmentation fault. Голову сломал. Help please.

Answer 1

Проблема решена. Неправильно передавал объект класса в функцию (Shm mymem).

Answer 2

Попробуйте не использовать потенциально опасное обращение к несуществующему элементу вектора через at(), он же оператор []:

void GetNames(vector<string> &names, vector<string> &types) {
if (!FlashHere()) return;
string buf;
ifstream in(NAMES_DIR);
while (!in.eof()) {
    getline(in, buf, '.');
    types.push_back(buf);
    getline(in, buf, ';');
    names.push_back(buf);
    cout<< "|" << names.back() << "|" << types.back() << "|" << endl;
}
in.close();

Самая частая ошибка при работе с вектором - думать, что вектор это просто динамический массив. Это С++, тут само ничего не происходит, и даже если расширение data у вектора спрятано под капотом STL, знать о нем и о его механике работы мы все равно обязаны

READ ALSO
Автоматическое изменение размера viewporta&#39;a

Автоматическое изменение размера viewporta'a

У меня есть QGraphicsView виджет сделанный через дизайнерВ MainWidnow прописано:

198
C++ и Active Directory: ADDS vs ADSI

C++ и Active Directory: ADDS vs ADSI

Есть два инструмента взаимодействия с AD - это Active Directory Domain Services и Active Directory Service InterfacesЕсли я правильно понял, то первое - это просто сервис...

208
Проблема с CMake C++

Проблема с CMake C++

Здравствуйте, совсем недавно познакомился с CMake до этого работал с MakeИ вот после моего краткого знакомство никак не могу линкануть библиотеку...

227
Подключиться к sqlite3 на C unable to open database file

Подключиться к sqlite3 на C unable to open database file

Подключаю sqlite в нативе на андроидВылетает ошибка unable to open database file

206