删除此指针

时间:2012-02-13 11:28:40

标签: c++

这是关于删除堆上分配的对象的指针。程序如下,

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();
}

输出:

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会保留?

4 个答案:

答案 0 :(得分:6)

delete this未定义行为之后访问成员变量 - 任何事情都可能发生,包括读取意外数据,程序崩溃或其他任何事情。该对象已被销毁并取消分配,您尝试取消引用无效指针。一旦delete this发生 - 请勿尝试访问成员变量,不要尝试调用成员函数和don't do anything else (including comparing or casting) to this pointer

答案 1 :(得分:2)

  

为什么m_value1的值会消失,而另一个变量m_value2会保留?

删除后,您正在访问内存。这意味着您正在调用未定义的行为。 所以任何事情都可能发生,你的观察与其他事情一样对错。

可能发生的事情是存储m_value1的内存部分被重用于其他内容,而m_value2的存储尚未用于其他内容(尚未)。

答案 2 :(得分:1)

这是一个偶然的问题,可能是operator<<或者删除后this分配足够的内存来覆盖一个而不是另一个。

但是当你做一些不应该做的事情时,你不应该依赖任何特定的后果。

答案 3 :(得分:0)

预计会出现危险和不可预测的输出,包括系统崩溃! 不要直接删除此指向的位置。它不是一个好的编程实践。删除后不要使用内存。即使你必须把它放在一个断言()

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