*이 포스팅은 개인 학습을 위해 내용을 정리한 것이 목적입니다.
utility헤더에서 찾을 수 있음.
4.1 Pairs
- 두 개의 값을 한 개의 단위로 관리하기 위해 제공. class가 아닌 struct임. 모든 멤버는 public.
- 사용목적 : map/multimap등에서 key/value를 다루기 위해 사용하거나, 두 가지의 값을 반환하고자 하는
함수에서 사용.
- Pairs의 값 비교는, first_value를 먼저 비교 후, second_value를 비교하여 동일 여부를 판단.
4.1.1. make_pair()
- Pairs를 만들어주는 함수. 기존 코드에서는 std::pair<int,char>(42,’@’);를 std::make_pair(42,’@’); 로 사
용가능해짐.
4.2 auto_ptr클래스
스마트포인터의 한 종류. 스마트포인터는 메모리누수를 줄이기 위해 만들어졌음.
* 스마트포인터
- 자동으로 자원 해제를 하는 등의 추가적인 동작을 하는 포인터의 추상 데이터 타입
4.2.1 auto_ptr클래스 등장배경
- 리소스 할당 후, 잊어버리거나 중간에 return등으로 해제를 못함. auto_ptr은 자신이 가리키는 객체에 대
한 소유자로서 행동하여, auto_ptr이 제거되면 가리키던 객체도 제거됨.
- ++등 포인터 계산에 사용되는 연산자는 정의되어있지 않고, 할당연산자를 통한 초기화가 불가능
4.2.2 auto_ptr에 의한 소유권 이전
- 하나의 auto_ptr이 소유한 객체는 다른 auto_ptr에 의해 소유되어지면 안됨. 다른 auto_ptr에 의해 소유권
이 넘어가야함. (소멸식 복사)
1) 소스와 싱크
- 함수가 데이터의 싱크(수신부를 의미)처럼 행동하는 경우. value가 전달된 경우이므로, 호출된 함수의
인자가 소유권을 가지게 된다.
- 함수가 데이터의 소스(송신부를 의미)처럼 행동하는 경우. 호출한 쪽이 소유권을 가짐.
2) 주의
- auto_ptr은 소유권이라는 개념이 있으므로 반환값으로 사양하는 것은 지양.
- const auto_ptr : 값 변경 불가가 아닌 소유권 변경이 불가능하다는 것.
4.2.3 멤버변수로의 auto_ptr
- 메모리 누수를 피할 수 있음. 소멸자는 생략가능하여도, 복사생성자와 할당연산자는 반드시 작성할것
4.2.4 auto_ptr의 잘못된 사례
1) auto_ptr은 소유권을 공유할 수 없다. 허용된다면 읽기/쓰기에 문제가 생김
2) auto_ptr은 배열 타입을 지원하지않는다. auto_ptr은 delete[]가 아닌 delete를 호출한다.
3) auto_ptr은 범용이 아니다. (레퍼런스카운트가 없음)
4) auto_ptr은 표준컨테이너클래스와 함께 사용될 수 없음.
- 컨테이너 클래스에서는 소스와 싱크가 동등할 수 없음.
- auto_ptr의 모든 멤버함수는 예외를 던지지않는다 (ISO/IEC-14882).
- 멤버변수로 auto_ptr은 싱글톤이나 복사생성자나 할당연산자를 지원하지 않는 클래스에는 적합. 그러나
복사를 허용하는 클래스에는 절대 사용 불가.
-> 레퍼런스 카운팅을 하고 컨테이너에 넣을 수 있는 스마트 포인터는 아래와 같이 존재한다.
TR1을 지원하는 컴파일러에서는
tr1::shared_ptr (참고: http://msdn.microsoft.com/en-us/library/bb982026.aspx)를,
지원하지 않는 컴파일러에서는
boost::shared_ptr(참고: http://www.boost.org/doc/libs/1_38_0/libs/smart_ptr/shared_ptr.htm)
또는 Loki::SmartPtr(참고 : http://loki-lib.sourceforge.net/html/a00634.html)를 사용하면 된다.
(참고 : http://ohyecloudy.com/pnotes/archives/286/)
4.2.5 auto_ptr 예제
1) auto_ptr 소유권 관련 예제
2) const auto_ptr의 동작
4.2.6 class auto_ptr 세부사항
1) 타입정의
구문 |
설명 |
auto_ptr::element_type |
소유한객체의타입 |
2) 생성자, 할당, 소멸자
구문 |
설명 |
auto_ptr::auto_ptr() throw() |
기본생성자. 객체를 소유하지않는 auto_ptr을 생성. 0으로 초기화 |
explicit auto_ptr::auto_ptr(T* ptr) throw() |
ptr이 참조하는 객체를 소유하는 auto_ptr생성. ptr이 NULL이 아니라면 반드시 new로 생성된 값을 넘겨주어야 함. new[]로 생성된 배열을 반환값으로 넘겨주는것은 좋지않음 |
auto_ptr::auto_ptr(auto_ptr& ap) throw() |
값을 위한 복사생성자. ap가 소유하는 객체의 소유권을 받아들이는 auto_apr을 생성. 이 이후 ap는 NULL포인터를 가짐. 멤버템플릿과 함께오버로드되어있음. |
template<class U> auto_ptr::auto_ptr(auto_ptr<U>& ap)throw() | |
auto_ptr& auto_ptr::operator= (auto_ptr& ap)throw() | 값을 위한 할당생성자. 원래 소유하던 객체를 삭제하고 (delete를 사용), ap가 소유하는 객체의 소유권을 받아들임. ap는 더 이상 객체를 소유하지 않고 NULL포인터를 가짐. 원본객체에 변화가 일어난다. |
template<class U>auto_ptr& auto_ptr::operator= (auto_ptr<U>& ap) throw() | |
auto_ptr::~auto_ptr() throw() | 소멸자. 객체 소유중이면 delete를 호출 |
3)value access
구문 |
설명 |
T* auto_ptr::get() throw() |
소유한 객체의 주소를 반환. 없을경우 NULL반환. 소유권변경 없음 |
T& auto_ptr::operator*() const throw() |
역참조연산자. 소유한 객체를 반환. 만약 소유한 객체가 없다면 문제발생 |
T* auto_ptr::operator->() const throw() |
멤버엑세스를 위한 연산자. 소유한 객체의 멤버를 반환. 소유한 객체가 없을경우 문제발생 |
4)Value Manipulation
구문 |
설명 |
T* auto_ptr::release() throw() |
소유한객체의 소유권을 해제하고, 객체의 주소를 반환. (없을경우 NULL리턴) |
void auto_ptr::reset(T* ptr=0) throw() |
ptr로 auto_ptr을 초기화함. 소유하던 기존객체는 삭제. 소유자는 this*임. 대상 객체는 new로 생성된 값을 넘겨주어야 함. |
5)변환
- const auto_ptr이 아닌경우에 복사와 할당연산을 가능하게 하는 트릭변환으로 구성되어 있다.
- 요구사항
i) auto_ptr을 r-value처럼 함수에 전달하거나 전달받을 수 있어야한다. 생성자를 이용해야함
ii) auto_ptr이 복사될 때, 원본 포인터가 소유권을 포기하는 것은 중요. (원본 auto_ptr이 복사
될 때, 수정되어야 함을 의미함)
4.3 수치 제한
- 타입안정성을 제공하는 것과, 제한값을 구하는 템플릿을 작성할 수 있다는 2가지 장점이 있음.
1) numeric_limit<> 클래스
모든 타입에 대한 일반적인 템플릿은 디폴트 수치값을 제공하나, 전문화를 통해 각각의 수치 타입에 따라
제한값을 정의할 수 있음.
numeric_limits클래스의 멤버
멤버 |
의미 |
is_specialized |
타입이 수치 제한을 위한 전문화를 가지고 있는지 여부 |
is_signed |
signed타입인지 여부 |
is_integer |
정수 타입인지 여부 |
is_exact |
라운딩에러가 없는 계산결과를 산출하는지 |
is_bounded |
표현가능한 값의 집합이 유한한지 (모든 내장타입에 대해 true) |
is_modulo |
어떤 타입의 모든 값들이 특정 값의 modulo가 되는 경우. char, int, long은 true |
is_iec559 |
IEC559와 IEEE754를 준수하는가 |
min() |
최소유한값 |
max() |
최대유한값 |
digits |
문자,정수 : 부호비트 제외한 전체비트의 수, 부동소수점: 가수의 전체비트의수 |
digits10 |
10진수표시시 자릿수 |
radix |
정수 : 표현의 기본, 부동소수점 : 지수표현의 기본 |
min_exponent |
radix base일때 최소 음의 정수 지수값 |
max_exponent |
radix base일때 최대 양의 정수 지수값 |
min_exponent10 |
기수가 10base일때 최소음의 정수 지수값 |
max_exponent10 |
기수가 10 base일때 최대 양의 정수 지수값 |
epsilon() |
|
round_style |
|
round_error() |
|
has_infinity |
|
infinity() |
|
has_quite_NaN |
|
quit_NaN() |
|
has_signaling_NaN |
|
signaling_NaN() |
|
has_denorm |
|
hs_denrom_loss |
|
denorm_min() |
|
traps |
|
tinyness_before |
|
4.4 보조함수
4.4.1 최소/최대값 처리
- min/max값이 있음. Compare함수를 구현하여, 해당 함수를 통한 조건으로 정렬이 가능함.
4.4.2 swap
- 복사생성자와 할당이 가능해야함. swap함수 전문화를 이용하여, 더 좋은 성능을 낼 수 있음
4.5 비교 연산자의 확장
return_type operator(연산자) (const X& x) const; |
- 여기서 연산자에 대한 정의를 수행할 수 있음
4.6 <cstddef>와 <cstdlib>
4.6.1 cstddef의 정의
1) NULL : 값이없음 or 정의되지않음
2) size_t : 음수가 될 수 없는 사이즈 단위
3) ptrdiff_t : 포인터의 차이를 위한 signed타입
4) offsetof() : struct나 union에서의 멤버의 오프셋
4.6.2 cstdlib의 정의
1) exit() : 모든 static객체를 파괴. 버퍼를 방출하며, 모든 I/O채널을 닫고, 프로그램 종료하며 atexit()를
호출함
2) abort() : 어떤 종료작업 없이 프로그램을 바로 종료함
참조 : C++ Standard Library - A tutorial and Reference
댓글