shared_ptr에 weak_ptr을 붙이면 할당해제를 안시켜준다고??!

JellyPower·2023년 9월 9일
0

나만 몰랐던 C++

목록 보기
9/11
post-thumbnail

코드를 볼까요?

1번코드 입니다.

	CustomData* allocatedCustomData = new CustomData();
	std::shared_ptr<CustomData> sharedCustomData(allocatedCustomData);

2번코드 입니다.

	std::shared_ptr<CustomData> sharedCustomData = std::make_shared<CustomData>();
  • 자 위 두 개의 코드를 보면 어떤가요? 코드는 좀 달라도 똑같은 기능을 하는 코드처럼 보이죠?
  • 그런데 정말 재밌는 일이 일어납니다.

weak_ptr와 함께 버무려보아요

	std::weak_ptr<CustomData> weakCustomData = sharedCustomData;
  • 위 코드에 weak_ptr을 첨가해봅니다.

  • 1번 코드에 weak_ptr을 첨가하면…

  • sharedCustomData = nullptr; 를 실행하면 메모리 해제가 잘 됐군요?
  • 보세요, shared 포인터 내부에 있는 _Ptr값에 쓰레기값이 잔뜩 들어가있잖아요?

  • 2번 코드에 weak_ptr을 첨가하면…

  • 아니? 왜 메모리해제가 안돼있죠?
  • weakCustomData가 expired는 됐다고 써져있는데 실제로 free는 호출됐지 않았네요?
  • 보세요, _Ptr내부에 0으로 초기화해놓은 값이 그대로 있잖아요?

std::make_shared 의 작동방식

  • std::make_shared도 내부적으로는 결국 malloc을 호출해야 하잖아요?
  • 함수 어셈블리 코드를 보면 48byte크기만큼 메모리를 할당하는군요.
  • 48byte는 어떻게 나온걸까요?
    • 제가 만든 CustomData클래스의 데이터크기 32byte
    • 이를 래핑하고있는shared_ptr이 내부적으로 담고있는 메타 데이터 크기 16byte입니다.
  • 즉, shared_ptr이 담고있는 데이터랑 실제 데이터 내부의 메모리 할당은 동시에 하고 이걸 나눠서 쓴다는 뜻입니다.
  • 그러면 메모리 해제도 동시에 진행돼야겠죠?
  • 근데, weak_ptr이 실제 CustomClass를 레퍼런스 하지 않더라도 shared_ptr의 메타데이터를 내부적으로 레퍼런스 한다면 메모리 해제를 못하겠네요?
  • 그래서 std::make_shared로 생성된 shared_ptrweak_ptr에 의해 참조되고있으면 프로그래머가 생각한대로 메모리 해제가 되지 않는답니다… 이런…

결론

  • std::make_shared로 생성된 shared_ptrweak_ptr에 의해 참조되고있으면 refcount가 0이더라도 메모리가 해제되지 않는다.

코드

#include <memory>

class CustomData {
public:
	int a = 0;
	int b = 0;
	float c = 0;
	float d = 0;
	float e = 0;

	CustomData() {}
	virtual ~CustomData() {};
};

int main() {

	printf("%d", sizeof(CustomData));

//	CustomData* allocatedCustomData = new CustomData();
//	std::shared_ptr<CustomData> sharedCustomData(allocatedCustomData);

	std::shared_ptr<CustomData> sharedCustomData = std::make_shared<CustomData>();

	std::weak_ptr<CustomData> weakCustomData = sharedCustomData;
	sharedCustomData = nullptr;
	weakCustomData.reset();

	return 0;
}

레퍼런스

2018_1128_shared_ptr, weak_ptr작동방식 내부.pdf

profile
게임엔진코드싸개(진)

0개의 댓글