logo

C++의 Unique_ptr

std::unique_ptr은 C++11에 도입된 스마트 포인터입니다. 힙에 동적으로 할당된 리소스를 자동으로 관리합니다. 스마트 포인터는 널리 퍼진 버그를 방지하는 데 도움이 되는 기존 포인터를 감싸는 래퍼일 뿐입니다. 즉, 포인터 삭제를 잊어버리고 메모리 누수를 일으키거나 실수로 포인터를 두 번 삭제하거나 잘못된 방식으로 삭제하는 것입니다. 표준 포인터와 비슷한 방식으로 사용할 수 있습니다. 일반적인 버그를 일으키는 일부 수동 프로세스를 자동화합니다.

전제 조건: C++의 포인터 , C++의 스마트 포인터.



통사론

unique_ptr<  A>ptr1 (새 A )>

여기,

Unique_ptr을 사용하면 어떻게 되나요?

Unique_ptr을 작성할 때 ptr1(새 A), 메모리는 데이터 유형 A의 인스턴스에 대해 힙에 할당됩니다. ptr1은 초기화되고 새로 생성된 A 개체를 가리킵니다. 여기서 ptr1은 새로 생성된 개체 A의 유일한 소유자이며 이 개체의 수명을 관리합니다. 이는 ptr1이 재설정되거나 범위를 벗어나면 메모리가 자동으로 할당 해제되고 A의 객체가 파괴됨을 의미합니다.

언제 Unique_ptr을 사용하나요?

리소스의 소유권이 필요한 경우. 리소스에 대한 단일 또는 독점 소유권을 원할 경우 고유 포인터를 사용해야 합니다. 하나의 고유 포인터만 하나의 리소스를 가리킬 수 있습니다. 따라서 하나의 고유 포인터를 다른 고유 포인터에 복사할 수 없습니다. 또한 동적으로 할당된 개체가 범위를 벗어날 때 자동 정리를 용이하게 하고 메모리 누수를 방지하는 데 도움이 됩니다.



참고: 우리는 스마트 포인터를 사용하기 위한 헤더 파일입니다.

Unique_ptr의 예

예시 1:

구조 A를 생성해 보겠습니다. 그러면 일부 텍스트를 표시하는 printA라는 메서드가 있습니다. 그런 다음 메인 섹션에서 구조 A를 가리키는 고유한 포인터를 만들어 보겠습니다. 따라서 이 시점에는 구조 A의 인스턴스가 있고 p1은 이에 대한 포인터를 보유합니다.

C++






// C++ Program to implement unique_ptr> #include> #include> using> namespace> std;> > struct> A {> >void> printA() { cout <<>'A struct....'> << endl; }> };> > int> main()> {> >unique_ptr p1(> new> A);> >p1->인쇄A();> > >// displays address of the containing pointer> >cout << p1.get() << endl;> >return> 0;> }>

클래스 대 객체 자바

>

>

산출

A struct.... 0x18dac20>

실시예 2

이제 또 다른 포인터 p2를 만들고 할당 연산자(=)를 사용하여 포인터 p1을 복사해 보겠습니다.

C++




// C++ Program to implement unique_ptr> #include> #include> using> namespace> std;> > struct> A {> >void> printA() { cout <<>'A struct....'> << endl; }> };> int> main()> {> >unique_ptr p1(> new> A);> >p1->인쇄A();> > >// displays address of the containing pointer> >cout << p1.get() << endl;> > >// will give compile time error> >unique_ptr> p2 = p1;> >p2->인쇄A();> >return> 0;> }>

산업과 공장
>

>

산출

main.cpp: In function ‘int main()’: main.cpp:18:24: error: use of deleted function ‘std::unique_ptr::unique_ptr(const std::unique_ptr&) [with _Tp = A; _Dp = std::default_delete]’  18 | unique_ptr  p2 = p1;  | ^~ In file included from /usr/include/c++/11/memory:76,  from main.cpp:3: /usr/include/c++/11/bits/unique_ptr.h:468:7: note: declared here  468 | unique_ptr(const unique_ptr&) = delete;  | ^~~~~~~~~~>

위의 코드는 고유 포인터의 경우 포인터 p2를 p1에 할당할 수 없기 때문에 컴파일 시간 오류를 발생시킵니다. 우리는 아래와 같은 목적을 위해 이동 의미론을 사용해야 합니다.

'뱅커'의 알고리즘'

실시예 3

이동 의미론을 사용하여 유형 A의 객체를 관리합니다.

C++




// C++ Program to implement unique_ptr> #include> #include> using> namespace> std;> > struct> A {> >void> printA() { cout <<>'A struct....'> << endl; }> };> int> main()> {> >unique_ptr p1(> new> A);> >p1->인쇄A();> > >// displays address of the containing pointer> >cout << p1.get() << endl;> > >// now address stored in p1 shpould get copied to p2> >unique_ptr> p2 = move(p1);> > >p2->인쇄A();> >cout << p1.get() << endl;> >cout << p2.get() << endl;> >return> 0;> }>

>

>

산출

A struct.... 0x2018c20 A struct.... 0 0x2018c20>

포인터 p1의 주소가 포인터 p2에 복사되면 포인터 p1의 주소는 NULL(0)이 되고 p2에 저장된 주소는 이제 p1에 저장된 주소와 동일하여 p1의 주소가 포인터로 전송되었음을 나타냅니다. p2 이동 의미론을 사용합니다.