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

Apo*_*hay 3 c++ pointers

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

A* a = new A();
A* b = a;
a = NULL;
Run Code Online (Sandbox Code Playgroud)

"a"和"b"会发生什么?

而且,如果我做了以下事情:

A* a = new A();
A* b = a;
delete a;
Run Code Online (Sandbox Code Playgroud)

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

A* a = new A();
a = NULL;
Run Code Online (Sandbox Code Playgroud)

一个仍然指向一些记忆或它指向什么?

Mat*_*Mat 14

A* a = new A();
A* b = a;
a = NULL;
Run Code Online (Sandbox Code Playgroud)

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

A* a = new A();
A* b = a;
delete a;
Run Code Online (Sandbox Code Playgroud)

之后delete,该对象a,并b使用指向不再存在.ab因此不再有效的指针,并使用自己的价值,你不能做他们什么.特别是,尝试拒绝指针将导致未定义的行为.(但是,如果使它们指向有效对象,则可以重用这些变量.)

A* a = new A();
a = NULL;
Run Code Online (Sandbox Code Playgroud)

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


seh*_*ehe 5

A* a = new A();
A* b = a;
a = NULL;
Run Code Online (Sandbox Code Playgroud)

"a"和"b"会发生什么?

a将为NULL,并且b未经修改

A* a = new A();
A* b = a;
delete a;
Run Code Online (Sandbox Code Playgroud)

*a已被删除,并b变为无效(你不能*b再过去引用b()过去那一点).

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

A* a = new A();
a = NULL;
Run Code Online (Sandbox Code Playgroud)

*a不是删除,所以内存泄漏.内存不能再被释放(除非你在其他地方有一个指针的副本,但代码没有显示).