誰でも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;
}
誰でも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;
}
auto_ptr
ポインタを管理します。reset
持っているポインターを削除し、別のものを指します。
したがってauto_ptr p
、何も指していない から始めます。を使用するreset
とnew int
、何も削除されず、動的に割り当てられた がポイントされますint
。次に、それに 5 を割り当てint
ます。
次にreset
、以前に割り当てられたものを削除してint
から、新しく割り当てられint
た . 次に、新しい に 10 を割り当てint
ます。
関数が戻ると、auto_ptr
スコープ外になり、デストラクタが呼び出され、最後に割り当てられたものが削除されint
、プログラムが終了します。
たぶん、例は次のようにより良いでしょう:
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)