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.