#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 |