Подтвердить что ты не робот

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

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

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, что приводит к повреждению объекта?

4b9b3361

Ответ 1

Нет. Ссылки - это псевдонимы (или имена) для чего-то другого. Вы можете думать об этом как о бессмысленном указателе на что-то без семантики указателя (и их ловушки, хотя сами ссылки имеют несколько завихрений).

Когда функция test_run завершается, ссылки и только те исчезли. То, о чем они говорили, не коснулось памяти, оно не было удалено.

Кроме того, поскольку вы имеете дело только с переменными, которые имеют автоматическую продолжительность хранения и не связаны с динамической памятью во время построения, вы просто не можете иметь утечек памяти. У вас могут возникнуть другие проблемы, например, попытка удалить указатель, указывающий на такую ​​переменную (попытка только что дала core dump на coliru), но не протекает.

Ответ 2

Нет. Почему это должно привести к утечке памяти, если вы не выделяете память с помощью new, что означает в куче? Все ваши переменные выделяются в стеке. Ссылки - это просто псевдонимы для других переменных.

Ссылка на С++ в соответствии с wikipedia:

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

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