синтаксис — возврат по ссылке в переполнении стека

Я знаю, что можно вернуться по ссылке, если указанная переменная также была передана в функцию по ссылке. Например:

int& foo(int& bar)
{
bar++;
return bar;
}

Тем не менее, мне интересно, возможно ли также вернуть по ссылке, если вы возвращаете объект, который был создан в функция через new ключевое слово. Я попытался что-то вроде следующего, но получил ошибку компилятора:

vector<int>& baz()
{
return new vector<int>();
}

Есть ли способ вернуть новый вектор по ссылке, который имеет смысл, или лучше просто вернуть указатель?

1

Решение

Технически вы можете, конечно, вернуть динамически размещенный объект по ссылке:

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>());
}
5

Другие решения

Что касается: Is there a way to return the new vector by reference that makes sense, or is it better to just return a pointer?

Дабл нет нет.

Просто верните значение и воспользуйтесь преимуществами копирования (см .: Что такое оптимизация копирования и возвращаемое значение?) и ход-семантика (см .: Что такое семантика перемещения?)

2

new vector<int>();

на самом деле возвращает указатель.

Если вам действительно нравится утечка памяти, напишите это:

return *(new std::vector<int>());
1
По вопросам рекламы [email protected]