#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 |