我有一个指向某些数据的指针。现在我创建了一个类似的指针。现在,这个新指针被分配给旧指针。如果我删除旧的会发生什么?
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;
是否仍然指向一些记忆或者它指向什么?
答案 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
之后,a
和b
过去指向的对象不再存在。因此,a
和b
不再是有效的指针,并且您无法对使用其值的人执行任何操作。特别是,尝试拒绝指针将导致未定义的行为。 (但是如果你让它们指向一个有效的对象,你可以重用这些变量。)
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
一直指向A
。 a
指向地址0x0,解除引用会导致段错误。
A* a = new A();
A* b = a;
delete a;
a
和b
都指向A
曾经实例化过的地址空间。现在删除了A
,您既不应该取消引用a
也不应该b
,因为可能段错误。
A* a = new A();
a = NULL;
现在a
指向地址0x0,A
在网络空间中丢失。你泄露了记忆。
那个晚了一点。试。
答案 3 :(得分:1)
@apoorva“如果我将任何新指针指定给a,然后将其设为null,然后删除a。” 它没有任何效果......即你不会释放新A()占用的内存,只是因为a = null并且你试图删除a;现在包含NULL。