Кто-нибудь знает, почему этот код сработает?Странный сбой Qt 4.8.4 QList под Apple LLVM
Код, который выходит из строя:
QList<int> lst;
const auto& tmp = QList<int>() << 1;
lst = tmp;
код, который работает (TMP не является ссылкой):
QList<int> lst;
const auto tmp = QList<int>() << 1;
lst = tmp;
Компилятор:
Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin12.5.0
Thread model: posix
Краш сообщение:
qt_test(76726,0x7fff76257180) malloc: *** error for object 0x101208b60: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
qt_test: line 43: 76726 Abort trap: 6 $DBG_TEST "[email protected]"
Это сообщение появляется при вызове 'lst' деструктора.
В VisualStudio 2012 этот код работает хорошо.
Да, я так и думал. Я попытался воспроизвести проблему, используя MyClass вместо QList <>. Я заметил, что компилятор делает копию MyClass перед назначением 'tmp'. Поскольку tmp является ссылкой на константу, она должна сохранять эту копию в живых. В настоящее время я предполагаю, что проблема заключается в QList <> и неявном совместном использовании Qt. Если вы уверены, что в моем коде есть неопределенное поведение, укажите мне описание в стандарте C++. – esmirnov
На самом деле, я забыл об этой функции C++.Но моя точка зрения заключается в том, что вы сохраняете значение, возвращаемое 'QList :: operator << (...)', а не временное - независимо от того, являются ли они одинаковыми или нет. Невозможно, чтобы компилятор мог знать, что 'operator << (...)' возвращает временный, который вы передали. –
Обновлен мой ответ, с тем, что я надеюсь дать более полную картину проблемы. Гораздо более интересный краевой случай, чем я изначально изобразил. –