1

誰でもC++リファレンスサイトからこのコードを説明できますか:

#include <iostream>
#include <memory>
using namespace std;

int main () {
  auto_ptr<int> p;

  p.reset (new int);
  *p=5;
  cout << *p << endl;

  p.reset (new int);
  *p=10;
  cout << *p << endl;

  return 0;
}
4

2 に答える 2

5

auto_ptrポインタを管理します。reset持っているポインターを削除し、別のものを指します。

したがってauto_ptr p、何も指していない から始めます。を使用するresetnew int、何も削除されず、動的に割り当てられた がポイントされますint。次に、それに 5 を割り当てintます。

次にreset、以前に割り当てられたものを削除してintから、新しく割り当てられintた . 次に、新しい に 10 を割り当てintます。

関数が戻ると、auto_ptrスコープ外になり、デストラクタが呼び出され、最後に割り当てられたものが削除されint、プログラムが終了します。

于 2010-07-17T18:52:57.517 に答える
2

たぶん、例は次のようにより良いでしょう:

struct tester {
   int value;
   tester(int value) : value(value) 
   { std::cout << "tester(" << value << ")" << std::endl; }
   ~tester() { std::cout << "~tester(" << value << ")" << std::endl; }
};
int main() {
   std::auto_ptr<tester> p( new tester(1) ); // tester(1)
   std::cout << "..." << std::endl;
   p.reset( new tester(2) );                 // tester(2) followed by ~tester(1)
   std::cout << "..." << std::endl;
}                                         // ~tester(2)

重要な行は、新しいポインターがリセット メソッドに渡される場所です。出力では、コンストラクターtesterが呼び出され、ポインターがメソッドに渡されることがわかりますreset。自動ポインターは、以前に管理されていたメモリを処理~tester(1)し、出力に表示されているオブジェクトを削除します。同様に、自動ポインタが範囲外になる関数の最後で、保存されたポインタの印刷を処理します。~test(2)

于 2010-07-17T20:29:38.563 に答える