2012-09-07 59 views
0

如果你做到以下几点:删除后哪些指针悬停?

ClassType *foo = new ClassType(); 
ClassType *moo = foo; 
delete foo; 

然后待着,仍然会有悬摆指针或没有?我想过没有,因为你只申报一个“新”,并删除了它,但我想是的......

感谢

+1

使用智能指针,问题消失。 – GManNickG

+0

删除后将指针指向NULL是个好习惯。 foo = NULL – venkysmarty

回答

1

如果你的意思是悬摆指针,是指针moofoo现在是无效的因为它指向的是已经被删除的东西。

+0

foo也是。 –

+0

是的,你是对的 – Jeeva

+0

有没有办法在执行过程中跟踪悬挂指针?除了如果有足够的你的程序会明显慢。编辑:你认真..?你如何摆脱foo? = |它是否因moo = foo而停留? – user1647959

-1

点相同的动态物体上,以创建:

ClassType *foo = new ClassType(); 

所以,如果你删除富也是“被删除”,或者成为一个空指针。

+3

“空指针”是什么意思? – jrok

+0

一个指向空白的指针。 – Giggi

+4

一个不常见的术语。它仍然指向相同的地址,而不是在调用“delete”之前,这只是在那里没有有效的对象。它不会称之为“空”,而是“摇摆”。 – jrok

3

您创建了一个对象并将其删除。 你的指针仍然指向先前被该对象占用的内存地址,但该对象被删除,通常这是一个悬挂指针的公认定义 - 指向一些不再包含活动对象的内存的定义。

没有内存泄漏,并且您的程序不会导致问题除非您尝试通过任一指针访问现在已删除的对象。

使用类似std :: shared_ptr或std :: unique_ptr的内容可以帮助您以更安全的方式管理内存。

+0

最后一段是错误的。例如,悬挂'shared_ptr'非常容易。 –

+0

你如何做到这一点,而不是为了达到目的?如果是这样的话,我会编辑我的评论当然。 – jcoder

+0

问题是:你如何避免它?你需要特殊的逻辑才能从'this'创建一个'shared_ptr'(并且在OO设计中,很多指向对象的指针将从'this'派生出来)。当然,在一个真正的面向对象设计中,许多对象会为自己的一生负责,为了响应某些外部刺激,“删除它”。 –

2

在C++中,delete运算符调用给定参数的析构函数,并将new分配的内存返回给堆。期。它什么都不做,这就意味着你的指针指向堆上的一个位置,只是指向那个刚被解除分配的内存位置。所以那些指针变量仍然包含它以前指向的那些地址。这被称为'悬挂指针'。现在如果您在delete之后指定了 - moofooNULL,您将能够识别指针是否指向有效位置或NULL。