2

私はこのプログラムを実行しましたが、この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;
}
4

6 に答える 6

8

このコードは、最初のauto_ptrオブジェクトのNULLアドレスと、2番目のオブジェクトのNULL以外のアドレスを出力し、割り当て中にソースオブジェクトが参照を失ったことを示します(=)。

于 2011-05-27T04:07:59.813 に答える
1

auto_ptrnewスコープの最後(この場合はメインが終了するとき)に割り当てられたメモリを自動的に解放します。ただし、整数が実際の値を受け取ることはないため、この例はかなりばかげています。したがって、ごみが表示されていると想像する必要があります。

これはもう少し明らかになるかもしれません:

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;
}
于 2011-05-27T04:05:49.437 に答える
1

簡単に言うと、auto_ptrはテンプレート化されたオブジェクトであり、その変数がスコープ外になると、そのデストラクタが呼び出され、それによって取得されたメモリが解放されます。これは、スマートポインタのより単純なバージョンの1つです。

于 2011-05-27T04:08:08.423 に答える
1

auto_ptrは、それを構成するポインターに対する所有権を引き継ぎます。

すなわち。auto_ptr自体が破棄されると、ポイントされたオブジェクトが自動的に破棄されます。

auto_ptr<int> x(i)xを自分のものにします

auto_ptr<int> yyは何も所有しなくなります

y=x操作により、i*の所有権がxからyに譲渡されます

つまり、yはiを所有し、xは何も所有しません。これは、xが破壊されると何も起こらず、yが破壊されるとiが削除されることを意味します。

于 2011-05-27T04:08:44.697 に答える
1

このプログラムの場合、auto_ptrは通常のポインタと似ていますが、次の点が異なります。

  • スコープ外になるとdelete、まだ指摘されているオブジェクトです
  • あるauto_ptrオブジェクトから別のオブジェクトにコピーすると、コピー元のオブジェクトは、追跡していたオブジェクトを「忘れる」ことになります。

したがって、x最初はの値を取りますi。次に、 (代わりにNULL番兵値を格納することによって)忘れて、覚えておくようにy=x効果的に要求します。次に、getによって返されたポインタ値を出力すると、の場合はNULL / 0が表示され、の場合はNULL以外の値(一致する)が表示されます。次に、asが戻り、スコープを離れ、 NULL以外のポインタ値が一致するように保持すると、intオブジェクトになり、ヒープメモリが解放されます。xiyixiymain()yxyidelete

于 2011-05-27T04:09:01.933 に答える
0

auto_ptrオブジェクトの所有権を引き継ぎます。注意すべき重要な点は

  • 内部に保持されているオブジェクトを削除します
  • auto_ptrsをコピー/割り当てると、所有権が譲渡されます
  • c ++ 0xでは非推奨になり、次のように置き換えられます。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) {
    ....
}
于 2011-05-27T04:26:58.860 に答える