Повреждение кучи при перегрузке назначения элемента? - PullRequest
0 голосов
/ 08 ноября 2018

(Обновление ясности)

Некоторое время боролся с этой проблемой и хотел бы получить некоторое представление. Я перегрузил операторы addition и assignment для созданного класса. Оператор assignment, кажется, возвращается нормально, но затем следующая строка завершается с этой ошибкой:

ОБНАРУЖЕНА КОРРУПЦИЯ КАРТЫ: после блока Normal (# 160) в 0x012CA7D0. ЭЛТ обнаружил, что приложение записало в память после завершения кучи буфер.

Мой код для обоих операторов ниже:

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

// Конструктор по умолчанию

HSString::HSString() {

    cap = 20;

    end = 0;

    str = '\0';

    createdCount++;

    currentCount++;
}

// Деструктор

HSString::~HSString() {

    delete[] str;

    currentCount--;
}

// Конструктор копирования

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

После того, как оператор назначения члена возвращается с глубокой копией, выполняется ошибка

Я прошёл один конец строки, чтобы включить нулевой терминатор для очистки дополнительных значений мусора в динамически создаваемой памяти.

Использование концепций правила трех.

// Образец:

int main() {

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

vvvvvv // Повреждение кучи происходит сразу после выполнения этого оператора vvvvvvv

result = greeting + name;


cout << result;





system("pause");
return 0;
}

1 Ответ

0 голосов
/ 08 ноября 2018

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

Это создает переполнение. Потому что в C ++ массивы начинаются с индекса 0, если вы объявляете массив из 5 элементов, диапазон индекса составляет от 0 до 4. Так что, если вы создаете массив размером end, ваши индексы варьируются от 0 до конца - 1. Это означает, что вам нужно проверить на i < end

EDIT: это, вероятно, относится и к for (int i = 0; i <= strOne.end; i++), несмотря на то, что я не знаю реализацию HSString

...