строка — Valgrind: Неверная запись размера 1

У меня есть дерево AVL со строковыми ключами и мой собственный класс String. Чтобы исправить другую проблему, мне пришлось добавить конструктор копирования в String. Однако valgrind сообщает об ошибке с ним. Вот конструктор:

String::String(const String& s){
try {
mStr = new char[1];
}
catch (const bad_alloc& e){
printf("ERROR: No memory\n");
exit(0);
}
mStr[0]='\0';
mCopy(s);
}

void String::mCopy(const String& s){
//  delete[] mStr;
size_t n = s.Length();
try{
mStr = new char[n + 1];
}
catch (const bad_alloc& e){
printf("ERROR: No memory\n");
exit(0);
}
strcpy(mStr, s.mStr);
mStr[n + 1] = '\0';
}

А вот часть вывода Valgrind после добавления строкового ключа в мое дерево AVL:

==7005== Invalid write of size 1
==7005==    at 0x4013A1: String::mCopy(String const&) (in /home/ezrafell/Desktop/DA2final/DA3.o)
==7005==    by 0x401213: String::String(String const&) (in /home/ezrafell/Desktop/DA2final/DA3.o)
==7005==    by 0x40182D: main (in /home/ezrafell/Desktop/DA2final/DA3.o)
==7005==  Address 0x5ad450d is 0 bytes after a block of size 61 alloc'd
==7005==    at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7005==    by 0x40136B: String::mCopy(String const&) (in /home/ezrafell/Desktop/DA2final/DA3.o)
==7005==    by 0x401213: String::String(String const&) (in /home/ezrafell/Desktop/DA2final/DA3.o)
==7005==    by 0x40182D: main (in /home/ezrafell/Desktop/DA2final/DA3.o)

Другие ошибки, о которых сообщает Valgrind, также относятся к operator new[] в String::String(String const&), Но что с этим не так? И как мне переписать конструктор, чтобы избежать этой ошибки?

-1

Решение

Ошибка выдается этой строкой:

mStr[n + 1] = '\0';

n+1 это один после выделенного размера. Вам нужно использовать n вместо этого, потому что тело строки находится в индексах 0 через n-1включительно, поэтому индекс n куда идет нулевой терминатор:

mStr[n] = '\0';

Заметка Удаление этой строки тоже будет правильным, потому что strcpy завершается нулевым результатом. Размещение нулевого терминатора вручную требуется, когда вы используете функции, которые не делают этого за вас, такие как memcpy,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]