对象实例可以安全地将“this”指针置空吗?

时间:2009-07-30 19:54:32

标签: c++

Class A
{
  public:
    NullIt()
    {
      this = NULL;
    }

    Foo()
    {
      NullIt();
    }
}

A * a = new A;
a->Foo();

assert(a);  //should assert here

有没有办法实现这种效果,将内存泄漏放在一边?

6 个答案:

答案 0 :(得分:6)

你想要实现什么效果?

即使您可以将新指针(或NULL)分配给“this”(您不能),也不会影响指针“a”。

答案 1 :(得分:5)

没有。对象对它的外部引用一无所知(在本例中为“a”),因此无法更改它们。

如果您希望来电者忘记您的对象,那么您可以这样做:

class MyClass
{
    void Release(MyClass **ppObject)
    {
        assert(*pObject == this);   // Ensure the pointer passed in points at us
        *ppObject = NULL;           // Clear the caller's pointer
    }
}


MyClass *pA = new A;
pA->Release(&pA);
assert(pA);               // This assert will fire, as pA is now NULL

当你调用Release时,你将你持有的指针传递给对象,并将其NULL化,这样在调用之后,你的指针就是NULL。

(Release()也可以“删除这个;”以便它同时破坏自己)

答案 2 :(得分:4)

this是一个常量指针。您可以更改它指向的内容但不能更改指针本身。

正如评论中所指出的那样,你可以将const投射掉,但即使你改变它,它也只是一个局部变量。它不会影响实际的外部参考。

答案 3 :(得分:1)

我看不出你有什么理由想要这样做。它会导致内存泄漏,因为a可能会在没有任何指针的情况下浮动。而且我几乎可以肯定你不能分配给this,主要是因为它没有任何意义。你为什么要这样做?

答案 4 :(得分:1)

想想为什么以下内容无法满足您的需求:

A *a = new A;
A *b = a;
a = NULL;
assert(b);

你会明白为什么将其设置为NULL将不起作用。

答案 5 :(得分:1)

'this'指针只是代码所在对象实例的地址。不允许设置this = null;,因为它没有意义。这似乎是你在寻找

Class A
{
  public:
    ~A
   {
      // clean up A
   }
}

A * a = new A;
delete a;

assert(a);  //should assert here

这将从内存中释放实例。但是,如果你对a有任何其他引用,那些指针仍将指向该实例的位置(不好!)并且需要设置为null。