Zakresowe for

0
    vector<MyStruct*> vec(10);
    for (int i = 0; i < 10; i++) vec[i] = new MyStruct();
    for (auto x : vec)
    {
    delete x;
    vec.pop_back();
    }

Czyżby zakresowe "for" było tak sprytne, że wywołuje delete od końca wektora? Bo wszystkie dziesięć obiektów jest usuwanych, sprawdziłem, a przecież za każdym obrotem pętli długość wektora zmniejsza się o jeden.

4

Nie!
Po prostu twój kod to "Undefined behavior", bo modyfikujesz vector w trakcie range base for.
Efekt jest taki, że ostatni for iteruje również poza zakres wektora, który został przycięty.

Na dodatek we współczesnym C++ nie używa się jawnie new i delete! Używaj RAII patern!
https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

std::vector<std::unique_ptr<MyStruct>> vec;
vec.reserve(10);
for (int i = 0; i < 10; i++) {
    vec.push_back(std::make_unique<MyStruct>());
}

vec.clear();
2

Rozwijając wypowiedź Marka, ranged for jest zdefiniowany jako http://eel.is/c++draft/stmt.ranged#1

{
	init-statementopt
	auto &&range = for-range-initializer ;
	auto begin = begin-expr ;
	auto end = end-expr ;
	for ( ; begin != end; ++begin ) {
		for-range-declaration = * begin ;
		statement
	}
}

Inaczej mówiąc, zapamiętujesz end-expr (tutaj vec.end()), który dla vectora jest albo wskaźnikiem za ostatni element, albo równoważnym iteratorem i aż do niego iterujesz. Zmiana wielkości wektora nie wpływa na zakres, po którym iterujesz, więc tutaj masz UB.

1 użytkowników online, w tym zalogowanych: 0, gości: 1