Могут ли методы, возвращающие константу ссылки или ссылки, вызывать утечку памяти?

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

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:

Определение ссылки в С++ таково, что ему не нужно существовать. Он может быть реализован как новое имя для существующего объекта.

Там также абзац говорит о различии между указателями и ссылками.