Вызвано исключение: нарушение доступа для чтения. this было 0x1EA5EC35E20
Всем доброго времени суток, у меня проблема с пониманием удаления объекта класса из динамической памяти. У меня есть простой класс Student:
class Student {
private:
string lessons[2] = {string("lesson1"), string("lesson2")};
public:
Student() {
}
~Student() {
delete lessons;
}
void showInfo() {
cout << "Элективы: ";
int size = sizeof(lessons) / sizeof(string);
for (int i = 0; i < size; i++)
{
cout << lessons[i] << "\t";
}
}
};
Код в main():
int main()
{
setlocale(LC_ALL, "Rus");
Student *student = new Student("Salavat", "МГУ ВМК", 22, 1);
student->showInfo();
delete student; // после этой строчки выводится исключение
return 0;
}
Текст исключения: Вызвано исключение: нарушение доступа для чтения. this было 0x1EA5EC35E20.
Текст из отладчика :
"cpp_tutorial.exe" (Win32). Загружено "C:\Windows\System32\vcruntime140d.dll".
"cpp_tutorial.exe" (Win32). Загружено "C:\Windows\System32\vcruntime140_1d.dll".
"cpp_tutorial.exe" (Win32). Загружено "C:\Windows\System32\ucrtbased.dll".
Поток 0x4868 завершился с кодом 0 (0x0).
Вызвано исключение: нарушение доступа для чтения.
**this** было 0x1EA5EC35E20.
Значения переменных при дебаггинге:
Буду благодарен, если объясните, почему выходит ошибка при попытке напрямую удалить объект student.
(delete student;)
Ответы (1 шт):
Не уничтожайте с помощью delete то, что не было выделено с помощью new.
Для string lessons[2] память не выделялась с помощью new, а удалять в деструкторе вы ее пытаетесь — вот и получаете неприятности. Вот если бы она была выделена как
string * lessons;
...
Student():lessons(new string[2]) {}
то дело другое... Кстати, тогда ее надо было бы и освобождать не delete lessons;,
а delete[] lessons;.