Висячая ссылка C++, странное поведение ⇐ C++
-
Гость
Висячая ссылка C++, странное поведение
int*& f(int*& x, int* y){ int** z = &y; * г = х; вернуть *z; } Привет всем, мне дали этот код на экзамене, и у меня возникли с ним проблемы.
Насколько я понимаю, при наличии ссылки на указатель (x) и копии указателя, созданной (y) в теле функции, локальный двойной указатель (z) создается и инициализируется с помощью l-значения y, а затем разыменовывается. 1 раз, поэтому доступ к y осуществляется, и адрес, содержащийся в y, теперь становится адресом, содержащимся в x. После этого *z возвращается как ссылка на указатель, как я предполагаю, на y.
Если моя предыдущая часть верна, я не объясняю, почему возврат y, который освобождается при выходе из функции (поскольку это временный параметр), не создает никаких проблем в программе, действительно ответ на экзамене был такой функция возвращала висячую ссылку, и Я согласен с этим, но копирую/вставляю код и «играю» с возвращаемой переменной, даже делая случайные действия после возврата параметра чтобы «отредактировать стек», в котором освобожденный y все еще присутствует и «готов к перезаписи» (если я все еще прав), не представляет никакого неопределенного поведения программы.
Мое единственное объяснение состоит в том, что возврат копирует только значение r, содержащееся в y, или, может быть, он возвращает значение l и значение r (поскольку возвращает ссылку на указатель), но когда он связан с внешним указателем, «вызывающим» функция y не освобождается должным образом, или указатель, который получает значение, занимает место освобожденного указателя y.
Внизу вы можете найти код, используемый для проверки функции int*& f(int*&, int*).
Мой вопрос: это правильная висячая ссылка или это пограничный случай, когда такую вещь можно использовать в программе?
#include использование пространства имен std; интервал а = 65; int*& f(int*& x, int* y) { cout
int*& f(int*& x, int* y){ int** z = &y; * г = х; вернуть *z; } Привет всем, мне дали этот код на экзамене, и у меня возникли с ним проблемы.
Насколько я понимаю, при наличии ссылки на указатель (x) и копии указателя, созданной (y) в теле функции, локальный двойной указатель (z) создается и инициализируется с помощью l-значения y, а затем разыменовывается. 1 раз, поэтому доступ к y осуществляется, и адрес, содержащийся в y, теперь становится адресом, содержащимся в x. После этого *z возвращается как ссылка на указатель, как я предполагаю, на y.
Если моя предыдущая часть верна, я не объясняю, почему возврат y, который освобождается при выходе из функции (поскольку это временный параметр), не создает никаких проблем в программе, действительно ответ на экзамене был такой функция возвращала висячую ссылку, и Я согласен с этим, но копирую/вставляю код и «играю» с возвращаемой переменной, даже делая случайные действия после возврата параметра чтобы «отредактировать стек», в котором освобожденный y все еще присутствует и «готов к перезаписи» (если я все еще прав), не представляет никакого неопределенного поведения программы.
Мое единственное объяснение состоит в том, что возврат копирует только значение r, содержащееся в y, или, может быть, он возвращает значение l и значение r (поскольку возвращает ссылку на указатель), но когда он связан с внешним указателем, «вызывающим» функция y не освобождается должным образом, или указатель, который получает значение, занимает место освобожденного указателя y.
Внизу вы можете найти код, используемый для проверки функции int*& f(int*&, int*).
Мой вопрос: это правильная висячая ссылка или это пограничный случай, когда такую вещь можно использовать в программе?
#include использование пространства имен std; интервал а = 65; int*& f(int*& x, int* y) { cout
Мобильная версия