null指向对象内部对象的指针

时间:2013-01-08 11:16:06

标签: c++

我有一个A级

class A
{
  A();
  ~A();

  DoSomething();
}

然后我声明一个对象和指向已分配对象的指针

A Obj;
A* pObj = &Obj;

我发现在DoSomething()里面我将pObj设置为NULL

A::DoSomething()
{ 
    pObj=NULL;
}

所以在一个方法中,我正在杀死指向我自己的指针......这不会崩溃......

注意:我注意到在debbuger 中这是(Obj const)。

我很难理解为什么这不会造成任何形式的腐败。我认为这不安全,但我无法真正理解这种情况的后果。

干杯

4 个答案:

答案 0 :(得分:6)

  

所以在一个方法中,我正在杀死指向我自己的指针......这不会崩溃......

绝对没有理由说它会崩溃。你可以有很多指向对象的指针。他们将一个或多个重置为NULL的事实并不意味着任何不好的事情都会发生。

需要注意两类问题:

  1. 如果在将指针设置为NULL后尝试取消引用,则代码的行为将是未定义的(很可能会崩溃)。
  2. 如果对象是在堆上分配的(你的不是),并且在不调用delete的情况下重置所有指针,那么你就会泄漏内存。

答案 1 :(得分:2)

将pObj视为一张纸上写有地址的纸。如果你烧这张纸,它“指向”的建筑物将保持完整。删除所有引用和指向对象的指针不会自动释放它。

顺便说一下,您甚至可以在类的方法中调用delete this;,它也可以工作,除非您将在删除后尝试访问该实例的成员。但是,当确实需要时,此解决方案应仅用于

请记住,如果它是指向实例的唯一指针,您将无法再访问它,这将导致内存泄漏。

答案 2 :(得分:1)

你的物体保持不变。仅仅指向对象的某些指针已被更改。那不是问题。这是一个可视化:

+---------+
|   Obj   |  <-------- pObj
+---------+

现在你在A::DoSomething内所做的就是删除上图中的箭头。 Obj继续,好像什么也没发生。

答案 3 :(得分:0)

它没有崩溃,因为从实例内部访问不是通过存储在变量pObj中的指针发生的,而是一个内部隐式常量指针,可由{{1}访问}关键字(不是this不是那个变量,它只是一种获取指向实例在内存中实际位置的指针的方法,但它对任何实际应用程序都是一个常量指针。)

因此,当您使用NULL覆盖变量this时,您的对象不会消失,并且对象中的所有内部引用仍然有效,因为它们不依赖于您定义的任何变量,而是由编译器解决,直接引用内存中的实例位置。