Объекты, объявленные с автоматическим временем жизни, всегда перестают существовать, когда оставляется область, в которой они были созданы.
Если вы хотите, чтобы объект выжил за пределами области, в которой он был создан, вы должны создать объект сдинамическое время жизни с использованием (прямо или косвенно) ключевого слова new
. Помните, однако, что в C ++ нет сборщика мусора, поэтому для каждого использования new
вы должны delete
созданный объект, когда вы закончите с ним. Лучший способ сделать это - использовать смарт-указатель в некоторой форме, например std::unique_ptr
или std::shared_ptr
(который зависит от вашей конкретной ситуации):
std::vector<std::unique_ptr<std::string>> test() {
std::vector<std::unique_ptr<std::string>> ret;
std::unique_ptr<std::string> str = std::make_unique<std::string>("t");
ret.push_back(std::move(str));
//...
return ret;
}
(std::make_unique
использует new
для создания нового объекта и возвращает std::unique_ptr
к нему)
В этом конкретном случае действительно нет никаких преимуществдля хранения указателей на строки в вашем векторе, хотя. Объект std::string
по сути является интеллектуальным указателем на массив символов, поэтому вы можете просто сохранять объекты напрямую:
std::vector<std::string> test() {
std::vector<std::string> ret;
ret.push_back("t");
//...
return ret;
}