Почему C++ программа может работать с некорректно выделенной памятью? Добрый день. Возникла ситуация, в причинах появления которой хочется разобраться.
Есть программа на C++, в ней есть классы A и Bclass A {
public:
A() {}
B* getB() {return b;}
private:
B* b;
};
class B {
public:
B() {};
bool getFlag() {return flag;}
void setFlag (bool f) {flag = f;}
void serialize() {...}//запись в файл
private:
bool flag;
};
Как можно увидеть, в конструкторе класса A отсутствует вызов b = new B(); то есть память не выделяется.
Однако в программе удаётся по полученному от класса A указателю на b (т.к. он не инициализировался даже 0 понятно, что он куда-то ведёт) вызывать getFlag() и setFlag() и получать от них значения. Более того, при вызове b->serialize() выдайтся отладочная печать находящаяся в этой функции до момента обращения к flag, на котором программа наконец падает с segfault'ом. Причём это не единичный случай, объектов класса A создаётся несколько десятков и только изредка, не в каждом запуске при обращении к A::b какого-нибудь из них программа падает.
При этом если программу отлаживать в gdb, то всё как и положено падает с segfault'ом при первой же попытке что-то сделать с A::b.
Подскажите, чем может быть вызвано такое странное поведение программы? (Выделение памяти я естественно уже добавил, но теоретический интерес остался)

21 Авг 2019 в 07:09
174 +1
0
Ответы
1

Такое поведение программы вызвано тем, что указатель b в классе A не инициализирован, и поэтому он может содержать мусорное значение, которое может вести на какую-то область памяти. Использование такого указателя может привести к неопределенному поведению программы, включая сегментационную ошибку (segfault), как в вашем случае.

В C++ нет автоматической инициализации указателей на NULL или нулевое значение, поэтому без явного присвоения указателю корректного значения он будет содержать мусор. Рекомендуется всегда инициализировать указатели на NULL или nullptr (с C++11) при их объявлении, чтобы избежать подобных проблем.

20 Апр в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 588 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир