Почему 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. Подскажите, чем может быть вызвано такое странное поведение программы? (Выделение памяти я естественно уже добавил, но теоретический интерес остался)
Такое поведение программы вызвано тем, что указатель b в классе A не инициализирован, и поэтому он может содержать мусорное значение, которое может вести на какую-то область памяти. Использование такого указателя может привести к неопределенному поведению программы, включая сегментационную ошибку (segfault), как в вашем случае.
В C++ нет автоматической инициализации указателей на NULL или нулевое значение, поэтому без явного присвоения указателю корректного значения он будет содержать мусор. Рекомендуется всегда инициализировать указатели на NULL или nullptr (с C++11) при их объявлении, чтобы избежать подобных проблем.
Такое поведение программы вызвано тем, что указатель b в классе A не инициализирован, и поэтому он может содержать мусорное значение, которое может вести на какую-то область памяти. Использование такого указателя может привести к неопределенному поведению программы, включая сегментационную ошибку (segfault), как в вашем случае.
В C++ нет автоматической инициализации указателей на NULL или нулевое значение, поэтому без явного присвоения указателю корректного значения он будет содержать мусор. Рекомендуется всегда инициализировать указатели на NULL или nullptr (с C++11) при их объявлении, чтобы избежать подобных проблем.