Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除此指针_C++ - Fatal编程技术网

C++ 删除此指针

C++ 删除此指针,c++,C++,这是关于删除堆上分配的对象的指针。程序如下: class Sample{ private: int m_value1; int m_value2; public: Sample(); void setValues(int m_value1, int m_value2); void display(); }; Sample::

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

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

为什么m_value1的值消失,而其他变量m_value2的值保持不变?

删除后访问成员变量这是未定义的行为-任何情况都可能发生,包括读取意外数据、程序崩溃或其他任何情况。对象已被销毁并取消分配,您试图取消引用无效指针。一旦发生删除,不要尝试访问成员变量,不要尝试调用成员函数和

为什么m_value1的值消失,而另一个变量m_value2的值保持不变

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


可能发生的情况是,存储m_value1的内存部分被重新用于其他用途,而存储m_value2的内存尚未用于其他用途。

这是一个偶然的问题,可能是操作员预期的危险和不可预测的输出,包括系统崩溃! 不要删除此文件直接指向的位置。这不是一个好的编程实践。删除后不要使用内存。即使你必须把它放在断言里

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

也许你必须研究一下这个含义。首先,在一个非静态成员函数中,这个值不应该为NULL。其次,你不应该删除这个!你所做的就像是拆掉了一座桥,却仍然站在桥上。@JoachimPileborg删除这个并没有什么错;这实际上是一个相当普遍的习语。当然,通常的规则是适用的:一旦删除了对象,对它的任何访问都是未定义的行为。无论访问是通过这个指针还是其他指针,都不会改变任何事情。
this != NULL // this will never be NULL if used properly.