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;
}
Verwenden Sie Std :: Vector! –
_ "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. –
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