변수가 범위를 벗어나면 변수가 존재하지 않는다는 뜻인가요?

StackOverflow https://stackoverflow.com/questions/602991

  •  03-07-2019
  •  | 
  •  

문제

범위를 이해하고 있는지 잘 모르겠습니다. 범위를 벗어난 변수(저는 Ruby를 사용하고 있습니다)가 메모리 어딘가에 존재합니까, 아니면 존재하지 않습니까(액세스할 수 없다는 것을 알고 있습니다). 범위를 벗어난 변수가 더 이상 존재하지 않는다고 말하는 것이 정확하지 않습니까?

아마도 이것은 철학적인 질문일 것이다.

도움이 되었습니까?

해결책

관리 언어를 사용하는 경우 더 이상 존재하지 않는 한 메모리를 할당하고 할당하지 않습니다.

기술적으로는하지만 GC는 결정 론적이지 않으므로 기술적으로 실제로 사라질 때 말하기 어렵습니다.

다른 팁

변수는 보유한 값과 동일하지 않습니다.

변수 자체는 범위를 벗어날 때 존재하지 않습니다. 그만큼 보유 된 변수는 객체를 나타낼 수 있으며, 그 객체는 변수의 수명을 넘어 계속 존재할 수 있습니다. 쓰레기 수집가는 나중에 물체를 되 찾습니다.

그것이 범위를 벗어날 때, 쓰레기 수집이 그것을 정리할 때까지, 그것은 얼마 동안 (메모리가 할당된다는 의미에서) 존재합니다. 그러나 당신이 알 수 있듯이, 그것은 이름을 잃어 버렸고 도달 할 수 없습니다.

가변이 범위에서 벗어날 때 누군가가 비명을 지르는 소리가 들리나요?

이것은 쓰레기 수집에 대한 일반적인 질문만큼 루비 질문이 아닙니다. 변수가 범위를 벗어나면 루비 또는 C#과 같은 쓰레기 수집 언어에서는 더 이상 사용되지 않는다고 말하는 방식으로 표시됩니다. 이런 일이 발생하면 더 이상 그것을 얻을 수 없으며 엄지 손가락을 둘러싼 주위에 앉아 있습니다. 그러나 여전히 메모리가 할당되어 있습니다.

어느 시점에서 쓰레기 수집가는 일어나서 사용하지 않는 것으로 표시된 변수를 찾습니다. 그것은 그것들을 처분 할 것이며 그 시점에서 그들은 더 이상 기억에 빠지지 않습니다.

쓰레기 수집가의 작동 방식에 따라 이것보다 더 복잡 할 수 있지만 충분히 가깝습니다 :)

쓰레기 수집가가 그것을 처분 할 때까지 약간 존재합니다 (가능하다면).

Rob Kennedy가 이에 대해 적절하게 답변했지만 좀 더 자세한 내용을 추가해야겠다고 생각했습니다.

인식해야 할 중요한 점은 변수와 그것이 나타내는 값의 차이입니다.

다음은 예입니다(저는 Ruby를 모르기 때문에 C#으로 작성했습니다).

object c = null;
if (1 == 1) // Just to get a different scope
{
    var newObj = new SomeClass();
    newObj.SomeProperty = true;
    c = newObj;
}

위 코드에서 newObj는 if 문 끝에서 범위를 벗어나므로 "존재하지 않습니다". 그러나 참조하고 있던 값은 여전히 ​​살아 있고 잘 참조되며 c에서 참조됩니다.개체에 대한 모든 참조가 사라지면 가비지 수집기가 해당 개체를 정리합니다.

파일 객체에 대해 이야기하고 있다면 철학적 질문 이상이됩니다. 내가 올바르게 기억하면 파일이 범위를 벗어날 때 자동으로 닫히지 않습니다. 닫기를 요청하거나 사용하는 경우에만 닫힙니다. File.open do |file| 스타일 블록 또는 쓰레기를 수집하는 경우. 다른 코드 (또는 단위 테스트)가 해당 파일의 내용을 읽고 아직 플러시되지 않은 경우 문제가 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top