0

私は c++ が初めてで、stl コンテナーのポインターの処理がわかりにくいと感じています。stlコンテナはポインタをどのように処理しますか?

Point *p1 = new Point(10, 10);
std::vector<Point*> points;
points.push_back(p1);

delete p1; // or delete points[0]

std::cout << points[0]->getID() << "\n"; //why does this still display 10, 10 after deleting above?
std::cout << p1->getID(); //ofcourse, this one will output garbage

//getID method displays xy coordinates given as parameters when object is created
//The result displayed
10, 10
-1, 12337
4

3 に答える 3

1

削除ステートメントの後、解放されたメモリをいつ再利用するかはコンパイラ次第です。したがって、それは未定義の動作です。

于 2013-02-25T06:39:56.640 に答える
1

as 宣言されている場合、コンテナは宣言のようstd::vector<Point*> points;に扱われます。つまり、このコンテキストでPoint* point(new Point(blah));の一致が必要になります。deleteもちろん、a) そのベクター内の値std::vector<Point> points;、または b) スマート ポインターのいずれかを使用する必要があります。ほとんどの場合、前者 (a)。

この場合、あなたは書くでしょうdelete p1;、そして削除されたオブジェクトへのアクセスは未定義の振る舞いです - 削除後のそのオブジェクトへのアクセス/使用は無意味です。プログラムがクラッシュしてエラーを指摘された場合は幸運です。

于 2013-02-25T06:38:13.437 に答える
0

標準ライブラリコンテナは、ポインタに関して特別なことは何もしません。ポインタが動的に割り当てられたオブジェクトを指している場合、これらはある時点で誰かによって削除される必要があります。誰が、いつ、どのようにアプリケーションの詳細に依存するかは異なりますが、通常、スマートポインタを使用してこのプロセスを自動化します。

std::cout << points[0]->getID() << "\n"; //why does this still display 10, 10 after deleting above?

points[0]が削除され、削除されたポインタの逆参照は未定義の動作です。つまり、何かが起こる可能性があるということです。おそらく起こったことは、呼び出しによって解放したメモリがdelete何のためにも再利用されていないため、データがまだそこにあるということです。その振る舞いに頼ることはできません。

于 2013-02-25T06:39:02.607 に答える