std::unique_ptr は、C++11 で導入されたスマート ポインターです。ヒープ上に動的に割り当てられたリソースを自動的に管理します。スマート ポインターは、広範なバグを防ぐのに役立つ通常の古いポインターの単なるラッパーです。つまり、ポインタの削除を忘れてメモリ リークが発生したり、誤ってポインタを 2 回削除したり、間違った方法で削除したりすることが考えられます。これらは、標準のポインタと同様の方法で使用できます。これらは、一般的なバグを引き起こす手動プロセスの一部を自動化します。
前提条件: C++ のポインター 、 C++ のスマート ポインター。
構文
unique_ptr< A>ptr1 (新しい A )>>'ここ、
- unique_ptr : std::unique_ptr の型を指定します。この場合、タイプ A のオブジェクトです。
- 新しいA : タイプ A のオブジェクトは、new 演算子を使用してヒープ上に動的に割り当てられます。
- ptr1 : これは std::unique_ptr 変数の名前です。
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 は移動セマンティクスを使用します。