[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

+ Recent posts