CrazySage
@CrazySage
C++ developer

Почему C++ программа может работать с некорректно выделенной памятью?

Добрый день. Возникла ситуация, в причинах появления которой хочется разобраться.
Есть программа на C++, в ней есть классы A и B

class 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.
Подскажите, чем может быть вызвано такое странное поведение программы? (Выделение памяти я естественно уже добавил, но теоретический интерес остался)
  • Вопрос задан
  • 2511 просмотров
Решения вопроса 1
Nirail
@Nirail
Дайте мне повод и я во все решу
Такое вполне возможно:
Компилятор создал объект A а в B* b записал "мусор".
"Думая" что по адресу *b находится объект класса B он читает и записывает логическое значение куда-то в памяти (так как простые методы getFlag и setFlag скорее всего оптимизируются на простое обращение к атрибуту flag и это объясняет падение при отладке). При вызове сложной функции, собственно, и возникает SegFault.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы