본문 바로가기

카테고리 없음

[C++]스마트포인터 -2 (shared_ptr)

ㆍshared_ptr 사용법



shared_ptr를 사용한다면 한 객체에 대해 여러 포인터가 중복으로 가르킬 수 있습니다.

참조 카운트방식을 따르고 있기 때문입니다. 참조(포인팅)한 횟수를 세고 0이 되면 객체를 해제합니다.

use_count()메서드가 존재하여 한 객체에 얼마나 포인팅 되었는지 확인이 가능합니다.



위에 코드처럼 shared_ptr형으로 선언된 sptr1과 sptr2는 같은 객체를 가르키고 있습니다.

때문에 sptr1.use_count()의 값은 2가 될것입니다.

그 후에 sptr1과 sptr2가 scope를 벗어나게 되면 자동적으로 그 객체는 해제됩니다.


이처럼 shared_ptr은 auto_ptr의 단점인 복사문제를 참조 카운트방식을 통해서 해결하였습니다.


이제 배열할당해제문제를 해결해봅시다 !

배열로 할당한 객체를 shared_ptr로 다루기 위해선 배열로 대상을 삭제하는 함수를 직접 작성하셔야 합니다.



1
2
3
4
5
6
7
8
9
void RemoveString(string*str)
{
    delete[]str;
}
 
void main()
{
    shared_ptr<string> sptr1(new string[3],RemoveString);
}
cs

초 심플하게 짜봤습니다. 두번째 인수로 함수이름을 넘겨주셔야합니다.

그리고 함수는 해제하고자 하는 객체의 타입을 포인터형으로 받으셔야합니다.

이렇게 되면 sptr1이 scope를 벗어날때 할당된 배열객체도 자동 해제됩니다 'ㅅ'