C ++为什么这个向量访问会产生运行时错误?

时间:2009-01-24 16:47:10

标签: c++ runtime-error

我在这行代码中挑出了一个运行时错误:

for (synsAuxCopyIndex=1; synsAuxCopyIndex<synsAux.size(); synsAuxCopyIndex++)

哪个在pushSynonyms(string synline, vector<WordInfo> &wordInfoVector)函数内运行。我不明白为什么这个特定的行会产生错误,因为我认为我没有将任何超出范围的索引。

调试器说:

Uncontrolled Exception 0x00411cbf in program.exe: 0xC0000005: Infracción de acceso al leer la ubicación 0x00000000.

我猜“Infraccióndeacceso”将翻译为英语调试器上的未经授权的访问权限。

输入文件是

dictionary.txt

1 cute
2 hello
3 ugly
4 easy
5 difficult
6 tired
7 beautiful
synonyms
1 7
7 1
antonyms
1 3
3 1 7
4 5
5 4
7 3

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

class WordInfo{
 public:                
  WordInfo() {}

  ~WordInfo() {}

  int id() const { return myId; }

  void readWords(istream &in) {
    in >> myId >> word;     
  }

  vector<int>& getSynonyms () {
    return mySynonyms;
  }

  vector<int>& getAntonyms() {
     return myAntonyms;
  }

  string getWord() {
    return word;
  }

  void pushSynonyms (string synline, vector<WordInfo>& wordInfoVector) {
    stringstream synstream(synline);
    vector<int> synsAux;
    int num;
    while (synstream >> num)
      synsAux.push_back(num);
    int wordInfoVectorIndex;
    int synsAuxCopyIndex;
    for (wordInfoVectorIndex=0;
         wordInfoVectorIndex < wordInfoVector.size();
         wordInfoVectorIndex++) {
      if (synsAux[0] == wordInfoVector[wordInfoVectorIndex].id()) {
        // this is the line that's generating a Runtime Error, Why?                                                       
        for (synsAuxCopyIndex = 1;
             synsAuxCopyIndex < synsAux.size();
             synsAuxCopyIndex++) {
//        wordInfoVector[wordInfoVectorIndex].mySynonyms.push_back(
//            synsAux[synsAuxCopyIndex]);
        }                                                          
      }     
    }
  }

  void pushAntonyms (string antline, vector<WordInfo> wordInfoVector) {
    stringstream antstream(antline);
    vector<int> antsAux;
    int num;
    while (antstream >> num)
      antsAux.push_back(num);
//    for (int i=0; i<antsAux.size(); i++){
//      cout<<antsAux[i]<<endl;  
//    }
  }

  //--dictionary output function
  void printWords (ostream &out) {
    out<<myId<< " "<<word;     
  }

  //--equals operator for String
  bool operator == (const string &aString) const {
    return word ==aString; 
  }

  //--less than operator
  bool operator < (const WordInfo &otherWordInfo) const {
    return word<otherWordInfo.word;
  }

  //--more than operator
  bool operator > (const WordInfo &otherWordInfo) const {
    return word>otherWordInfo.word;
  }

 public: 
  vector<int> mySynonyms;
  vector <int> myAntonyms;

 private:
//vector <int> mySynonyms;
//vector <int> myAntonyms;
  string word;
  int myId;
};

//--Definition of input operator for WordInfo
istream & operator >> (istream &in, WordInfo &word) {
  word.readWords(in); 
}

//--Definition of output operator
ostream & operator << (ostream &out, WordInfo &word) {
  word.printWords(out);  
}

int main() {
  string wordFile;
  cout << "enter name of dictionary file: ";
  getline (cin, wordFile);
  ifstream inStream(wordFile.data());
  if (!inStream.is_open()) {
    cerr << "cannot open " << wordFile << endl; 
    exit(1);                      
  }

  vector <WordInfo> wordInfoVector; 
  WordInfo aword;

  while (inStream >> aword && (!(aword == "synonyms")))
    wordInfoVector.push_back(aword);

  inStream.clear();

  int i=0;          
  while (i < wordInfoVector.size()) {
    cout << wordInfoVector[i] << endl;
    i++;
  }

  vector <int> intVector;
  string synLine; 

  while (getline(inStream, synLine) && (synLine != ("antonyms")))
    aword.pushSynonyms(synLine, wordInfoVector);

  int theIndex;
  for (theIndex=0;
       theIndex < wordInfoVector[0].mySynonyms.size();
       theIndex++)
    cout << "the synonyms of 1 are " <<
        wordInfoVector[0].mySynonyms[theIndex] << endl;
  cout << "the size of mySynonyms of 1 is " <<
      wordInfoVector[0].mySynonyms.size() << endl;

  for (theIndex=0;
       theIndex < wordInfoVector[0].mySynonyms.size();
       theIndex++)  
    cout << "the synonyms of 7 are " <<
        wordInfoVector[6].mySynonyms[theIndex] << endl;
  cout << " the size of mySynonyms of 7 is " <<
      wordInfoVector[6].mySynonyms.size() << endl;

  string antLine;
  while (getline(inStream, antLine))
    aword.pushAntonyms(antLine, wordInfoVector);    

  wordInfoVector[0].mySynonyms.push_back(1);
  system("PAUSE");
  return 0;          
}

1 个答案:

答案 0 :(得分:6)

如果你为程序添加一些调试输出,你会注意到你从未进入甚至到达“循环”的“罪魁祸首”。

问题实际上是针对它上方的“synsAux [0]”的测试 - synxAux.size()为零,因此访问第0个元素是索引越界错误。