2009-03-30 7 views

답변

15

아니요. 가비지 감지기는 str2에 데이터에 대한 참조가 있으며 수집되지 않음을 알게됩니다.

7

아니요, 위험하지 않습니다. 참조가 반환되고 가비지 수집기가 실행되면 main에 참조를 볼 수 있으므로 문자열을 해제하지 않습니다.

이 가비지 수집 대상인 인 경우에도 즉시 가비지 수집기가 실행될 때만 (또는 나중에 생성되는 세대에 따라 나중에) 가비지 수집이 해제되지 않습니다. 가비지 컬렉터가 변수가 여전히 범위 안에있을 경우에도, 더 이상 사용되지 않는 개체를 수집 할 수 있다는

주 - 너무 오래는 변수가 다시 읽을 수없는 것을 알고 같이

object x = new object(); 
Console.WriteLine(x); 
// Lots more code not touching x 
// The object could be collected at any time here 
7

str과 str2는 모두 하나의 (문자열) 객체에 대한 참조입니다. 가비지 컬렉터는 남아있는 참조가없는 객체 만 재사용합니다.

-1

잘못된 답 :

문자열 내가 생각하는, 불변는 예를 들어, 당신은 메모리에 문자열의 새 복사본을해야한다는 것을 의미하므로 STR이 정리 될 때, STR2는 자신의 데이터가 있습니다.

존 소총의 설명 :

아니 - 그들은 동일한 문자열 객체를 모두 참조입니다. 문자열이 아닌 참조을 복사합니다.

+0

아니요 - 둘 다 동일한 문자열 개체에 대한 참조입니다. 문자열이 아닌 * reference *를 복사합니다. –

+0

교육에 감사드립니다 – cjk

-2

괜찮을 것입니다. 문자열은 값 유형입니다. 일반적으로 값 유형을 반환하면 객체의 복사본이 표시됩니다. 따라서 str 변수가 범위를 벗어나서 수집되는 경우 str2 변수가 유효합니다.

이제는 문자열 인이므로 여기에 대해 이야기하고 있습니다. 평범한 값 유형이 아니라 다른 몇 가지 사항이 있습니다. "hello"문자열은 컴파일러가 문자열 테이블에 넣을 가능성이 높으며 문자열 변수는 입니다.은 테이블의 동일한 항목을 참조하므로 동일한 문자열의 사본을 많이 보관하지 않아도됩니다.

어느 쪽이든, 수집하는 것에 대해 걱정하지 마십시오.

+0

문자열은 값 유형이 아닙니다. 참조 유형입니다. 당신은 객체의 사본을 얻지 못하고 * reference * 사본을 얻습니다. –

+0

(실제로 당신은 받아 들여지고있는 리터럴에 대해 옳았습니다. 그러나 실제 코드에서는 리터럴이 리턴되지 않는다고 생각합니다.) –

0

아니요. 동일한 문자열에 대한 참조가 유지되는 한이 경우 str2에 의해 유지됩니다. GC가 수집하지 않습니다.

0

아니, 두 가지 이유로 문자열의 내용을 삭제되지 않습니다 가비지 컬렉터 :

  • 당신은 문자열에 대한 참조가

    , 그리고 긴 활성 참조가 같은 개체에 가비지 컬렉터는 삭제하지 않습니다.

  • 문자열 리터럴이므로 어셈블리에서 상수입니다. 어셈블리가 제거 될 때 (즉, 응용 프로그램이 종료 될 때) 어셈블리가로드 및 제거 될 때 만들어집니다. 가비지 수집기는 문자열 리터럴을 절대 삭제하지 않습니다.

관련 문제