Heapbeschädigung auf Mitglied Zuordnung Überlastung?

stimmen
-1

(Clarity Update)

Haben mit diesem Problem für eine Weile zu kämpfen und würde einen Einblick mögen. Ich habe die überlastet additionund assignmentBetreiber für eine erstellte Klasse. Der assignmentBetreiber scheint in Ordnung zurückzukehren, aber dann die nächste Zeile beendet mit diesem Fehler:

Heapbeschädigung Detected: nach dem normalen Block (# 160), bei 0x012CA7D0. CRT festgestellt, dass die Anwendung in dem Speicher nach dem Ende des Stapelpuffers geschrieben.

Mein Code für beide Operatoren sind unten:

HSString& HSString::operator =(const HSString& argStr) {

    if (this != &argStr) {
        delete[] str;
        end = argStr.end;
        cap = argStr.cap;

        if (end > 0) {
            str = new char[end];
            for (int i = 0; i <= end; i++) {
                str[i] = argStr.str[i];
            }
       }
    }
    return *this;
}

// Standard-Konstruktor

HSString::HSString() {

    cap = 20;

    end = 0;

    str = '\0';

    createdCount++;

    currentCount++;
}

// Destructor

HSString::~HSString() {

    delete[] str;

    currentCount--;
}

// Copy Constructor

HSString::HSString(const HSString& argStr) {

    cap = argStr.cap;

    end = argStr.end;

    if (end > 0) {
        str = new char[end];

        for (int i = 0; i <= end; i++) {
            str[i] = argStr.str[i];
        }

    } else {
        str = nullptr;
    }

    createdCount++;

    currentCount++;
}


const HSString HSString::operator +(const HSString& strOne)const {

    HSString temp;

    temp.end = end + strOne.end;
    temp.cap = cap + strOne.cap;

    temp.str = new char[cap];

    for (int i = 0; i < end; i++) {
        temp.str[i] = str[i];
    }

    for (int i = 0; i <= strOne.end; i++) {
        temp.str[i + end] = strOne.str[i];
    }

    return temp;
}

Nach Mitglied Zuweisungsoperator mit einer tiefen Kopie wird der Fehler dann ausgeführt zurückgegeben wird.

Ich gehe man vorbei am Ende einer Zeichenkette, die den Nullabschluss enthalten in dynamisch erzeugten Speichern zusätzlichen Müll Werte zu bereinigen.

Mit Rule of Three Konzepte.

//Probe:

int main() {

HSString greeting(Hello);
HSString name(Hayden);
HSString result;

vvvvvv // Heap Corruption geschieht direkt nach dieser Anweisung vvvvvvv ausgeführt wird

result = greeting + name;


cout << result;





system(pause);
return 0;
}
Veröffentlicht am 07/11/2018 um 23:34
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
1

for (int i = 0; i <= end; i++)

Dies erzeugt einen Überlauf. Da in C ++ Arrays beginnen bei Index 0 , wenn Ihr declare ein Array mit 5 Elementen der Indexbereich von 0 bis 4 ist also , wenn Sie eine Reihe von Größe erstellen endIhre Indizes von 0 bis Ende reichen - 1. Das bedeutet , müssen Sie prüfen , füri < end

EDIT: Dies gilt propably zu for (int i = 0; i <= strOne.end; i++)auch trotz ich weiß nicht , die Umsetzung derHSString

Beantwortet am 07/11/2018 um 23:40
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more