반응형
- 스마트 포인터
- 다른 타입의 포인터 역할을 하는 객체
- 구현 원리
- ->, * 연산자 재정의를 통해 포인터 처럼 보이게 함
- * 연산자 재정의 할때는 반드시 참조 리턴
- 장점
- 객체이므로 생성자/복사생성자/대입연산자/소멸자 등을 통해서 생성/복사/대입/소멸의 과정을 제어 가능
- 소멸자에서 동적 할당 자원 해지
스마트 포인터 직접 구현
class Car
{
public:
void Go() { std::cout << "Go" << std::endl; }
~Car() { std::cout << "~Car" << std::endl; }
};
class SPtr // Car 포인터를 소유한 객체(스마트 포인터)
{
Car* ptr;
public:
SPtr(Car* p = 0) : ptr(p) {}
Car* operator->() { return ptr; }
Car& operator*() { return *ptr; }
};
int main()
{
SPtr p = new Car; // SPtr p( new Car ) 원리
p->Go(); // (p.operator->())->Go() 원리
(*p).Go(); // (p.operator*())->Go() 원리
}
스마트 포인터 직접 구현<템플릿 버전>
- 아래의 코드도 얕은 복사(Shallow Copy) 이슈는 있음
// 다양한 데이터 타입 지원을 위한 템플릿 활용
template<typename T>
class SPtr
{
T* ptr;
public:
SPtr(T* p = 0) : ptr(p) {}
~SPtr() { delete ptr; }
T* operator->() { return ptr; }
T& operator*() { return *ptr; }
void print() { std::cout << *ptr << std::endl; }
};
int main()
{
SPtr<int> p1 = new int; // SPtr<int> p( new int ) 원리
*p1 = 10;
p1.print();
}
C++ 표준 스마트 포인터 사용
- Shared_ptr
- C++ 표준 스마트 포인터
- <memory> 헤더
- 참조 계수 기반으로 구현됨
- 주의사항
- shared_ptr<Car> p1 = new Car; // error
- shared_ptr<Car> p1 ( new Car ); // ok
- explicit 생성자 때문에 = 사용 불가
#include <iostream>
#include <memory> // shared_ptr을 사용하기 위해
class Car
{
public:
void Go() { std::cout << "Go" << std::endl; }
~Car() { std::cout << "~Car" << std::endl; }
};
int main()
{
std::shared_ptr<Car> p(new Car); // = 생성자는 지원하지 않음
p->Go();
}
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 연산자 재정의 활용(String 클래스 만들기) (0) | 2019.05.11 |
---|---|
C++ 대입 연산자(assignment) (0) | 2019.05.10 |
C++ 증감 연산자(++, --) (0) | 2019.05.10 |
C++ 함수 객체(Function Object) (0) | 2019.05.10 |
C++ 연산자 재정의 - cout, endl 원리 (2) | 2019.05.08 |