참조 횟수 계산 방식

참조 횟수 계산 방식(reference counting)은 메모리를 제어하는 방법 중 하나로, 쓰레기 수집의 한 방식이다. 구성 방식은 단순하다. 어떤 한 동적 단위(객체, Object)가 참조값을 가지고 이 단위 객체가 참조(참조 복사)되면 참조값을 늘리고 참조한 다음 더이상 사용하지 않게 되면 참조값을 줄이면 된다. 보통 참조값이 0이 되면 더이상 유효한 단위 객체로 보지 않아 메모리에서 제거한다.

이 방식은 단위 객체에 대한 유/무효 처리가 사용하는 자리에서 확실하게 정해지며 참조값을 늘리고 줄이는 방법을 사용하기 때문에 빠르다. 또한 동적 쓰레기 수집을 하지 않는 프로그래밍 언어에서도 간단하게 구현할 수 있다.

문제점 
약점으로는 매번 참조할 때마다 참조값을 검사해야 하므로 많은 수의 단위 객체를 사용하게 되면 그 검사에 대한 부하가 커진다. 또한 참조하는 단위 객체 사이에 서로 참조하게 되면 순환 참조 오류로 인해 잘못된 참조 파괴가 생기거나 또는 단위 객체가 고아(orphaned)가 될 수 있다.

방식 
참조 횟수 계산 방식에는 강한 참조(strong reference)와 약한 참조(weak reference)가 있는데 보통 참조 횟수 계산 방식을 이야기 할때는 강한 참조를 말하며, 약점으로 지적된 순환 참조 오류를 해소하기 위해 약한 참조를 사용하기도 한다.

구현 
C로 작성된 코드
struct object
{
    int ref;
};

struct object* object_new(void)
{
    struct object* p=malloc(sizeof(struct object));
    p->ref=1;
    return p;
}

int object_ref(struct object* p)
{
    return (p->ref++);
}

int object_unref(struct object* p)
{
    if ((p->ref--)!=0)
        return p->ref;
    else
    {
        free(p);
        return 0;
    }
}

대표적으로 사용하는 곳 
 구성요소 개체 방식(Component Object Model(COM))
 마이크로소프트의 IUnknown, ATL
 스크립트 언어: 펄, 파이썬, 스퀴럴
 C++ TR1, 부스트 라이브러리의 shared_ptr
 GLib의 GObject, 아파치의 APR 라이브러리

파일 시스템 
참조 횟수 계산 방식은 여러 파일 시스템에서도 사용된다. 파일 시스템에서는 파일 또는 할당된 디스크 블록에 참조 횟수를 저장하고, 참조 횟수가 0이 되면 안전하게 블록을 해제할 수 있다. 일부 유닉스 계열 운영체제에서는 디렉토리뿐만 아니라 실행 중인 프로세스 또한 파일에 대한 참조 횟수를 가질 수 있다. 만약 파일 시스템에서 파일이 삭제되었더라도, 프로세스가 해당 파일을 열고 있다면 참조 횟수가 0이 아니므로 파일이 해제되지 않으며, 해당 파일을 열고 있는 모든 프로세스가 파일을 닫으면 디스크에서 해제된다.

같이 보기 
 쓰레기 수집
 메모리 관리
 메모리 누수

자동 메모리 관리
메모리 관리