当我们分配指针 NULL 时会发生什么

What will happen when we assign a pointer NULL?

本文关键字:什么 NULL 我们 分配 指针      更新时间:2023-10-16

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

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

A"和"B"会发生什么?

此外,如果我执行以下操作:

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

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

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

A 仍然指向某个记忆还是什么都不指向?

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不再指向任何内容,并且您没有该对象的句柄,因此无法删除它。所以,这是一个普通的旧内存泄漏。
(与第一种情况一样,您可以在a = NULL;行之后delete a;,但它不会有任何影响,内存仍然泄漏。

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 (。

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

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

*a不会被删除,因此内存会泄漏。内存无法再释放(除非您在其他地方有指针的副本,但代码没有显示(。

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

b一直指向A. a点来解决0x0,取消引用它将导致段错误。

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

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

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

现在a解决0x0的要点,A在网络空间中消失了。你泄露了记忆。


那个有点晚

了。 再次。

@apoorva "如果我将任何新指针分配给 a 然后使 a 为 null 怎么办。然后删除 a。它不会有任何效果。即您不会释放新 A(( 占用的内存,仅仅是因为 a=null 并且您正在尝试删除 a;现在包含空。