Привет, ЛОР. Попался мне такой извращённый код:
В объявлении класса:
QSettings* realSettings;
QSettings& userSettings;
В заголовке конструктора:
realSettings(new QSettings()), userSettings(*realSettings),
И в одном из методов:
delete realSettings;
realSettings = new QSettings(...);
Как я понял, сие извращение появилось, поскольку программе понадобилось по ходу действия писать и читать конфиги разного типа, но с одинаковым содержимым. Другими словами — вначале создаётся объект, потом по указателю на этот объект создаётся ссылка, потом объект удаётся и создаётся заново.
ВНИМАНИЕ, ВОПРОС: что вообще при этом должно произойти со ссылкой? Она должна сохранять валидность? Или это вообще UB? Как это ни смешно, в тестах оно работает и не падает.
Пока очень хочется завернуть код, чтобы всё это извращение переписали на работу с указателями, но код будет более многословный, да. Автор горячится и доказывает, что ссылки придумали специально для того, чтобы они никогда не были невалидными. Я же как-то привык, что ссылка — это «относительно безопасный указатель», и здесь вот эта относительность проявляется. (Что нам вообще мешало вызвать delete, но не вызывать new?)
Если UB — то лучше переписать, конечно.