1번코드 입니다.
CustomData* allocatedCustomData = new CustomData();
std::shared_ptr<CustomData> sharedCustomData(allocatedCustomData);
2번코드 입니다.
std::shared_ptr<CustomData> sharedCustomData = std::make_shared<CustomData>();
std::weak_ptr<CustomData> weakCustomData = sharedCustomData;
sharedCustomData = nullptr;
를 실행하면 메모리 해제가 잘 됐군요?_Ptr
값에 쓰레기값이 잔뜩 들어가있잖아요?weakCustomData
가 expired는 됐다고 써져있는데 실제로 free는 호출됐지 않았네요?_Ptr
내부에 0으로 초기화해놓은 값이 그대로 있잖아요?std::make_shared
도 내부적으로는 결국 malloc을 호출해야 하잖아요?CustomData
클래스의 데이터크기 32byteshared_ptr
이 내부적으로 담고있는 메타 데이터 크기 16byte입니다.shared_ptr
이 담고있는 데이터랑 실제 데이터 내부의 메모리 할당은 동시에 하고 이걸 나눠서 쓴다는 뜻입니다.weak_ptr
이 실제 CustomClass
를 레퍼런스 하지 않더라도 shared_ptr
의 메타데이터를 내부적으로 레퍼런스 한다면 메모리 해제를 못하겠네요?std::make_shared
로 생성된 shared_ptr
은 weak_ptr
에 의해 참조되고있으면 프로그래머가 생각한대로 메모리 해제가 되지 않는답니다… 이런…std::make_shared
로 생성된 shared_ptr
은 weak_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;
}