글
unique_ptr과 shard_ptr를 사용하려면 먼저 아래처럼 헤더 파일을 추가해야 합니다.
#include <memory>
struct TEST
{
TEST() {}
~TEST() {}
};
1. unique_ptr 동적 배열 사용
std::unique_ptr<TEST[]> pTest( new TEST[2] );
템플릿 부분에 동적 배열임을 알려줘야 합니다.
2. shard_ptr 동적 배열 사용
std::shared_ptr<TEST> pTest( new TEST[2], std::default_delete<TEST[]>() );
unique_ptr과 조금 다릅니다. 템플릿 부분에는 일반적인 타입을 선언해주면 됩니다. 다만 deleter 부분에 동적 배열임을 선언해줘야 합니다.
3. unique_ptr 사용 중 할당된 객체의 메모리 해제
std::unique_ptr<TEST> pTest( new TEST );
pTest.reset(nullptr);
unique_ptr이 소멸되기 전에 할당된 객체의 메모리를 해제 할 때는 reset을 사용하면 간편합니다.
원래 reset은 다른 객체로 바꿀 때 사용하는 것인데 이런 용도로 사용해도 좋습니다
< 테스트 코드 >
#include <memory>
#include <iostream>
struct TEST
{
TEST()
{
std::cout << "TEST 생성자" << std::endl;
}
~TEST()
{
std::cout << "TEST 소멸자" << std::endl;
}
};
int main()
{
std::cout << "unique_ptr - 동적 배열 사용" << std::endl;
{
std::unique_ptr<TEST[]> pTest( new TEST[2] );
}
std::cout << std::endl;
std::cout << "shared_ptr - 동적 배열 사용" << std::endl;
{
std::shared_ptr<TEST> pTest( new TEST[2], std::default_delete<TEST[]>() );
}
std::cout << std::endl;
std::cout << "unique_ptr - reset 사용" << std::endl;
{
std::unique_ptr<TEST> pTest( new TEST );
std::cout << "unique_ptr - reset 사용 전" << std::endl;
pTest.reset(nullptr);
std::cout << "unique_ptr - reset 사용 후" << std::endl;
}
return 0;
}
댓글
reset(nullptr)을 쓸 필요 없이 그냥 아규먼트를 생략하고 reset() 를 사용하는것도 가능합니다
그런 방법도 있군요^^