将指针指定为NULL时会发生什么?

时间:2011-10-04 12:50:13

标签: c++ pointers

我有一个指向某些数据的指针。现在我创建了一个类似的指针。现在,这个新指针被分配给旧指针。如果我删除旧的会发生什么?

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

“a”和“b”会发生什么?

此外,如果我做了以下事情:

A* a = new A();
A* b = a;
delete a;

而且我想知道当我们分配时指针会发生什么。

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

是否仍然指向一些记忆或者它指向什么?

4 个答案:

答案 0 :(得分:14)

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

在此之后,b仍然指向第一行中分配的对象。 a现在没有任何意义。您仍然可以通过b指针“使用”该对象,并可以通过delete b;删除该对象。
你可以delete a;在这里 - 它没有效果(因为a是NULL),但它是安全的,不会导致未定义的行为。

A* a = new A();
A* b = a;
delete a;

delete之后,ab过去指向的对象不再存在。因此,ab不再是有效的指针,并且您无法对使用其值的人执行任何操作。特别是,尝试拒绝指针将导致未定义的行为。 (但是如果你让它们指向一个有效的对象,你可以重用这些变量。)

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

您刚刚泄露了第一行中创建的对象。 a不再指向任何内容,并且您没有该对象的句柄,因此您无法删除它。所以,这是一个普通的旧内存泄漏 (与第一种情况一样,你可以在delete a;行之后a = NULL;,但它没有效果,内存仍然泄露。)

答案 1 :(得分:5)

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

“a”和“b”会发生什么?

a将为NULL,b未经修改

A* a = new A();
A* b = a;
delete a;

*a已被删除,b无效(您不得再过度引用b(*b))。

  

而且我想知道当我们分配时指针会发生什么。

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

*a 已删除,因此内存泄露。内存不能再被释放(除非你在其他地方有一个指针副本,但代码没有显示)。

答案 2 :(得分:2)

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

b一直指向Aa指向地址0x0,解除引用会导致段错误。

A* a = new A();
A* b = a;
delete a;

ab都指向A曾经实例化过的地址空间。现在删除了A,您既不应该取消引用a也不应该b,因为可能段错误。

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

现在a指向地址0x0,A在网络空间中丢失。你泄露了记忆。


那个晚了一点。试。

答案 3 :(得分:1)

@apoorva“如果我将任何新指针指定给a,然后将其设为null,然后删除a。” 它没有任何效果......即你不会释放新A()占用的内存,只是因为a = null并且你试图删除a;现在包含NULL。