Modern C++

Modern C++ 강의 정리 – 스마트 포인터 (Smart Pointer)

유니크 포인터 std::unique_ptr<T>

객채에 대한 원시 포인터를 다른 포인터와 공유하지 않는다. Scope를 벗어날 때 해당 객체도 같이 삭제한다.

class Project {
public:
    std::string name{};
};

int main()
{
    Project* project = new Project();
    std::unique_ptr<Project> p1(new Project());
    return 0;
}

unique_ptr에 대해 쓸 수 있는 멤버 함수들이 있다.

reset() – 원시 포인터를 소멸시킴. 인자를 넣어서 새로운 원시 포인터를 할당할 수도 있음.
get() – 원시 포인터를 반환함. 함수에 인자로 넣을 때 쓰기에 좋은 듯함. 물론 함수 호출 후에 필요없으면 std::move를 쓰는게 더 좋음.
release() – 원시 포인터에 대한 소유를 없애고, 원시 포인터를 리턴함.

공유 포인터 std::shared_ptr<T>

다른 객체와 원시 포인터를 공유할 수 있다. 원시 포인터의 객체는 참조 카운트가 0이 될 때 소멸된다. 예를 들어 어떤 프로젝트를 사람에게 할당하는 것을 클래스로 표현하면 다음과 같이 될 수 있다.

class Project {
public:
    std::string name;
    Project(std::string name): name(name) {
    }
};
class Person {
public:
    std::shared_ptr<Project> project;
};

int main()
{
    Project* project = new Project("abc");
    Person p1, p2;
    p1.project.reset(project);
    p2.project = p1.project;
    std::cout << p1.project.get()->name << endl;
    std::cout << p2.project.get()->name << endl;
    return 0;
}

shared_ptr를 사용했을 때 발생하는 문제로는 상호 참조가 있다. 상호 참조를 없애기 위해 weak_ptr를 사용한다.

std::weak_ptr
class B;
class A {
public:
    std::shared_ptr<B> b;
};
class B {
public:
    std::shared_ptr<A> a;
};

int main()
{
    std::shared_ptr<A> a(new A());
    std::shared_ptr<B> b(new B());
    a.get()->b = b;
    b.get()->a = a;
    return 0;
}

위와 같은 경우에서 Main이 종료되었을 때 각 객체의 멤버는 여전히 서로를 참조하기 때문에 각자 레퍼런스 카운트가 1로 객체 소멸이 발생하지 않는다. 이 문제를 해결하기 위해 weak_ptr로 참조를 하게 만든다. 물론 weak_ptr도 lock 메소드를 통해 레퍼런스 카운트를 1 증가시킬 수 있다.


admin

Share
Published by
admin

Recent Posts

2024년 12월 8일 일요일 – 서울 생활 132주차

합격왕 우여곡절 끝에 드디어 합격왕에 광고를 붙였다. 서비스를 시작한지 무려 4년이 지나서야 드디어 광고를 시작하게…

2주 ago

2024년 11월 17일 일요일 – 서울 생활 129주차

괌여행 아내와 함께 괌으로 여행을 갔다. 출산 이후로 둘만 가는 첫 여행이다. 하와이가 일본인들이 많이…

1개월 ago

2024년 11월 3일 일요일 – 서울 생활 127주차

반복적인 일상 매일 아침 일어나 회사에 출근하고, 저녁을 먹고 돌아오는 일상의 반복이다. 주말은 가족을 보러…

2개월 ago

2024년 10월 6일 일요일 – 서울 생활 123주차

Planning A well-structured plan has the following characteristics:   First, the ultimate vision you aim to…

3개월 ago

2024년 9월 29일 일요일 – 서울 생활 122주차

English The most common problem for English learners like myself is that we often use…

3개월 ago

2024년 9월 22일 일요일 – 서울 생활 121주차

추석 추석을 맞아 친가 외가 처가 어르신들을 모두 뵙고 돌아왔다. 아이가 태어난지는 좀 됐지만 한국에서…

3개월 ago

This website uses cookies.