uz si potencialne zadelavas na segmentation fault, kdyz se treba budes pokouset pristupovat k polozkam toho vektoru mimo kontext kde vznikly. Techto oseru je C++ plne. Jestli potrebujes neco podobneho C++, ale done right, zkus radsi Rust, obzvlast kdyz mas svobodu teprve si vybirat.
Kecy, v tomto případě si kolekce dělá kopii nebo move (podle verze/třídy), ale chovat se to bude korektně. Akorát lepší než push je emplace.
A kdyby si neco kopii neudelalo, napr. nejaka custom kolekce, tak by k segfault skutecne doslo v pripade pristupovani k tem objektum z jinaciho scopu? (predpokladam ze scope je myslena hierarchie slozenych zavorech {} )
Ne, kopii dělá překladač. Pokud se předává hodnotou, překladač se o to postará.
Jasně, chápu že když předáváš hodnou, dělá se kopie. Jenže vector je definován takto:
void push_back (const value_type& val);
Tzn. nepředává se hodnotou, ale odkazem. Nicméně v dokumentaci je uvedeno, ze se bude provadet move nebo copy, takze to nebudu dál rozebírat.
Takže segfaul by mohl vzniknout takhle?
int someGlobal;
void someFunction() {
int someLocal = 10;
&someGlobal = &someLocal;
}
void segmentantion_fault() {
someGlobal = 123;
}
void main() {
someFunction();
segmentation_fault();
}
[/quote] Přiřazením ne, spíš při čtení pointru na něco, co už neexistuje. V C++ obecně platí: nepoužívat pointry. Pak se nemůže nic zlého stát. Překladač je dostatečně inteligentní na to, aby se postaral o veškeré kopie a přesuny (move) a když se dodrží pár víceméně univerzálně platných principů, it just works. Princip práce C++ je jednoduchý a STL je dostatečně robustní na to, aby se člověk nestřelil do nohy, když nedělá kraviny (jako třeba použití new).