C++ 带有delete的指针,该指针不引用动态分配的内存

C++ 带有delete的指针,该指针不引用动态分配的内存,c++,C++,可以将指针与不引用的delete一起使用 动态分配的内存。用一个例子来证明为什么或者为什么不 在我的示例中,我正在这样做: int *ptr; delete [] ptr; 此代码段是未定义的行为,因为它不会初始化指向nullptr的指针 唯一可以与delete运算符一起使用的指针是由new运算符或null指针提供的指针。看 其值必须为null或指向创建的非数组对象的指针 通过新表达式或指向非数组的基子对象的指针 由新表达式创建的对象。如果表达式是其他的, 如果它是通过数组形式获得的指针,则包

可以将指针与不引用的delete一起使用 动态分配的内存。用一个例子来证明为什么或者为什么不

在我的示例中,我正在这样做:

int *ptr; delete [] ptr;

此代码段是未定义的行为,因为它不会初始化指向nullptr的指针

唯一可以与delete运算符一起使用的指针是由new运算符或null指针提供的指针。看

其值必须为null或指向创建的非数组对象的指针 通过新表达式或指向非数组的基子对象的指针 由新表达式创建的对象。如果表达式是其他的, 如果它是通过数组形式获得的指针,则包括 新表达式,行为未定义

删除new未返回且不是null ptr的内容的行为是未定义的。您删除的指针不是new返回的,也不是nullptr,因此程序的行为是未定义的


具有自动存储持续时间的默认初始化指针的值不确定。读取不确定值具有未定义的行为。程序读取指针的不确定值。程序的行为未定义。

如果ptr为NULL,则可能是这样。为什么要将其标记为java和c?这看起来像是测试中传达得很差的真假问题。在这种情况下,测试制作者可能想要的答案是“False”,而正确的答案是“True”。也就是说,可以使用不引用动态分配内存的delete指针,但您可能不喜欢结果。除了使用空指针的特殊情况外,delete的目的是将其与new以前提供的地址一起使用,并为此指定了行为。未指定传递其他指针的行为。请将示例更改为:int*ptr=nullptr;删除[]ptr;VoILA,现在你有一个有效的用例来回答这个问题。@ FIDDLINBITS——在C++中删除空指针也是安全的,它是NO-OP。但是这个例子有不确定的行为,因为它唯一的上下文是可以做int *PTR;删除ptr;在功能块中,否则删除ptr是可诊断的错误-在这种情况下,ptr是自动存储持续时间的未初始化变量,而不是空指针,访问其值会产生未定义的行为。如果删除PTR的行为被更改为FRIPETR,则在C和C++中都是未定义的,因为PTR仍然未初始化。