C++インテリジェントポインタテンプレートクラス
2480 ワード
ポインタの欠陥
欠陥を発見したかもしれませんremodel関数は呼び出されるたびにメモリを申請しますが、回収されません.これにより、メモリが漏洩します.解決策はreturn文の前にメモリを解放する文を追加することです.
しかし、次のような状況に遭遇すると、メモリを解放するのを忘れてしまう可能性があります.
プログラムに異常が発生した場合、throwは直接ジャンプを実現し、delete文は実行されず、メモリは解放されません.よく使われるスマートポインタクラス=================この問題を解決するために、STLは3種類のスマートポインタテンプレートを設計しました:auto_ptr、unique_ptrとshared_ptr.このようなオブジェクトにnewで得られたアドレスを割り当てることができる.スマートポインタテンプレートを使用するには、まずヘッダファイルmemoryを含める必要があります.
以下に、変更したremodel関数を示します.
各スマートポインタは1つのコードブロックに格納され、コードブロックを離れるとポインタが期限切れになります.インテリジェント・ポインタ・テンプレート・クラスの定義により、インテリジェント・ポインタ・オブジェクトの多くの態様が、構造メンバーにアクセスでき、同じタイプを指す一般的なポインタに値を割り当てるなど、一般的なポインタと同様であることが決定されます.3つのスマートポインタの応用範囲===================================================================
付与文では、p 2がstringオブジェクトの所有権を引き継ぐと、p 1の所有権が奪われる.これは、p 1とp 2の構造関数が同じオブジェクトを破棄することを防止するためのスマートポインタの特性です.しかし、プログラムがその後p 1オブジェクトを使用しようとすると、エラーが発生します.unique_ptrとshared_ptrはそれぞれ2つの異なる方法でこの問題を解決した.unique_でptrでは、付与文にエラーメッセージが表示されます.プログラムがunique_をptrが別のものに割り当てられた場合、ソースunique_ptrは一時的な右値であり、すぐに破棄され、無効なデータにアクセスする機会がなく、コンパイラはエラーを報告しません.割り当てに固執し、コンパイラがエラーを報告する場合はmove関数を使用しますが、オブジェクト間の関係をうまく処理する必要があります.
そしてshared_ptrは、このような問題をよりスマートに解決する.shared_ptrは、特定のオブジェクトを参照するスマートポインタの数を追跡します.これが参照数になります.値を付与した場合、ポインタカウント+1、ポインタが期限切れの場合、カウント-1.最後のポインタが期限切れになった場合にのみdeleteが呼び出されます.プログラムが同じオブジェクトを指す複数のポインタを使用する場合は、shared_を選択します.ptr.1つのポインタ配列でデータを指示し、特定の要素(最大最小値)をいくつかのポインタで示すのを補助します.この場合shared_ptrが必要です.他の場合、同じオブジェクトを指すポインタを複数必要としない場合はunique_ptrが推奨されます.実際にはC++11でauto_ptrは廃棄されています.
using std::string;
void remodel(string &str) {
string *ps = new string (str);
str = *ps;
return ;
}
欠陥を発見したかもしれませんremodel関数は呼び出されるたびにメモリを申請しますが、回収されません.これにより、メモリが漏洩します.解決策はreturn文の前にメモリを解放する文を追加することです.
delete ps;
しかし、次のような状況に遭遇すると、メモリを解放するのを忘れてしまう可能性があります.
using std::string;
void remodel(string &str) {
string *ps = new string (str);
if(wrong()) {//we get something wrong
throw exception();
}
str = *ps;
delete ps;
return;
}
プログラムに異常が発生した場合、throwは直接ジャンプを実現し、delete文は実行されず、メモリは解放されません.よく使われるスマートポインタクラス=================この問題を解決するために、STLは3種類のスマートポインタテンプレートを設計しました:auto_ptr、unique_ptrとshared_ptr.このようなオブジェクトにnewで得られたアドレスを割り当てることができる.スマートポインタテンプレートを使用するには、まずヘッダファイルmemoryを含める必要があります.
#include
以下に、変更したremodel関数を示します.
using std::string;
using std::auto_ptr;
void remodel(string &str) {
auto_ptr ps (new string (str));
if(wrong())
throw exception();
str = *ps;
return;
}
各スマートポインタは1つのコードブロックに格納され、コードブロックを離れるとポインタが期限切れになります.インテリジェント・ポインタ・テンプレート・クラスの定義により、インテリジェント・ポインタ・オブジェクトの多くの態様が、構造メンバーにアクセスでき、同じタイプを指す一般的なポインタに値を割り当てるなど、一般的なポインタと同様であることが決定されます.3つのスマートポインタの応用範囲===================================================================
auto_ptr p1(new string("auto"));
auto_ptr p2;
p2 = p1;
付与文では、p 2がstringオブジェクトの所有権を引き継ぐと、p 1の所有権が奪われる.これは、p 1とp 2の構造関数が同じオブジェクトを破棄することを防止するためのスマートポインタの特性です.しかし、プログラムがその後p 1オブジェクトを使用しようとすると、エラーが発生します.unique_ptrとshared_ptrはそれぞれ2つの異なる方法でこの問題を解決した.unique_でptrでは、付与文にエラーメッセージが表示されます.プログラムがunique_をptrが別のものに割り当てられた場合、ソースunique_ptrは一時的な右値であり、すぐに破棄され、無効なデータにアクセスする機会がなく、コンパイラはエラーを報告しません.割り当てに固執し、コンパイラがエラーを報告する場合はmove関数を使用しますが、オブジェクト間の関係をうまく処理する必要があります.
unique_ptr p1(new string("unique"));
unique_ptr p2;
p2 = move(p1);
そしてshared_ptrは、このような問題をよりスマートに解決する.shared_ptrは、特定のオブジェクトを参照するスマートポインタの数を追跡します.これが参照数になります.値を付与した場合、ポインタカウント+1、ポインタが期限切れの場合、カウント-1.最後のポインタが期限切れになった場合にのみdeleteが呼び出されます.プログラムが同じオブジェクトを指す複数のポインタを使用する場合は、shared_を選択します.ptr.1つのポインタ配列でデータを指示し、特定の要素(最大最小値)をいくつかのポインタで示すのを補助します.この場合shared_ptrが必要です.他の場合、同じオブジェクトを指すポインタを複数必要としない場合はunique_ptrが推奨されます.実際にはC++11でauto_ptrは廃棄されています.