を指す:ポインタはまだこのコードが与えられる最初のメモリ割り当て
#include <iostream>
using namespace std;
class samp
{
int i;
public:
samp(int i)
{
this->i=i;
}
void show()
{
cout << "Sample" <<" "<<i <<endl;
}
};
int main()
{
samp* ptr ;
for(int i=0;i<10;i++)
{
ptr = new samp(i);
ptr->show();
delete ptr;
}
ptr->show();
return 0;
}
ptr
10個の異なるsamp
タイプのオブジェクトを指すように定義されます。私はそれを削除した後、希望の出力を得る保証はありません。しかし、再びこのプログラムを実行すると、再びptr
はまだ非常に最初のオブジェクトと最後ptr->show()
(return
文の前の文)を指していることを示してはいます:
Sample 0
しかし、ループの最後の時点で、ptr
を指しました。それが最後のptr->show()
(return statement
前の文)ということになっているので、10番目のオブジェクトは、与える必要があります:
Sample 9
を
なぜそれはまだSample 0
の代わりSample 9
を与えていますか?
未定義の振る舞いについては、推論しようとしています。それは無意味です。 – krzaq
"削除した後に望ましい出力を得ることが保証されていないことが分かっています" ...だから、どういう疑問がありますか? – HazemGomaa
この場合、 'i'はゼロになっている可能性が高いので、本当にそうでないときは、最後の' show() 'が最初のオブジェクトのメモリ上で動作していると思います。 'show()'が 'this'ポインタの値を代わりに出力した場合、最後の' show() 'が最初のオブジェクトではなく最後のオブジェクトのメモリに作用していることがわかります。 'this'が有効なオブジェクトを指していないので最後の' show() 'が' i'の値を出力するのは未定義ですが、 'this'自体の値を出力する動作は未定義ではありません。 –