Я знаю, что можно вернуться по ссылке, если указанная переменная также была передана в функцию по ссылке. Например:
int& foo(int& bar)
{
bar++;
return bar;
}
Тем не менее, мне интересно, возможно ли также вернуть по ссылке, если вы возвращаете объект, который был создан в функция через new
ключевое слово. Я попытался что-то вроде следующего, но получил ошибку компилятора:
vector<int>& baz()
{
return new vector<int>();
}
Есть ли способ вернуть новый вектор по ссылке, который имеет смысл, или лучше просто вернуть указатель?
Технически вы можете, конечно, вернуть динамически размещенный объект по ссылке:
vector<int>& baz()
{
return *new vector<int>();
}
Обратите внимание *
используется для разыменования указателя, возвращаемого new
,
Мудро ли это делать — это совсем другой котелок с рыбой. Это главный кандидат на утечку памяти. Если вы это сделаете, звонящий несет ответственность за вызов delete
на возвращенном объекте, в противном случае он просочился. Обратите внимание, что это может произойти очень легко с любым из этих сценариев:
std::vector<int> v1 = baz(); // leak!
auto v2 = baz(); // leak!, auto doesn't deduce references
В современном C ++ вы должны просто вернуть вектор по значению и позволить переместить семантику и / или (Named) Оптимизация возвращаемого значения сделать свою работу:
std::vector<int> baz()
{
return std::vector<int>();
}
если ты необходимость динамическое распределение по какой-то причине, вы должны по крайней мере вернуть подходящий интеллектуальный указатель, чтобы избежать утечек памяти:
std::unique_ptr<std::vector<int>> baz()
{
return std::unique_ptr<std::vector<int>>(new std::vector<int>());
}
Что касается: Is there a way to return the new vector by reference that makes sense, or is it better to just return a pointer?
Дабл нет нет.
Просто верните значение и воспользуйтесь преимуществами копирования (см .: Что такое оптимизация копирования и возвращаемое значение?) и ход-семантика (см .: Что такое семантика перемещения?)
new vector<int>();
на самом деле возвращает указатель.
Если вам действительно нравится утечка памяти, напишите это:
return *(new std::vector<int>());