[기술면접] CPP
- 예외가 발생해서 함수를 빠져나가더라도, 그 함수의 스택에 정의되어 있는 모든 객체들은 빠짐없이 소멸자가 호출된다.
스마트 포인터
- 포인터는 객체가 아니기 떄문에 소멸자가 호출되지 않는다.
- 포인터를 객체화하여 자신이 소멸될 때 가리키고 있는 데이터도 같이 delete하자
unique_ptr
double free error 방지.
Data* data = new Data();
Date* data2 = data;
// data 의 입장 : 사용 다 했으니 소멸시켜야지.
delete data;
// data2 의 입장 : 나도 사용 다 했으니 소멸시켜야지
delete data2;
복사생성자를 delete함으로서 컴파일 에러 발생.
class A {
public:
A(int a){};
A(const A& a) = delete;
};
shard_ptr
여러 개의 shard_ptr이 하나의 객체를 가리ㅋ
weak_ptr
weak_ptr 는 일반 포인터와 shared_ptr 사이에 위치한 스마트 포인터로, 스마트 포인터 처럼 객체를 안전하게 참조할 수 있게 해주지만, shared_ptr 와는 다르게 참조 개수를 늘리지는 않습니다. 이름 그대로 약한 포인터 인것이지요.
따라서 설사 어떤 객체를 weak_ptr 가 가리키고 있다고 하더라도, 다른 shared_ptr 들이 가리키고 있지 않다면 이미 메모리에서 소멸되었을 것입니다.
이 때문에 weak_ptr 자체로는 원래 객체를 참조할 수 없고, 반드시 shared_ptr 로 변환해서 사용해야 합니다. 이 때 가리키고 있는 객체가 이미 소멸되었다면 빈 shared_ptr 로 변환되고, 아닐경우 해당 객체를 가리키는 shared_ptr 로 변환됩니다.