smart pointers with std::vector