스마트 포인터

ProudNet은 스마트 포인터 클래스를 보유하고 있습니다.

스마트 포인터란, 생성된 객체을 참조하는 변수들이 존재하는 한 해당 객체의 존재 자체를 보장하는 역할을 합니다. 그리고 해당 객체을 참조하는 변수들이 더 이상 존재하지 않을 때만 그 객체는 파괴됩니다. 스마트 포인터는 개발자가 만든 버그로 인해 이미 파괴된 객체를 참조하는 문제(dangling)나 미처 객체를 파괴하지 않는 문제(leak)를 해소하는 역할을 합니다.

스마트 포인터 변수는 복사될 때마다 객체 참조 카운트가 1씩 증가합니다. 아래 그림에서 Object Instance는 참조되는 모든 스마트 포인터 변수가 더 이상 없을 때까지, 즉 참조 카운트가 0이 될때까지 존재하게 됩니다.

smart_ptr.jpg
스마트 포인터와 객체간의 관계

ProudNet의 스마트 포인터는 Proud.RefCount 입니다.

아래는 스마트 포인터를 사용하는 예제 코드입니다.

class A {...};
void Foo()
{
// A 객체가 생성
// 변수 b가 변수 a와 공유됨. A의 참조 카운트는 2가 됨.
// 변수 a가 해제됨. 그러나 A는 참조 카운트가 아직 1이므로 파괴되지 않음.
// 변수 b가 해제됨. 더 이상 A를 참조하는 변수가 없으므로 A가 파괴됨. (즉 delete가 호출됨)
}

만약 객체를 참조하는 스마트 포인터가 여러 군데 있는 상태에서 강제로 객체를 파괴하고 싶을 때가 있습니다. 예를 들어, 열려있는 파일 핸들을 보유한 객체를 스마트 포인터에서 참조하고 있을 경우, 당장 그 파일 핸들을 보유한 객체를 파괴해야 하는 때가 있을 것입니다. 하지만 스마트 포인터가 여기 저기서 그 객체를 참조하고 있을 경우 명시적으로 객체가 파괴되는 시점을 알 수 없기 때문에 난관에 봉착할 수 있습니다.

이러한 경우를 위해 Dispose Pattern 을 구사할 수 있습니다. Dispose Pattern 을 통해 이미 여러 군데에서 참조하고 있는 객체의 파괴를 명시적으로 수행할 수 있습니다.