[英]What happens when I call “delete” on an uninitialized pointer in C++?
假设我声明了一个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;
我不删除if下的myptr,因为如果condition
为真, //do more stuff
另一个指针可以指向它。 显然,如果condition
为真,这可以正常工作,因为在myptr
调用了“new”。 如果我输入了myptr
未使用的else条件,是否删除了myptr
?
这是未定义的行为 。 指针必须来自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
如果通过抛出异常终止释放函数,则行为未定义。 提供给解除分配函数的第一个参数的值可以是空指针值; 如果是这样,并且如果解除分配功能是标准库中提供的功能,则该呼叫无效。
[...]
明确提到它没有效果。
注意:如果您定义自己的自定义释放函数,则应确保以相同的方式处理它。 不正确处理空指针将是邪恶的。
如果指针初始化为nullptr
,那么删除它将是安全的。
就目前而言, myptr
未初始化并且试图删除它的值可能会导致分段错误。
char* myptr = nullptr
将在c ++ 11或更高版本中解决此问题,或对c ++ 98或更早版本使用0
或NULL
。
这将是一个未定义的行为。 必须使用new在指针分配内存上调用delete。
但是,您可以安全地调用null指针上的delete。
你可以写得像
char* myptr=NULL;
if (condition)
//do something involving myptr = new char[SIZE];
else
//do something that doesnt involve myptr
//do more stuff
if(myptr)
delete[] myptr;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.