본문 바로가기
프로그래밍/STL

auto_ptr의 개념.

by 리뷰하는 (게임)프로그래머_리프TV 2010. 4. 2.



#include <memory> 안에 존재하는

오토포인터(auto_ptr)

사용하는 이유는 런타임중 여러번의 delete를 해줄때 생기는 메모리릭에 대해서.
프로그래머가 delete를 해주지 않더라도.
자동으로 메모리를 지워주는 기능을 가지고 있다.
주의점은 소유권이라는것이 존재 하는데.
이는 객채 1개는 오로지 1개의 오토포인터만이 가질 수 있다.
기존의 포인터는 한 객체를 여러 포인터들이 가르킬 수 있었지만,
이것은 그럴 수 없다.
사용법.

#include <iostream>
#include <memory>

class ClassA
{
public:
	int a;
};

void main()
{
	std::auto_ptr<ClassA> p1(new ClassA);
	std::auto_ptr<ClassA> p2;

	p1->a = 10;

	// p1의 a
	std::cout << p1->a << std::endl;

	p2 = p1;

	// 더이상 p1은 아무것도 가르키지 않는다.
	std::cout << p2->a << std::endl;
}​


사용은 다음과 같이 하게 된다.
주의점에 대해서 조금더 알아 보자.

#include <iostream>
#include <memory>

std::auto_ptr<int> f()
{
	// 소유권 이전이 안되는 auto_ptr p
	const std::auto_ptr<int> p(new int);
	std::auto_ptr<int> q(new int);

	*p = 42;
	*p = *q;
	*q = 10;
//	q = p;		// 안된다. 소유권 이전의 문제
//	p = q;		// 마찬가지
//	return p;	// 마찬가지
	return q;	// q는 const(소유권이전 불가능)선언을 하지 않았기 때문에 가능
}

// 함수에서 auto_ptr을 인자로 받는다.
// 그 순간 소유권 이전이 일어 난다.
void bad_print(std::auto_ptr<int> p)
{
	// 출력하고
	std::cout << *p << std::endl;
	// 함수가 종료되는 순간
	// p는 삭제
}

void main()
{
	std::auto_ptr<int> p(new int);
	*p=42;
	p = f();	// f().q의 auto_ptr을 p에 소유권 이전 완료
	std::cout << *p << std::endl;	// 문제 없이 출력

	bad_print(p);// 보내는건 문제가 없지만 소유권이 넘어갔다.

	// 이미 소유권이 넘어가 버린 p는 더이상 아무 값도 가르키지 않는다.
//	*p = 43;	// 안된다.

}​


ps : 함수에서 레퍼런스로 인자를 받게 되면,
소유권 이전이 일어 나지 않는다고 함.

'프로그래밍 > STL' 카테고리의 다른 글

iterator - 반복자  (0) 2010.04.08
시퀀스 컨테이너 - vector, list, deque  (0) 2010.04.05
용어적 설명.  (0) 2010.04.05
2가지 변수를 저장하는 pair  (0) 2010.04.04
numeric_limits.  (0) 2010.04.02