2016-09-16 3 views
-2

У меня проблема с методом подкачки, который я пытаюсь написать. Я убежден, что это этот раздел кода, поскольку он генерирует только исключение, когда программа завершается, если эти строки раскоментированы. Прокомментируйте их, и файл завершится правильно. Мои классы и функция, с которой у меня возникают проблемы, приведены ниже.Проблема с методом свопинга

class WordOccurrence { 
public: 
    //Constructor 
    WordOccurrence(const std::string& word = "", int num = 0) { num_ = num; word_ = word; }; 

    //Member Functions 
    bool matchWord(const std::string &); // returns true if word matches stored 
    void increment(); // increments number of occurrences 

    //Accessors 
    std::string getWord() const; 
    int getNum() const; 

private: 
    std::string word_; 
    int num_; 
}; 

//Bag 
class WordList { 
    public: 
     //Big 3: 
     WordList(int size = 0) { size_ = size; wordArray_ = size>0 ? new  WordOccurrence[size] : nullptr;}; 
     ~WordList() { delete[] wordArray_; }; 
     WordList(const WordList& list); 

     //Assignment Overload 
     WordList& operator =(const WordList& source); 

     //Member Functions 
     void addWord(const std::string &word); 
     friend void swap(WordOccurrence& first, WordOccurrence& second); 

     // void swap(WordOccurrence& lhs, WordOccurrence& rhs); 
     void sortList(); 
     void printList(); 
    private: 
     WordOccurrence *wordArray_; // a dynamically allocated array of WordOccurrences 
          // may or may not be sorted 
     int size_; 
}; 

и функция сортировки, содержащая обмен:

void WordList::sortList() { 
for (int i = 0; i < size_; ++i) { 
    for (int j = size_; j > i; --j) { 
     if (wordArray_[j].getNum() < wordArray_[j - 1].getNum()) { 
      WordOccurrence tmp(wordArray_[j].getWord(), wordArray_[j].getNum()); //problem is 
     // tmp = wordArray_[j];       // is 
      wordArray_[j] = wordArray_[j-1];    // in 
      wordArray_[j-1] = tmp;      // here 
      //swap(wordArray_[j], wordArray_[j - 1]); 
     } 
    } 
} 

}

Я попытался инициализацией «TMP» в пустой объект как хорошо, но это не делает разницы либо. Я также пробовал std :: swap, и он бросает ту же самую «вызванную точку останова», когда программа завершается. Опять же, ошибка исчезает, если я прокомментирую проблемы. Любая помощь будет оценена!

+2

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

ответ

0

С учетом кода член size_ определяет размер динамически распределенного wordArray_.

for (int j = size_; j > i; --j) { 
    if (wordArray_[j].getNum() < wordArray_[j - 1].getNum()) { 

Это будет стекать мимо конца массива, что приводит к непредсказуемому поведению, и, вероятно, аварии.

j начинается с size_. Поскольку size_ - фактический размер wordArray_, а wordArray_ содержит элементы с номерами от 0 до size_-1, то wordArray_[j], на первой итерации, не существует. Это твоя ошибка.

+0

Спасибо! Я должен был это понять, но я был убежден, что это имеет какое-то отношение к объектам разного размера, которые вызывали проблему. – Cos