2016-10-12 3 views
-1

を指す:ポインタはまだこのコードが与えられる最初のメモリ割り当て

#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を与えていますか?

+5

未定義の振る舞いについては、推論しようとしています。それは無意味です。 – krzaq

+0

"削除した後に望ましい出力を得ることが保証されていないことが分かっています" ...だから、どういう疑問がありますか? – HazemGomaa

+2

この場合、 'i'はゼロになっている可能性が高いので、本当にそうでないときは、最後の' show() 'が最初のオブジェクトのメモリ上で動作していると思います。 'show()'が 'this'ポインタの値を代わりに出力した場合、最後の' show() 'が最初のオブジェクトではなく最後のオブジェクトのメモリに作用していることがわかります。 'this'が有効なオブジェクトを指していないので最後の' show() 'が' i'の値を出力するのは未定義ですが、 'this'自体の値を出力する動作は未定義ではありません。 –

答えて

0

最後ptr->ショー()(return文の前の文)ができます:あなたが前に、したがって、ポインタを削除したので、あなたが言うように

サンプル0

をこれは、たまたま希望の出力を得る保証はありません。最後のptr-> show()は使用しないでください。

+0

削除の代わりに 'nullptr'を割り当てますか?何? – Slava

+0

この場合、予期しない結果を避ける –

+0

メモリリークはどうですか? – Slava

関連する問題