交换方法有问题

时间:2016-09-16 01:37:46

标签: c++ arrays dynamic swap

我遇到了一个我正在尝试编写的交换方法的问题。我确信这是代码的这一部分,因为它只会在程序终止时抛出异常,如果这些行被取消注释。注释掉它们,文件正确终止。 我的课程和我遇到问题的功能如下。

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_;
};

和包含swap的sort函数:

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,当程序终止时,它会抛出相同的“触发断点”错误。如果我注释掉问题行,错误就会消失。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分: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]不存在。那是你的错误。