2016-09-08 16 views
-1

悪いメモリ割り当てのエラーが発生し続けます。私は一晩中過ごして、どこが間違っているのか見つけようとしましたが、何が分からないのですか。(C++)terminate 'std :: bad_alloc'のインスタンスをスローした後に呼び出されました

私はすべての行をコーディングしましたが、まだ何もしていません。私のプログラム/ラップトップは十分に強くないかもしれませんか?

助けが非常に役立つでしょう。私の頭が鳴っていて、休みが必要です。ここ は私のコードです:

#include <iostream> 
#include <fstream> 
#include <cstdlib> 
#include <vector> 
#include <string> 
#include <sstream> 
using namespace std; 

// struct to store word + count combinations 
struct wordItem{ 
    string word; 
    int count; 
}; 

void getStopWords(char *ignoreWordFileName, vector<string>& _vecIgnoreWords); 

bool isCommonWord(string word, vector<string>& _vecIgnoreWords); 

void printTopN(wordItem wordItemList[], int topN); 

void doubleArray(wordItem wordItemList[], int size); 

int getTotalNumberNonCommonWords(wordItem wordItemList[], int size, int wordCount); 

const int STOPWORD_LIST_SIZE = 50; 

// ./a.out 10 HW1-HungerGames_edit.txt HW1-ignoreWords.txt 
int main(int argc, char* argv[]){ 

    vector<string> vecIgnoreWords(STOPWORD_LIST_SIZE); 

    // verify we have the correct # of parameters, else throw error msg & return 
    if (argc != 4){ 
     cout << "Usage: "; 
     cout << argv[0] << " <number of words> <filename.txt> <ignorefilename.txt>"<< endl; 
     return 0; 
    } 

    //Set vector with stop words 
    getStopWords(argv[3], vecIgnoreWords); 

    //initialize struct array 
    int aSize = 100; 
    wordItem *theStructArray = new wordItem[aSize]; 
    int counter = 0; 
    int doubleCount = 0; 

    //read main txt file 
    ifstream inFile(argv[1]); 

    if(inFile.is_open()){ 
     string line; 
     string theWord; 

     //extract words from file 
     while(getline(inFile, line)){ 
      istringstream iss(line); 

      //extract and analyze word 
      while(iss >> theWord){ 
       if(!(isCommonWord(theWord, vecIgnoreWords))){ 
        bool inStructArray = false; 
        int inStructPosition; 

        //search for word in Struct array 
        while (inStructArray == false){ 
         for(int i=0; i<aSize; i++){ 
          if (theWord == theStructArray[i].word){ 
           inStructArray = true; 
           inStructPosition = i; 
          } 
         } 
         break; 
        } 

        //if word is in struct array 
        if (inStructArray == true){ 
         theStructArray[inStructPosition].count++; 
        } 

        //else if it isn't 
        else{ 
         //create new wordItem and add into struct       
         wordItem newWord; 
         newWord.word = theWord; 
         newWord.count = 1; 

         theStructArray[counter+(100*doubleCount)] = newWord; 
         counter++; 
        } 

        //if struct array hits maximum amount of elements, 
        if (counter == (aSize-1)){ 
         doubleArray(theStructArray, aSize); 
         counter = 0; 
         doubleCount++; 
         aSize +=100; 
        } 
       } 
      } 
     } 
     inFile.close(); 
    } 

    //Bubble sort masterArray 
    int bI, bJ, flag = 1; 
    wordItem bTemp; 

    for(bI=1; (bI <= aSize && flag); bI++){ 
     flag = 0; 
     for(bJ=0; bJ<aSize; bJ++){ 
      if(theStructArray[bJ+1].count > theStructArray[bJ].count){ 
       bTemp = theStructArray[bJ]; 
       theStructArray[bJ] = theStructArray[bJ+1]; 
       theStructArray[bJ+1] = bTemp; 
       flag = 1; 
      } 
     } 
    } 

    //Print topN words 
    printTopN(theStructArray, atoi(argv[1])); 

    //print others 
    cout << "#" << endl; 
    cout << "Array doubled: " << doubleCount << endl; 
    cout <<"#" << endl; 
    cout << "Unique non-common words: "<< (aSize-100+counter)<<endl; 
    cout << "#"<<endl; 
    cout <<"Total non-common words: "<< getTotalNumberNonCommonWords(theStructArray, aSize, counter)<<endl; 

    return 0; 
} 

void getStopWords(char *ignoreWordFileName, vector<string>& _vecIgnoreWords){ 

    ifstream inFile(ignoreWordFileName); 

    if(inFile.is_open()){ 
     int a = 0; 
     string line; 

     while(getline(inFile, line)){ 
      _vecIgnoreWords.insert(_vecIgnoreWords.begin() + a, line); 
     } 
     inFile.close(); 
    } 
    return; 
} 

bool isCommonWord(string word, vector<string>& _vecIgnoreWords){ 

    for(int i=0; i<STOPWORD_LIST_SIZE; i++){ 
     if(word == _vecIgnoreWords.at(i)){ 
      return true; 
     } 
    } 
    return false; 
} 

void printTopN(wordItem wordItemList[], int topN){ 

    cout << endl; 

    for(int i=0; i<topN; i++){ 
     cout<< wordItemList[i].count << '-' << wordItemList[i].word << endl; 
    } 
    return; 
} 

void doubleArray(wordItem wordItemList[], int size){ 

    wordItem *tempArray = new wordItem[size+100]; 

    for(int i=0; i<size; i++){ 
     tempArray[i] = wordItemList[i]; 
    } 

    delete [] wordItemList; 
    wordItemList = tempArray; 

} 

int getTotalNumberNonCommonWords(wordItem wordItemList[], int size, int wordCount){ 

    int total = 0; 
    for(int i=0; i<(size-100+wordCount); i++){ 
     total+=wordItemList[i].count; 
    } 
    return total; 
} 
+1

例外の原因となったプログラムの行を知っていますか? – NathanOliver

+0

"私のプログラム/ラップトップは十分に強くないかもしれませんか?"それはどういう意味ですか?どのくらいのメモリを割り当てようとしたのか試してみましたか?そして、些細な 'void main(...){malloc(...); } '?あなたはvalgrindでチェックしましたか?また、[*最小、完全、および検証可能な例を作成する方法](http://stackoverflow.com/help/mcve)を読んで従ってください。 –

+0

また、 'doubleArray'は動作しません。それはポインタのコピーを作成し、参照渡しする必要があります。 – NathanOliver

答えて

0

あなたは配列を渡す場合は、アレイ上delete []を呼び出すことができますが、その値を変更することはできませんので、doubleArray(theStructArray, aSize);はへtheStructArrayの原因となりますvoid doubleArray(wordItem wordItemList[], int size)

に非常に悪いことをやっています削除されますが、割り当てたメモリには割り当てられません。あなただけの機能でdoubleArray

をローカル変数に代入されていることは次のようになります。ここx

void doubleit(int x) 
{ 
    x *= 2; 
} 

int y=3; 
doubleit(y); 

一瞬6に倍増、しかしyは変更されませんでした。

参考資料を使用するか、theStructArraystd::vectorに設定してください。

関連する問題