>백엔드 개발 >C++ >지역 변수의 참조를 반환할 때 값이나 주소를 반환합니까(그리고 이것이 왜 위험한가요?)

지역 변수의 참조를 반환할 때 값이나 주소를 반환합니까(그리고 이것이 왜 위험한가요?)

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-20 02:05:10408검색

When Returning a Local Variable's Reference, Does It Return the Value or the Address (And Why Is This Dangerous)?

지역 변수 참조 수수께끼: 반환 값 또는 주소?

많은 프로그래머는 함수에서 지역 또는 임시 변수에 대한 참조를 반환하는 것이 잘못되었다고 가정할 수 있습니다. , 정의되지 않은 동작이 발생합니다. 그러나 특정 상황에서는 놀랍게도 성공하여 변수 값을 수정할 수도 있습니다. 예시 코드 예제를 통해 이 현상을 조사해 보겠습니다.

#include <iostream>

int& foo() {
    int i = 6;
    std::cout << &i << std::endl; // Prints the address of i before return
    return i;
}

int main() {
    int i = foo();
    std::cout << i << std::endl; // Prints the value
    std::cout << &i << std::endl; // Prints the address of i after return
}

이 코드를 실행하면 이상한 동작이 관찰됩니다.

  1. foo()에서 지역 변수 i의 주소 반환되기 전에 인쇄되어 스택 프레임 내에 존재함을 나타냅니다.
  2. i가 foo()의 지역 변수임에도 불구하고 그 값은 성공적입니다. main()의 변수에 반환 값을 할당할 때 수정되었습니다.
  3. main()의 i 주소는 반환 전후에 동일하게 유지되어 변수가 여전히 스택 메모리에 있음을 나타냅니다.

발생 원인 설명

이 수수께끼 같은 행동은 많은 구현에서 스택 프레임을 처리하는 방식이 특이합니다. 함수에서 반환할 때 처음에는 스택 프레임이 즉시 지워지지 않습니다.

이 예에서 반환 유형은 int&입니다. 이는 함수가 i 주소에 대한 참조를 반환한다는 의미입니다. 할당 int i = foo(); in main()은 foo()의 i 주소를 main()의 변수 i에 저장합니다.

동시에 foo()의 반환 명령은 스택 프레임을 즉시 해제하지 않습니다. 결과적으로 변수 i는 삭제되어야 했지만 여전히 스택 메모리에 존재합니다. 이를 통해 반환 후 참조를 통해 i를 수정할 수 있습니다.

주의 사항 및 의미

이 동작은 편리해 보일 수 있지만 매우 위험하고 신뢰할 수 없습니다. 지연된 스택 프레임 소멸에 의존하는 것은 정의되지 않은 동작의 비법입니다.

잘 정의된 코드에서는 지역 변수가 정의 함수의 범위 내에 유지되고 종료 시 즉시 소멸되도록 해야 합니다. 그렇지 않으면 예측할 수 없는 결과와 오류가 발생할 수 있습니다.

위 내용은 지역 변수의 참조를 반환할 때 값이나 주소를 반환합니까(그리고 이것이 왜 위험한가요?)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.