글수 69
마소를 읽다가, 짧은 내용의 글인데 스마트 포인터를 알기 쉽게 설명한 글이 있어서 소개합니다.~
스마트 포인터
스마트 포인터는 RIIA(Resource initialization is acquisition)의 개념을 가장 잘 활용한 예 중 하나다. RIIA란 생성자에서 자원을 획득하고, 소멸자에서 자원을 자동으로 파괴해야 한다는 원칙을 의미한다. <리스트 1>을 살펴보자.
[code]
/* <리스트 1> */
/* 스마트 포인터를 사용하지 않은 의사코드 */
void func()
{
char *ptr = new char[20];
if(some_confition)
return;
delete[] ptr;
}
[/code]
할당한 메모리 ptr 이 some_condition 인 경우에는 해제되지 않고 리턴하기 때문에 릭이 발생한다. 바보같은 코드처럼 보이지만 할당된 자원이 많고 함수가 복잡해질수록 이러한 일은 더욱 쉽게 일어난다.
[code]
/* <리스트 2> */
/* 스마트 포인터를 사용한 의사코드 */
class char_ptr
{
private:
char *m_ptr;
public:
char_ptr(size_t size) { m_ptr = new char[size]; }
~char_ptr() { delete[] m_ptr }
operator char *() { return m_ptr; }
};
[/code]
이러한 문제점을 스마트 포인터를 써서 해결한 코드가 <리스트 2>이다. <리스트 2>의 char_ptr 은 동작 원리를 설명하기 위해 간단하게 제작한 것으로, 실제 스마트 포인터의 구현은 이보다 훨씬 복잡하다. 그러나 걱정할 필요는 없다. 표준 라이브러리 auto_ptr 이나 boost 라이브러리의 shared_ptr 처럼 잘 구현된 스마트 포인터 클래스가 다수 존재하기 때문이다.
스마트 포인터
스마트 포인터는 RIIA(Resource initialization is acquisition)의 개념을 가장 잘 활용한 예 중 하나다. RIIA란 생성자에서 자원을 획득하고, 소멸자에서 자원을 자동으로 파괴해야 한다는 원칙을 의미한다. <리스트 1>을 살펴보자.
[code]
/* <리스트 1> */
/* 스마트 포인터를 사용하지 않은 의사코드 */
void func()
{
char *ptr = new char[20];
if(some_confition)
return;
delete[] ptr;
}
[/code]
할당한 메모리 ptr 이 some_condition 인 경우에는 해제되지 않고 리턴하기 때문에 릭이 발생한다. 바보같은 코드처럼 보이지만 할당된 자원이 많고 함수가 복잡해질수록 이러한 일은 더욱 쉽게 일어난다.
[code]
/* <리스트 2> */
/* 스마트 포인터를 사용한 의사코드 */
class char_ptr
{
private:
char *m_ptr;
public:
char_ptr(size_t size) { m_ptr = new char[size]; }
~char_ptr() { delete[] m_ptr }
operator char *() { return m_ptr; }
};
[/code]
이러한 문제점을 스마트 포인터를 써서 해결한 코드가 <리스트 2>이다. <리스트 2>의 char_ptr 은 동작 원리를 설명하기 위해 간단하게 제작한 것으로, 실제 스마트 포인터의 구현은 이보다 훨씬 복잡하다. 그러나 걱정할 필요는 없다. 표준 라이브러리 auto_ptr 이나 boost 라이브러리의 shared_ptr 처럼 잘 구현된 스마트 포인터 클래스가 다수 존재하기 때문이다.
