To nie jest pytanie o to, dlaczego napisałbyś taki kod, ale bardziej jako pytanie o to, jak metoda jest wykonywana względem obiektu, z którym jest powiązana.Co się stanie, jeśli obiekt zmieni rozmiar własnego kontenera?
Jeśli mam struct takich jak:
struct F
{
// some member variables
void doSomething(std::vector<F>& vec)
{
// do some stuff
vec.push_back(F());
// do some more stuff
}
}
i używam go tak:
std::vector<F>(10) vec;
vec[0].doSomething(vec);
Co się stanie jeśli push_back(...)
w doSomething(...)
powoduje, że wektor rozwinąć? Oznacza to, że vec[0]
zostanie skopiowany, a następnie usunięty w trakcie wykonywania swojej metody. To nie byłoby dobre.
Czy ktoś mógłby wyjaśnić, co dokładnie tutaj się dzieje?
- Czy program natychmiast się zawiesił? Czy metoda po prostu próbuje działać na danych, które nie istnieją?
- Czy metoda działa "osierocona" obiektu, dopóki nie pojawi się problem, jak zmiana stanu obiektu?
Jestem zainteresowany tym, jak wywołanie metody jest powiązane z powiązanym obiektem.
Dzięki za odpowiedź. Czy mówisz, że program prawdopodobnie będzie kontynuowany bez awarii? Jeśli napiszę poza granicami tablicy do wolnej pamięci, zostanie to wykryte. Co pozwoliłoby na to, aby metoda mogła bez problemu zapisywać się w wolnej pamięci? – user487100
Możesz praktycznie zawsze pisać do pamięci "uwolnionej" bez awarii. W ten sposób działa mapowanie pamięci. Mapa pozostaje w miejscu do wykorzystania przez przyszłe obiekty. Możesz ** nigdy ** pisać do wolnej pamięci "bez problemu". Tyle tylko, że "problemy" to coś innego niż upaść. –
@ user487100: Jeśli napiszesz poza granicami tablicy do wolnej pamięci, to jest _sometimes_ detected. Łatwo jest stworzyć przypadek, w którym będę mógł napisać koniec i nie wykryć go przez jakiś czas. Przydzielenie 'char * a = new char [1]', a następnie odczyt i zapis do 'a [1]', prawdopodobnie nie spowoduje żadnych błędów na większości systemów. –