Class A
{
public:
NullIt()
{
this = NULL;
}
Foo()
{
NullIt();
}
}
A * a = new A;
a->Foo();
assert(a); //should assert here
有没有办法实现这种效果,将内存泄漏放在一边?
答案 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。