2017-11-02 7 views
2

Also habe ich eine Klasse namens WordFrequency erstellt, die ein String-Wort und eine Int-Häufigkeit als private Member-Variablen speichert. Eine HashTable-Funktion, die eine WordFrequency **, hashsize, currentitems in der Hashtabelle enthält.Fehler mit Kopie Konstruktor und Getter (Mutator-Funktion)

während die Kopie Konstruktor ich bin immer einen Fehler bekommen - Thread 1: EXC_BAD_ACCESS (code = 1, Adresse = 0x0) , die mich an die Getter Funktion der WordFrequency Klasse umleitet, wenn in der Copy-Konstruktor aufgerufen. Ich bin nicht in der Lage herauszufinden, warum es passiert.

der Kopierkonstruktor.

Hashtable:: Hashtable(const Hashtable &hash){ 

    WordFrequency** temp = new WordFrequency* [hash.hashSize]; 
    this->arr = temp; 
    for (int i = 0 ; i < hash.hashSize ; i++) { 
     if (hash.arr[i] == NULL){ //pointer in hashstable is null 
      continue; 
     } 
     //bucket is not empty 
     if(this->search(this->arr[i]->getWord()) != 0 ){ //if same string already found in this hashtable 
      this->arr[i]->increment(); // incrtement the frequency 
      continue; 
     } 

     //else the string doest even exist in the hashtable. 

     WordFrequency x ((hash.arr[i])->getWord()); //deep copying the word from the parameter hash 
     temp[i] = &x;        //pointing the hash table to the new the object 

    } 
    this->hashSize = hash.hashSize; 
    this->currentItems = hash.currentItems; 
} 

die Getterfunktion in der Wortfrequenzklasse.

string WordFrequency:: getWord() const { 
    return this->word; 
} 

obwohl die Getter-Funktion sehr einfach scheint, weiß ich nicht, warum ich diesen Fehler bekomme.

ich bin auch meine Destructor Ursache, die das Problem sein kann.

Hashtable:: ~Hashtable() { 
    for (int i = 0 ; i < this->hashSize ; i++){ 
     delete this->arr[i]; 
    } 
    delete [] this->arr; 
    this->hashSize = 0; 
    this->currentItems = 0; 

} 

Ausgangs Operator -

ostream& operator<< (ostream &out, const Hashtable &h){ 
    out << "Hashtable with size - " << h.hashSize << "and no of elements - " << h.currentItems << endl; 

    for (int i = 0 ; i < h.hashSize ; i++){ 
     if (h.arr[i] == NULL){ 
      out << "0"; 
      continue; 
     } 
     else { 
      out << ((h.arr[i])->getWord()); //bad access 
     } 
    } 


    out << endl; 
    return out; 

} 
+0

Verwenden Sie Std :: Vector ! –

+1

_ "Ich erhalte immer einen Fehler - Thread 1: EXC_BAD_ACCESS" _ OK, und ich bin sicher, dass Sie in Ihrer Umgebung einen Debugger ausführen können und den genauen Stack-Trace, der zu diesem Fehler führt, mit Funktionsargumentwerten anzeigen können Sie können erkennen, warum Ihr Zugang schlecht ist. –

+0

Ich nehme an, dass die Verwendung einer benutzerdefinierten Hash-Tabelle für die Zuordnung erforderlich ist? Wenn nicht, können Sie sich mit 'std :: map' oder' std :: unordered_map' eine Menge Ärger ersparen. – user4581301

Antwort

1

in der for-Schleife der HashTable Konstruktor Sie speichert den Zeiger eines Stapels zugewiesene Objekt:

WordFrequency x ((hash.arr[i])->getWord()); 
temp[i] = &x; 

Das Speicher außerhalb aufgearbeiteten wird des Bereichs der for-Schleife, der den "schlechten Zugriff" verursacht, wenn Sie versuchen, später auf das Objekt zuzugreifen. Sie sollten stattdessen das Objekt neu erstellen:

temp[i] = new WordFrequency((hash.arr[i])->getWord()); 
+0

jetzt gibt mir mein Ausgabeoperator einen schlechten Zugriff. Kannst du einen Blick darauf werfen? –

+0

Und auf welcher Codezeile sagt Ihnen Ihr Debugger, dass der Fehler auftritt? –

+0

@AryanArora Nun, eine Sache, die ich bemerke, ist, dass Sie nicht Ihre Zeiger auf NULL initialisieren, wenn Sie 'WordFrequency ** temp = new WordFrequency * [hash.hashSize];'. Wenn Sie also das 'if (hash.arr [i] == NULL) {// pointer in hashstable ist null ') ausführen, wird dieser Zeiger im neu zugewiesenen Array nicht initialisiert. – mnistic

Verwandte Themen