ㆍ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를 벗어날때 할당된 배열객체도 자동 해제됩니다 'ㅅ'