削除

2012-02-13 7 views
0

これは次のようにheap.Programに割り当てられたオブジェクトのためにこのポインタの欠失があるに関するているが、削除

class Sample{ 
     private: 
       int m_value1; 
       int m_value2; 

     public: 
      Sample(); 
      void setValues(int m_value1, int m_value2); 
      void display(); 
     }; 

Sample::Sample(){ 
       this->m_value1 = 0; 
       this->m_value2 = 0; 
       } 

void Sample::setValues(int m_value1, int m_value2){ 
    this->m_value1= m_value1; 
    this->m_value2 = m_value2; 
    display(); 
    if(this != NULL) 
    { 
      cout <<"Deleting this pointer!"<<endl; 
      delete this; 
      cout <<"this->m_value1 is "<<this->m_value1<<endl; 
      cout <<"this->m_value2 is "<<this->m_value2<<endl; 

    } 
    } 

void Sample::display(){ 
    cout <<"Values are "<<this->m_value1<<" and "<<this->m_value2<<endl; 

    } 

int main(){ 
    Sample *obj1 = new Sample();; 
    obj1->setValues(4,6); 
    obj1->display(); 
    getch(); 
} 

OUTPUT:

Values are 4 and 6 
Deleting this pointer! 
this->m_value1 is 65535 
this->m_value2 is 6 
Values are 65535 and 6 

なぜm_value1の値が一方消えませんそれは他の変数m_value2のままですか? delete this後にメンバ変数へのアクセス

+0

[関連](http://stackoverflow.com/a/7039749/220636) – nabulke

+0

多分あなたは 'this'意味を勉強しなければなりません。 – vulkanino

+1

まず、静的でないメンバ関数の中で 'this'は' NULL'にならないはずです。第二に、あなたは**決して**これを削除するべきではありません!あなたがやっていることは、まだそれに立っている間に橋を裂くことです。 –

答えて

6

は未定義の動作です - 何が予想外の読み取り中のデータ、プログラムがクラッシュまたは何か他のものを含め、発生する可能性があります。オブジェクトが破棄され、割り当てが解除され、無効なポインタを逆参照しようとします。 delete thisが起こったら、メンバー変数にアクセスしようとしないで、メンバー関数を呼び出さずにdon't do anything else (including comparing or casting) to this pointerを呼び出してみてください。

2

なぜ、m_value1の値は、他の変数m_value2のままで消えますか?

あなたがそれを削除した後に、メモリにアクセスしています。つまり、未定義のビヘイビアを呼び出すことになります。 何かが起こる可能性があり、観察は他のものと同じか間違っています。

m_value1が格納されていたメモリの部分が何か他のもののために再利用されていますが、m_value2の格納場所は他のもの(まだ)に使用されていません。

1

operator<<または削除後の処理はおそらくthisで、それ以外のものを上書きするのに十分なメモリが割り当てられません。

しかし、あなたは、特定の結果に依存しないでください行われるべきではありません何かをするとき。

0

危険で予測不可能な出力は、システムのクラッシュなど、期待しました! これが指す場所は直接削除しないでください。その良いプログラミングの練習ではありません。削除後にメモリを使用しないでください。そして、uがアサート()内にそれを置くために持っていても

this != NULL // this will never be NULL if used properly.