#include <vector> #include <iostream> int g_serial = 0; struct Rock { Rock( char id ) : id( id ), serial( g_serial++ ) { std::cout << __PRETTY_FUNCTION__; whoami(); } Rock( const Rock& copy ) : id( copy.id ), serial( g_serial++ ) { std::cout << __PRETTY_FUNCTION__; whoami(); } ~Rock( void ) { std::cout << __PRETTY_FUNCTION__; whoami(); } void whoami( void ) const { std::cout << " id: " << id << ", serial: " << serial << '\n'; } char id; int serial; }; int main() { std::cout << "constructing vector\n"; std::vector<Rock> vr; std::cout << "constructing rocks\n"; Rock ra('a'), rb('b'), rc('c'); std::cout << "reserving vector\n"; vr.reserve(2); std::cout << "pushing ra and rb\n"; vr.push_back(ra); vr.push_back(rb); std::cout << "vector is now full, next push will reallocate.\n"; std::cout << "pushing rc\n"; vr.push_back(rc); std::cout << "start destruction\n"; }
Standard input is empty
constructing vector constructing rocks Rock::Rock(char) id: a, serial: 0 Rock::Rock(char) id: b, serial: 1 Rock::Rock(char) id: c, serial: 2 reserving vector pushing ra and rb Rock::Rock(const Rock&) id: a, serial: 3 Rock::Rock(const Rock&) id: b, serial: 4 vector is now full, next push will reallocate. pushing rc Rock::Rock(const Rock&) id: a, serial: 5 Rock::Rock(const Rock&) id: b, serial: 6 Rock::Rock(const Rock&) id: c, serial: 7 Rock::~Rock() id: a, serial: 3 Rock::~Rock() id: b, serial: 4 start destruction Rock::~Rock() id: c, serial: 2 Rock::~Rock() id: b, serial: 1 Rock::~Rock() id: a, serial: 0 Rock::~Rock() id: a, serial: 5 Rock::~Rock() id: b, serial: 6 Rock::~Rock() id: c, serial: 7