私はこのプログラムを実行しましたが、このauto_ptrが何をするのか、そしてどの基本で値を表示するのかわかりませんでしたか?
int main(int argc,char **argv)
{
int *i= new int;
auto_ptr<int> x(i);
auto_ptr<int>y;
y=x;
count <<x.get()<<endl;
count <<y.get()<<endl;
}
私はこのプログラムを実行しましたが、このauto_ptrが何をするのか、そしてどの基本で値を表示するのかわかりませんでしたか?
int main(int argc,char **argv)
{
int *i= new int;
auto_ptr<int> x(i);
auto_ptr<int>y;
y=x;
count <<x.get()<<endl;
count <<y.get()<<endl;
}
このコードは、最初のauto_ptrオブジェクトのNULLアドレスと、2番目のオブジェクトのNULL以外のアドレスを出力し、割り当て中にソースオブジェクトが参照を失ったことを示します(=)。
auto_ptr
new
スコープの最後(この場合はメインが終了するとき)に割り当てられたメモリを自動的に解放します。ただし、整数が実際の値を受け取ることはないため、この例はかなりばかげています。したがって、ごみが表示されていると想像する必要があります。
これはもう少し明らかになるかもしれません:
int main(int argc,char **argv)
{
int *i= new int;
*i = 5;
auto_ptr<int> x(i);
auto_ptr<int>y;
y=x;
count << *(x.get()) <<endl;
count << *(y.get()) <<endl;
*x.get() = 7;
count << *(x.get()) <<endl;
count << *(y.get()) <<endl;
}
簡単に言うと、auto_ptr
はテンプレート化されたオブジェクトであり、その変数がスコープ外になると、そのデストラクタが呼び出され、それによって取得されたメモリが解放されます。これは、スマートポインタのより単純なバージョンの1つです。
auto_ptrは、それを構成するポインターに対する所有権を引き継ぎます。
すなわち。auto_ptr自体が破棄されると、ポイントされたオブジェクトが自動的に破棄されます。
auto_ptr<int> x(i)
xを自分のものにします
auto_ptr<int> y
yは何も所有しなくなります
y=x
操作により、i*の所有権がxからyに譲渡されます
つまり、yはiを所有し、xは何も所有しません。これは、xが破壊されると何も起こらず、yが破壊されるとiが削除されることを意味します。
このプログラムの場合、auto_ptr
は通常のポインタと似ていますが、次の点が異なります。
delete
、まだ指摘されているオブジェクトですしたがって、x
最初はの値を取りますi
。次に、 (代わりにNULL番兵値を格納することによって)忘れて、覚えておくようにy=x
効果的に要求します。次に、getによって返されたポインタ値を出力すると、の場合はNULL / 0が表示され、の場合はNULL以外の値(一致する)が表示されます。次に、asが戻り、スコープを離れ、 NULL以外のポインタ値が一致するように保持すると、intオブジェクトになり、ヒープメモリが解放されます。x
i
y
i
x
i
y
main()
y
x
y
i
delete
auto_ptr
オブジェクトの所有権を引き継ぎます。注意すべき重要な点は
unique_ptr
これらの理由から、RAII(リソース獲得は初期化)パラダイムと組み合わせて使用される傾向があります。たとえば、auto_ptrに格納せずに変数を割り当てた場合、メモリの削除を自分で管理する必要があります。次の例は、これを2回実行する必要があることを示しています。1回は正常なパスに対して、もう1回は失敗したパスに対してです。
A* p(new A);
try {
....
}
catch (std::exception& e) {
delete p;
return;
}
delete p;
代わりにauto_ptrを使用すると、割り当てられたメモリを削除することを覚えておく必要がなくなります。
auto_ptr<A> p(new A);
try {
....
}
catch (std::exception& e) {
....
}