Задать вопрос
@byulent

Ошибка сегментирования — из-за чего?

Имеется класс:
class tree{
private:
    vector<node> nodes;
    vector<wstring> codedString;
    int fmax;
    int inode1;
    int inode2;
public:
    void extractString(wstring str); //Разделяем строку на первичные узлы
    void construct();
    void codeString (wstring str);
    void printCodedString();
    void printFreqTable();
    void printCodeTable();
    void codeNodes();
    void code(node& n, int level);
    void selectNode (wstring str);
    wstring decodeString ();
    void findCode (wstring str);
    node findNode (wstring code);
    bool inNodes (wstring str);
    bool inNodes (int freq);
    void getMinNode1();
    void getMinNode2();
};


Сам объект node:
class node{
private:
    int freq, child1, child2;
    wstring sym;
    wstring code;
    bool flag;
public:
    node(int fr, int ch1, int ch2, wstring s, wstring c):freq(fr),child1(ch1),child2(ch2),sym(s),code(c),flag(false){};
    int getFreq();
    int getChild1();
    int getChild2();
    wstring getCode();
    //bool getFlag();
    wstring getSym();
    void incFreq();
    void incCode(int val);
    void toggle();
   //bool operator> (node& n);
   bool operator<= (node& n);
};


Функция, создающая вектор с нодами:
void tree::extractString (wstring str)
{
    wcout << L"извлекаются узлы из строки" << endl;
    for (int i=0; i<str.size()/2; i++){
        wstring tmp = str.substr (i*2, 2);
        if (inNodes(tmp)) selectNode(tmp);
        else {
            node n  (1, -1, -1, tmp, L"");
            nodes.push_back(n); //тут и возникает ошибка
        }
    }
    wcout << L"узлы извлечены" << endl;
}


main, где всё это вызывается:

int main(){
	setlocale (LC_ALL, "");
	tree t;
	wstring str;
	wcout << L"Введите строку" <<endl;
	getline(wcin, str);
	t.extractString(str);
        //и так далее
}

Так вот, если поле code у объектаnodeимеет тип wstring, как сейчас - в функции на втором же узле выскакивает ошибка сегментации.
Введите строку
Корабли лавировали, лавировали, да не вылавировали
извлекаются узлы из строки
Ошибка сегментирования (сделан дамп памяти)

Стоит его заменить на int (и заодно поменять реализацию всего, что с этим полем связано) - всё успешно создаётся, но этот тип для моих целей не подходит.

Вопрос: почему вектор из объектов с одним строковым полем создаётся, а с двумя - уже нет? Что здесь не так?
  • Вопрос задан
  • 866 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@abcyu
Разработчик
int всегда передается по значению, если не приказано передавать по ссылке.
А вектора и строки? Как ты думаешь?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
почему вектор из объектов с одним строковым полем создаётся, а с двумя - уже нет? Что здесь не так?

Без полного исходного текста можно сказать только то, что ошибка, скорее всего, где-то в другом месте.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы