我有一个A级
class A
{
A();
~A();
DoSomething();
}
然后我声明一个对象和指向已分配对象的指针
A Obj;
A* pObj = &Obj;
我发现在DoSomething()里面我将pObj设置为NULL
A::DoSomething()
{
pObj=NULL;
}
所以在一个方法中,我正在杀死指向我自己的指针......这不会崩溃......
注意:我注意到在debbuger 中这是(Obj const)。
我很难理解为什么这不会造成任何形式的腐败。我认为这不安全,但我无法真正理解这种情况的后果。
干杯
答案 0 :(得分:6)
所以在一个方法中,我正在杀死指向我自己的指针......这不会崩溃......
绝对没有理由说它会崩溃。你可以有很多指向对象的指针。他们将一个或多个重置为NULL的事实并不意味着任何不好的事情都会发生。
需要注意两类问题:
delete
的情况下重置所有指针,那么你就会泄漏内存。答案 1 :(得分:2)
将pObj视为一张纸上写有地址的纸。如果你烧这张纸,它“指向”的建筑物将保持完整。删除所有引用和指向对象的指针不会自动释放它。
顺便说一下,您甚至可以在类的方法中调用delete this;
,它也可以工作,除非您将在删除后尝试访问该实例的成员。但是,当确实需要时,此解决方案应仅用于 。
请记住,如果它是指向实例的唯一指针,您将无法再访问它,这将导致内存泄漏。
答案 2 :(得分:1)
你的物体保持不变。仅仅指向对象的某些指针已被更改。那不是问题。这是一个可视化:
+---------+
| Obj | <-------- pObj
+---------+
现在你在A::DoSomething
内所做的就是删除上图中的箭头。 Obj
继续,好像什么也没发生。
答案 3 :(得分:0)
它没有崩溃,因为从实例内部访问不是通过存储在变量pObj
中的指针发生的,而是一个内部隐式常量指针,可由{{1}访问}关键字(不是this
不是那个变量,它只是一种获取指向实例在内存中实际位置的指针的方法,但它对任何实际应用程序都是一个常量指针。)
因此,当您使用NULL覆盖变量this
时,您的对象不会消失,并且对象中的所有内部引用仍然有效,因为它们不依赖于您定义的任何变量,而是由编译器解决,直接引用内存中的实例位置。