(Обновление ясности)
Некоторое время боролся с этой проблемой и хотел бы получить некоторое представление. Я перегрузил операторы 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;
}