Обнаружено повреждение кучи после нормального блока (#174)
Я знаю, что этот вопрос был задан, но я не смог исправить программу
void swap1(char*str1,char*str2)
{
char *ezer =new char[strlen(str1)];
for (int i = 0 ; i <= strlen(str1);i++)
ezer[i]=str1[i];
delete [] str1;
str1= new char[strlen(str2)];
for (int i = 0 ; i <= strlen(str2);i++)
str1[i]=str2[i];
delete [] str2;
str2= new char[strlen(ezer)];
for (int i = 0 ; i <= strlen(ezer);i++)
str2[i]=ezer[i];
delete[] ezer;
}
один раз в первый раз, когда он работает во 2-й (с другим значением) времени, я получаю ошибку, ошибка пришла в последней строке delete[] ezer;
почему я не могу удалить ezer
?
Ошибка:
heap corruption detected after normal block (#174) at 0x007D7A48
CRT detected that the application wrote to memory end of heap buffer
2 ответа
strlen не считает нулевой терминатор в конце ваших строк. Это означает, что после одного применения вашей функции подкачки две строки будут поменяны местами, но больше не будут обнуляться. Поведение strlen для строки без нулевого терминатора не определено, что означает, что вы пересекаете границы выделенной кучи при прохождении одной из них.
Вам не хватает места для 0-терминатора здесь:
char *ezer = new char[strlen(str1)];
Измените это на:
char *ezer = new char[strlen(str1) + 1];
Фактическое (первое) повреждение памяти происходит здесь:
for (int i = 0 ; i <= strlen(str1);i++)
ezer[i]=str1[i];
Как и в последней итерации (той, которая копирует 0-терминатор) ezer[i]
ссылается на память "только позади", что было выделено для ezer
,
Повторите то же самое для двух других распределений символов arrayc.
В любом случае, поскольку это исправит повреждение кучи, функция будет работать не так, как ожидалось. Но это другая история... не так ли?;-)