본문 바로가기

C++/STL

std::enable_shared_from_this

[1. 개요]

std::enable_shared_from_this<T> 를 상속한 클래스 (여기서 템플릿 T는 상속한 클래스를 말함) 는

멤버 함수 내에서 shared_from_this() 를 호출하여 자기 자신에 대한 shared_ptr 을 생성 할 수 있다.

 

이것이 주로 활용되는 시점은 다음과 같다.

  • 콜백에서 자기 자신을 공유해야 할 때 (재참조 할 때)
  • 자기 자신을 다른 shared_ptr 구조로 넘겨야 할 때
  • 기타...

shared_ptr 을 공유한다는 의미는 아래와 같다.

  • 실제 객체는 하나임
  • 그러나 여러 곳에서 참조하게 됨
  • 그래서 더 이상 참조하는 곳이 없어지게 되면 해당 객체는 자동 소멸하게 됨.

그래서, 콜백에서 자기 자신을 공유해야 한다는 것은 아래와 같은 의미가 있다.

  • 일반적으로 콜백이라 함 은  특정 이벤트 발생 시 실행 할 작업
  • 즉, 실행 시점에 객체가 소멸되지 않고 남아있음을 보장 할 수 없다.
  • 따라서, shared_ptr 을 이용해 참조 카운터를 기준으로 객체의 소멸 시점을 결정하여,
  • 콜백 시점에 해당 객체가 존재하고 있음을 명확히 할 수 있다.

[2. 예제]

#include <iostream>
#include <memory>

class MyClass : public std::enable_shared_from_this<MyClass> {
public:
    void printSelf() {
        std::shared_ptr<MyClass> self = shared_from_this();  // 안전하게 shared_ptr 생성
        std::cout << "MyClass instance at: " << self.get() << "\n";
    }

    void doSomething() {
        // 다른 객체에 자기 자신을 shared_ptr로 전달
        auto self = shared_from_this();
        std::cout << __FUNCTION__ << " at: " << self.get() << "\n"; 
        // 예: 콜백 등록 등
    }
};

int main() {
    // 반드시 shared_ptr로 생성해야 한다!
    std::shared_ptr<MyClass> obj = std::make_shared<MyClass>();
    obj->doSomething();
    obj->printSelf();

    return 0;
}

 

'C++ > STL' 카테고리의 다른 글

std::thread vs std::async  (0) 2025.05.01
std::packaged_task  (0) 2025.05.01
std::stringstream  (0) 2025.04.24
erase 계열 함수...  (0) 2025.02.11
map 과 unordered_map 의 차이점.  (0) 2024.10.23