我遇到了一个我正在尝试编写的交换方法的问题。我确信这是代码的这一部分,因为它只会在程序终止时抛出异常,如果这些行被取消注释。注释掉它们,文件正确终止。 我的课程和我遇到问题的功能如下。
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,当程序终止时,它会抛出相同的“触发断点”错误。如果我注释掉问题行,错误就会消失。任何帮助将不胜感激!
答案 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]
不存在。那是你的错误。