[shared_ptr과 this]
shared_ptr로 선언된 클래스의 this를 사용하고 싶을 때가 있을 것이다. 하지만 this를 shared_ptr로 감싸는 행위는 위험한데, 결과는 다음과 같다.
#include <iostream>
#include <memory>
class Person
{
public:
Person() { std::cout << "Person 생성" << std::endl; }
~Person() { std::cout << "Person 소멸" << std::endl; }
std::shared_ptr<Person> Getsharedthis() { return std::shared_ptr<Person>(this); }
};
void LeakCheck() { _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); }
int main()
{
LeakCheck();
std::shared_ptr<Person> ptr = std::make_shared<Person>();
std::shared_ptr<Person> obj = ptr->Getsharedthis();
return 0;
}


위의 Getsharedthis() 함수 내부에서 std::shared_ptr<Person>(this)를 호출하여 this 포인터를 shared_ptr로 감싸려고 하지만, this는 일반 포인터이며 해당 포인터로부터 만들어진 shared_ptr은 해당 객체를 관리하는데 필요한 정보를 지니지 않게 된다.
[std:: enable_shared_from_this와 shared_from_this()]
이를 위해 안전하게 this를 활용하는 방법으로 std::enable_shared_from_this를 사용하고 shared_from_this() 함수를 호출하여 객체 자체를 안전하게 shared_ptr로 가져오는 방법이 있다.
#include <iostream>
#include <memory>
class Person : public std::enable_shared_from_this<Person>
{
public:
Person() { std::cout << "Person 생성" << std::endl; }
~Person() { std::cout << "Person 소멸" << std::endl; }
std::shared_ptr<Person> Getsharedthis() { return shared_from_this(); }
};
void LeakCheck() { _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); }
int main()
{
LeakCheck();
std::shared_ptr<Person> ptr = std::make_shared<Person>();
std::shared_ptr<Person> obj = ptr->Getsharedthis();
return 0;
}
'C++' 카테고리의 다른 글
| [C++] 람다 (0) | 2025.05.13 |
|---|---|
| [C++] 캐스팅(Casting) (0) | 2025.05.13 |
| [C++] 스마트 포인터 (0) | 2025.03.21 |
| [C++] 레퍼런스(Reference) (0) | 2025.03.21 |
| [C++] virtual (0) | 2025.03.21 |