본문 바로가기

C++

std::unique_ptr

#include<iostream>
#include<memory>

class A
{
public:
	A()
	{
		std::cout << "A constructor" << std::endl;
	}
	~A()
	{
		std::cout << "A destructor" << std::endl;
	}
};

class B
{
public:
	std::unique_ptr<A> ptr;
	std::unique_ptr<int[]> arr; // 배열
	std::unique_ptr<char[]> str;
	int n;
public:
	B(int n)
	{
		this->n = n;
		ptr = std::make_unique<A>();
		arr = std::make_unique<int[]>(16); // 배열의 길이
		for (int i = 0; i < 16; i++) {
			arr[i] = n;
		}
		str = std::make_unique<char[]>(16);
		std::cout << "B constructor " << n << std::endl;
	}
	~B()
	{
		std::cout << "B destructor " << n << std::endl;
	}
	
};

int main()
{
	auto bptr = std::make_unique<B>(5);

	std::cout << bptr->n << std::endl;
	std::cout << bptr->arr[7] << std::endl;
	std::cout << std::endl;

	auto bptr1 = std::make_unique<B>(10);
	auto released = bptr.release(); // 실제 포인터 및 소유권을 반환함.
	std::cout << std::endl;
	if (bptr != NULL) {
		std::cout << bptr->n << std::endl;
	}
	else {
		std::cout << "bptr is empty" << std::endl;
	}

	std::cout << std::endl;
	auto bptr2 = std::make_unique<B>(15);

	bptr1.swap(bptr2);
	
	std::cout << bptr1->n << std::endl;
	std::cout << bptr2->n << std::endl;

	std::cout << std::endl;
	//bptr2 = bptr1;			// 소유권이 있으므로 단순 대입 할 수 없음.
	bptr2 = std::move(bptr1);	// 소유권을 이전함.

	std::cout << std::endl;
	strcpy(bptr2->str.get(), "unique_ptr");	// get() 을 통해 소유권을 반납하지 않으면서 포인터에 직접 접근이 가능.
	std::cout << bptr2->str << std::endl;

	//delete released;			// 소유권이 반환된 포인터이므로 직접 해제해야 함.
	return 0;
}

출력

A constructor
B constructor 5
5
5

A constructor
B constructor 10

bptr is empty

A constructor
B constructor 15
15
10

B destructor 10
A destructor
B destructor 15
A destructorA constructor
B constructor 5
5
5

A constructor
B constructor 10

bptr is empty

A constructor
B constructor 15
15
10

B destructor 10
A destructor

unique_ptr
B destructor 15
A destructor

 

설명



'C++' 카테고리의 다른 글

std::filesystem  (0) 2021.10.27
std::shared_ptr  (0) 2021.10.27
std::find()  (0) 2021.10.27
Lvalue & Rvalue  (0) 2021.10.21
형변환 연산자  (0) 2021.10.21