Wiem, że ogólnie czas życia tymczasowej pętli for
z zakresu jest rozszerzony na całą pętlę (czytałem C++11: The range-based for statement: "range-init" lifetime?). Dlatego robią rzeczy, jak to jest ogólnie OK:obiekt tymczasowy w zakresie dla
for (auto &thingy : func_that_returns_eg_a_vector())
std::cout << thingy;
Teraz jestem potykając o problemach z pamięcią, gdy próbuję coś zrobić, pomyślałem być podobny z Qt QList
pojemniku:
#include <iostream>
#include <QList>
int main() {
for (auto i : QList<int>{} << 1 << 2 << 3)
std::cout << i << std::endl;
return 0;
}
tu problem jest to, że valgrind pokazuje nieprawidłowy dostęp do pamięci gdzieś wewnątrz klasy QList
. Jednak modyfikując przykład tak, że lista jest przechowywana w zmiennej zapewnia prawidłowy wynik:
#include <iostream>
#include <QList>
int main() {
auto things = QList<int>{} << 1 << 2 << 3;
for (auto i : things)
std::cout << i << std::endl;
return 0;
}
Teraz moje pytanie: robię coś głupiego w pierwszym przypadku, w wyniku np niezdefiniowane zachowanie (nie mam wystarczającego doświadczenia w czytaniu standardu C++, aby odpowiedzieć na to pytanie)? A może to jest problem z korzystaniem z QList
lub z implementacji QList
?
Dzięki za wyjaśnienie. I głupie, oczywiście, że powinienem był najpierw użyć listy inicjalizacyjnej - jakoś po prostu o tym nie myślałem. Prawdopodobnie dzięki przykładom Qt zawsze używałem '<<' w podobnych przypadkach. –
No cóż, wygląda na to, że obsługa C++ 11 jest dostępna tylko w Qt 4.8 i późniejszych. Ale w takich przypadkach mogę z łatwością użyć kontenerów ze standardowej biblioteki. –
Czy ten problem można obejść przez rzutowanie na 'QList const &' (tj.pisanie 'dla (auto i: static_cast const &> (QList {} << 1 << 2 << 3))')? W ten sposób byłby on powiązany z odwołaniem do stałej w inicjalizacji pętli for, jeśli dobrze przeczytałem § 6.5.4, a to z kolei wydłużałoby czas życia tymczasowego do zakresu pętli. –