To nie nazywa kiedy push_back
, nazywa gdy tymczasowy jest niszczony.
Aby rozwiązać go w przykładzie:
TEST test;
for (int i = 0; i < 5; ++i)
{
m_test.push_back(test);
}
powinien wywołać tylko raz.
Twój kod tworzy tymczasowe TEST
w pętli, używając go w push_back
, to tymczasowe wyjście wykracza poza zakres, kiedy pętla się kończy/powtarza i zostaje zniszczona. To się dzieje dokładnie tak, jak powinno, ponieważ tymczasowe potrzeby muszą zostać oczyszczone.
Jeśli chcesz tego uniknąć, musisz zrobić cokolwiek innego, ale zrobić tymczasowy obiekt dla każdego naciśnięcia. Jednym z potencjalnych rozwiązań jest:
vector<TEST> m_test(5); // Note reserving space in the vector for 5 objects
std::fill(m_test.begin(), m_test.end(), TEST()); // Fill the vector with the default ctor
W zależności od tego, jak optymalizuje się STL, może nie być konieczne wykonanie wielu kopii.
może także być w stanie uzyskać lepsze prowadzenie jeśli wdrożenie konstruktor kopiujący w swojej klasie TEST
, jak:
TEST::TEST(const TEST & other)
{
x = new int(*other.x); // Not entirely safe, but the simplest copy ctor for this example.
}
Czy jest to właściwe, lub jak go obsługiwać, zależy od klasy i jej potrzeb, ale zazwyczaj powinieneś mieć konstruktora kopiowania, gdy zdefiniujesz swój własny zwykły konstruktor i destruktor (w przeciwnym wypadku kompilator wygeneruje jeden, iw tym przypadku spowoduje to skopiowanie i zwinięcie wskaźników do x
).
W C++ 11 można użyć 'm_test.emplace_back()', aby uniknąć tworzenia tymczasowego. W każdym razie zawsze pamiętaj o [Regule Trzech] (http://stackoverflow.com/questions/4172722). –