Могут ли методы, возвращающие константу ссылки или ссылки, вызывать утечку памяти?
Мне очень любопытно, если возврат ссылки из метода может вызвать утечку памяти. Ниже приведен пример ситуации.
class example
{
public:
vector<int> & get_vect()
{
return vect;
}
int & get_num()
{
return num;
}
private:
vector<int> vect;
int num;
};
void test_run(example & input)
{
int & test_val = input.get_num();
vector<int> & test_vect = input.get_vect();
}
int main()
{
example one;
test_run(one);
return 0;
}
Мой вопрос в том, когда test_val
и test_vect
удаляются из стека, когда test_run
завершается. Удаляется ли test_vect
или test_val
, что приводит к повреждению объекта?
Ответы
Ответ 1
Нет. Ссылки - это псевдонимы (или имена) для чего-то другого. Вы можете думать об этом как о бессмысленном указателе на что-то без семантики указателя (и их ловушки, хотя сами ссылки имеют несколько завихрений).
Когда функция test_run
завершается, ссылки и только те исчезли. То, о чем они говорили, не коснулось памяти, оно не было удалено.
Кроме того, поскольку вы имеете дело только с переменными, которые имеют автоматическую продолжительность хранения и не связаны с динамической памятью во время построения, вы просто не можете иметь утечек памяти. У вас могут возникнуть другие проблемы, например, попытка удалить указатель, указывающий на такую переменную (попытка только что дала core dump на coliru), но не протекает.
Ответ 2
Нет. Почему это должно привести к утечке памяти, если вы не выделяете память с помощью new
, что означает в куче? Все ваши переменные выделяются в стеке. Ссылки - это просто псевдонимы для других переменных.
Ссылка на С++ в соответствии с wikipedia
:
Определение ссылки в С++ таково, что ему не нужно существовать. Он может быть реализован как новое имя для существующего объекта.
Там также абзац говорит о различии между указателями и ссылками.