Haldy na člena přiřazení přetížení?

hlasů
-1

(Clarity Update)

Byly zápasí s tímto problémem na chvíli a chtěl bych určitou představu. Jsem přetížen additiona assignmentoperátory pro vytvořené třídy. assignmentOperátor Zdá se vrátí v pořádku, ale pak další řádek ukončí s touto chybou:

Haldy zjištěno: po normálním bloku (# 160) při 0x012CA7D0. CRT zjištěno, že aplikace napsal paměti po skončení haldy pufru.

Můj kód pro oba operátory jsou níže:

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;
}

// výchozí konstruktor

HSString::HSString() {

    cap = 20;

    end = 0;

    str = '\0';

    createdCount++;

    currentCount++;
}

// Destructor

HSString::~HSString() {

    delete[] str;

    currentCount--;
}

// Konstruktor Copy

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;
}

Poté, co operátor přiřazení člen vrátil s hlubokou kopii chyba je pak vykonán.

Jdu jeden za koncem řetězce zahrnout null zakončení vyčistit další hodnoty odpadky v dynamicky vytvořené paměti.

Používání Pravidlo tří konceptů.

//Vzorek:

int main() {

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

Vvvvvv // haldy se stane hned po tomto prohlášení je vykonán vvvvvvv

result = greeting + name;


cout << result;





system(pause);
return 0;
}
Položena 07/11/2018 v 23:34
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

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

To vytváří přetečení. Vzhledem k tomu, v C ++ pole začínají na indexu 0, pokud váš deklarovat pole s 5 prvky rozsah index je 0 až 4. Takže pokud si vytvořit pole o velikosti endindexy v rozmezí od 0 až do konce - 1. To znamená, že je třeba zkontrolovati < end

EDIT: to platí pravděpodobně v na for (int i = 0; i <= strOne.end; i++)příliš navzdory nevím prováděníHSString

Odpovězeno 07/11/2018 v 23:40
zdroj uživatelem

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