当我在C++中对未初始化的指针调用"delete"时会发生什么?

And*_*Mpy 7 c++ memory pointers memory-management

假设我声明了一个char的指针,并在没有调用new的情况下调用delete.这会导致问题吗?

char* myptr;

if (condition)
    //do something involving myptr = new char[SIZE];
else
    //do something that doesnt involve myptr

//do more stuff
delete[] myptr;
Run Code Online (Sandbox Code Playgroud)

我不删除if下的myptr,因为//do more stuff如果condition是真的另一个指针可以指向它.显然这是正常的,如果condition是真的,因为呼吁"新" myptr.myptr如果我输入了else条件,那么它是否会被删除myptr

use*_*027 16

这是未定义的行为.指针必须来自new或必须是空指针.

标准(N3797)5.3.5 [expr.delete]/ 2

如果操作数具有类类型,则通过调用上述转换函数将操作数转换为指针类型,并使用转换后的操作数代替本节其余部分的原始操作数.在第一个替代(删除对象)中,delete的操作数的值可以是空指针值,指向前一个新表达式创建的非数组对象的指针,或指向表示一个子对象的子对象(1.8)的指针.这种对象的基类(第10条).如果不是,则行为未定义.
[...]

底部遗漏的部分是相同的delete [].

删除仅对

  • 空指针
  • 你从新的指针
  • 或指向上面的基类指针.

空指针:

要跟进空指针,调用delete空指针是一个noop,之后指针仍然是一个空指针(无需重新分配nullptr给它).至少对于标准delete和释放功能,这是有保证的.如果您定义自定义的,您也应该正确处理.

标准5.3.5 [expr.delete]/ 7

如果delete-expression的操作数的值不是空指针值,则:

  • [...]

否则,未指定是否将调用释放功能.[注意:无论对象的析构函数或数组的某个元素是否引发异常,都会调用释放函数. - 结束说明]

所以delete可能什么也不做,或者可能用空指针调用deallocation函数.让我们看看下一个功能:

标准3.7.4.2 [basic.stc.dynamic.deallocation]/ 3

如果通过抛出异常终止释放函数,则行为未定义.提供给解除分配函数的第一个参数的值可以是空指针值; 如果是这样,并且如果解除分配功能是标准库中提供的功能,则该调用无效.
[...]

明确提到它没有效果.

注意:如果您定义自己的自定义释放函数,则应确保以相同的方式处理它.不正确处理空指针将是邪恶的.

  • @AndrewMpy是的,它定义很好,是一个noop. (3认同)