[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 |