C++ 删除对象会将其引用设置为NULL吗?

C++ 删除对象会将其引用设置为NULL吗?,c++,arrays,pointers,memory-management,C++,Arrays,Pointers,Memory Management,我有一个指向指针的指针数组,当我执行array[index]=classpointer时并调用删除类指针,存储在数组[索引]中的值是否会变为空?否。它仍然指向类指针先前指向的位置,或者换句话说,它将挂起。否。它仍然指向类指针先前指向的位置,或者换句话说,它会悬空。不。数组索引总是一个整数(除非你在做一些疯狂的运算符重载)。整数是基元数据类型,基元为NULL是没有意义的 你的意思是,“数组[index]会变为NULL吗?”请参见@Mahesh的答案。否。数组索引始终是整数(除非你正在进行一些疯狂的

我有一个指向指针的指针数组,当我执行
array[index]=classpointer时
并调用
删除类指针
,存储在
数组[索引]
中的值是否会变为空?

否。它仍然指向
类指针
先前指向的位置,或者换句话说,它将挂起。

否。它仍然指向
类指针
先前指向的位置,或者换句话说,它会悬空。

不。数组索引总是一个整数(除非你在做一些疯狂的运算符重载)。整数是基元数据类型,基元为NULL是没有意义的


你的意思是,“数组[index]会变为NULL吗?”请参见@Mahesh的答案。

否。数组索引始终是整数(除非你正在进行一些疯狂的运算符重载)。整数是基元数据类型,基元为NULL是没有意义的


你的意思是“数组[索引]会变为空吗?”请参阅@Mahesh的答案。

要帮助你记住这个问题的答案,请考虑:

T* p = ...;
delete p;
T* p = ...
T* p1 = p;
delete p;
p
delete
之后和它本身离开作用域之前,或者它的成员数据所在的对象被销毁之前,会发生什么情况?没有单一的答案。因此,如果C++采取附加动作将<代码> P<代码>设置为<代码> null <代码>,那么至少有些时候它会浪费精力——设置一个变量,之后立即丢弃。在C++中,一个指导原则是,对于您可能不需要或不需要的特性,没有运行时成本。 此外,考虑:

T* p = ...;
delete p;
T* p = ...
T* p1 = p;
delete p;
突然间,将
p
设置为
NULL
(这似乎使检查指针的有效性变得容易)的想法破灭了。对于编译器来说,知道可能仍然引用刚刚删除的对象的所有其他指针是不实际的,并且在运行时跟踪该信息并将所有指针置零的成本是不切实际的

所以,说得很清楚,如果在

T* p = ...;
delete p;
…将
p
设置为0x12345678,然后在
删除后
p
仍将为0x12345678
delete
从不更改其参数。在该地址访问内存的任何尝试都将导致未定义的行为(当然,除非后续堆分配请求恰好返回相同的地址)

另外,如果您自己设置了指向
NULL
的指针,您可以安全地再次调用
delete
,因此这样做没有任何意义:

if (p != NULL) delete p;

要帮助您记住此问题的答案,请考虑:

T* p = ...;
delete p;
T* p = ...
T* p1 = p;
delete p;
p
delete
之后和它本身离开作用域之前,或者它的成员数据所在的对象被销毁之前,会发生什么情况?没有单一的答案。因此,如果C++采取附加动作将<代码> P<代码>设置为<代码> null <代码>,那么至少有些时候它会浪费精力——设置一个变量,之后立即丢弃。在C++中,一个指导原则是,对于您可能不需要或不需要的特性,没有运行时成本。 此外,考虑:

T* p = ...;
delete p;
T* p = ...
T* p1 = p;
delete p;
突然间,将
p
设置为
NULL
(这似乎使检查指针的有效性变得容易)的想法破灭了。对于编译器来说,知道可能仍然引用刚刚删除的对象的所有其他指针是不实际的,并且在运行时跟踪该信息并将所有指针置零的成本是不切实际的

所以,说得很清楚,如果在

T* p = ...;
delete p;
…将
p
设置为0x12345678,然后在
删除后
p
仍将为0x12345678
delete
从不更改其参数。在该地址访问内存的任何尝试都将导致未定义的行为(当然,除非后续堆分配请求恰好返回相同的地址)

另外,如果您自己设置了指向
NULL
的指针,您可以安全地再次调用
delete
,因此这样做没有任何意义:

if (p != NULL) delete p;

仅当它是一个
std::弱\u ptr
时。正常指针将保持不变。

仅当它是
std::弱\u ptr
时。普通指针将保持不变。

@RandenDavis:指针值将与删除之前的值相同,但取消对该指针的引用将调用。@Randen Davis-否。一旦执行
删除类指针
类指针
指向资源被解除分配。因此,指向
数组[index]
的指针悬空,取消引用会导致未定义的行为。@RandenDavis:指针值将与删除
之前的值相同,但取消引用该指针将调用它。@Randen Davis-否。一旦执行
删除类指针
类指针
指向资源被解除分配。因此,指向
array[index]
的指针悬空,取消引用它会导致未定义的行为。很抱歉,你的问题标题是关于数组作为一个整体是否等于NULL,你的问题本身询问index变量是否变为NULL,对你的问题唯一合理的解释是,你实际上是在问某个数组成员是否变为NULL。在考虑使用指针之前,您需要更加精确!Tom还说,类指针的值存储在数组中,这与您的问题基本无关。它可以保存在任何其他变量中,您也会遇到同样的问题。很抱歉,您的问题标题是数组作为一个整体是否等于NULL,您的问题本身询问索引变量是否变为NULL,对你的问题唯一合理的解释是,你实际上是在问某个数组成员是否变为NULL。在考虑使用之前,你需要更加精确