2016-10-18 3 views
2

C# 메모리 관리에 대한 질문이 있습니다. 클래스 A의 새로운 인스턴스를 생성하면 클래스 B를 볼 수 있듯이C# 메모리 관리

public class B 
{ 
     public StringBuilder sb; 

     public B() 
     { 
      A a = new A(); 
      sb = a.sbOne; 
     } 
} 

:

public class A 
{ 
    public StringBuilder sbOne = new StringBuilder(); 
    public StringBuilder sbTwo = new StringBuilder(); 
    public StringBuilder sbThree = new StringBuilder(); 
} 

그리고 하나의 StringBuilder 개체가 다른 간단한 클래스 : 나는 세 가지의 StringBuilder 개체가 간단한 클래스가 상상 그것은 생성자이며, StringBuilder 필드를 a.sbOne에 할당합니다. 이 상황에서 메모리가 어떻게 해제됩니까? a.sbTwo와 a.sbThree는 참조가 없으므로 가비지 컬렉션을 사용할 수 있습니까? 또는 sbOne 필드가 계속 참조되는 a의 부분이므로 메모리에 보관됩니까?

EDIT : DateTime이 struct이기 때문에 DateTime이 StringBuilder로 변경되었으며이 클래스가 클래스라고 가정하고있었습니다.

+4

'DateTime'은 * 값 * 유형이라는 점에 유의하십시오. 별도의 객체가 없습니다. 참조 유형을 사용하도록 예제를 변경 하시겠습니까? 예 : 'StringBuilder' 또는 그런 것? –

+0

Jon Skeet은'date'가'a.dateOne'에 대한 참조가 아니라는 것을 의미합니다. 'DateTime'은 구조체이기 때문에'a'는'a.dateOne'의 * copy *입니다. –

+0

내 잘못. 나는 DateTime이 구조체가 아니라 클래스라고 가정하고 있었다. 내 잘못이야. 예, 대신 StringBuilder를 가정하고 같은 질문을합니다. – mesman00

답변

3

A 유형의 개체가 생성 된 경우 해당 개체가 수집 대상이되지 않는 한 해당 개체의 속성/필드가 컬렉션에 적합하지 않습니다. 예를 들어

A a = new A(); 

수집 될 수 a에는 참조 a.sbOne, a.sbTwoa.sbThree 없음이 없을 때까지. 두 번째 예에서는

: 형식 B의 오브젝트가 완전히 분리되기 때문에

public class B 
{ 
     public StringBuilder sb; 

     public B() 
     { 
      A a = new A(); 
      sb = a.sbOne; 
     }//when this is reached the entire object a is eligible for collection 
} 

한다고하더라도 a 수집 할 수는 B 클래스 객체 sb 의해 유지되는 기준은 영향을받지 a.

+0

명확하고 간결한 응답에 감사드립니다. 아래의 rory.ap 답변과 함께 필자는 필요한 정보를 얻었습니다. – mesman00

0

DateTime은 struct/valuetype이므로 date = a.dateOne;이 실행되면 datetime의 복사본이 만들어집니다. 생성자가 끝나면 A 인스턴스에 대한 참조가 유지되지 않습니다. 따라서 수집하도록 표시됩니다.

0

a 생성자 B() 종료 즉시 해당 필드 a.sbTwoa.sbThree과 함께 가비지 수집 될 것입니다. B 인스턴스의 a.sbOnesb에 의해 참조되는 인스턴스는 B 인스턴스가 가비지 수집 될 때까지 남아 있거나 sb을 다른 인스턴스로 설정하거나 null으로 설정합니다.

+0

. 나는 이것이 사실이라고 생각했지만 안심을 찾고 있었다. – mesman00