logo

C++ の Unique_ptr

std::unique_ptr は、C++11 で導入されたスマート ポインターです。ヒープ上に動的に割り当てられたリソースを自動的に管理します。スマート ポインターは、広範なバグを防ぐのに役立つ通常の古いポインターの単なるラッパーです。つまり、ポインタの削除を忘れてメモリ リークが発生したり、誤ってポインタを 2 回削除したり、間違った方法で削除したりすることが考えられます。これらは、標準のポインタと同様の方法で使用できます。これらは、一般的なバグを引き起こす手動プロセスの一部を自動化します。

前提条件: C++ のポインター C++ のスマート ポインター。



構文

unique_ptr<  A>ptr1 (新しい A )>>' 

ここ、

unique_ptr を使用するとどうなりますか?

unique_ptr を書くと ptr1 (新しい A)、メモリはデータ型 A のインスタンスのヒープ上に割り当てられます。ptr1 は初期化され、新しく作成された A オブジェクトを指します。ここで、ptr1 は新しく作成されたオブジェクト A の唯一の所有者であり、このオブジェクトの有効期間を管理します。これは、ptr1 がリセットされるかスコープ外になると、メモリが自動的に割り当て解除され、A のオブジェクトが破棄されることを意味します。

unique_ptr をいつ使用するか?

リソースの所有権が必要な場合。リソースの単一または排他的所有権が必要な場合は、一意のポインターを使用する必要があります。 1 つのリソースを指すことができる一意のポインターは 1 つだけです。したがって、ある一意のポインタを別のポインタにコピーすることはできません。また、動的に割り当てられたオブジェクトがスコープ外になった場合の自動クリーンアップが容易になり、メモリ リークの防止に役立ちます。



注: を使用する必要があります。 これらのスマート ポインターを使用するためのヘッダー ファイル。

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->printA();>> > >// displays address of the containing pointer> >cout << p1.get() << endl;> >return> 0;> }>

np.sum

>

出力

A struct.... 0x18dac20>

例 2

次に、別のポインター p2 を作成し、代入演算子 (=) を使用してポインター p1 をコピーしてみます。

C++

Java文字列ビルダー




// 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->printA();>> > >// displays address of the containing pointer> >cout << p1.get() << endl;> > >// will give compile time error> >unique_ptr> p2 = p1;> >p2->printA();>> >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->printA();>> > >// 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->printA();>> >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 は移動セマンティクスを使用します。