在内存解除分配期间,操作符删除是否可以抛出异常或以其他方式发出错误信号?
以其他方式是否有可能operator delete
失败,在这种情况下它的默认行为是什么?
ISO 标准对此有何规定?
例如在 Windows 操作系统中 - C++operator new
and operator delete
通常通过函数实现HeapAlloc
and HeapFree https://msdn.microsoft.com/en-us/library/windows/desktop/aa366701(v=vs.85).aspx。后面的函数返回一个布尔值,清楚地表明可能会失败。想象一下 C++ 如何operator delete
上面会写着:
void operator delete(void *pMem)
{
extern HANDLE hHeap;
extern DWORD dwFlags;
BOOL bSuccee = HeapFree(hHeap, dwFlags, pMem);
//return bSuccee ????????????
}
在 C++11 18.6 中,删除被定义为noexcept
功能。从第 5.3.5 节删除
如果操作数是类类型,则通过调用上述转换函数将操作数转换为指针类型,并在本节的其余部分中使用转换后的操作数代替原始操作数。在第一个替代方案(删除对象)中,delete 操作数的值可以是空指针值、指向由先前的 new 表达式创建的非数组对象的指针,或者指向表示 a 的子对象 (1.8) 的指针。此类对象的基类(第 10 条)。如果不是,则行为未定义。在第二种选择(删除数组)中,delete 操作数的值可以是空指针值或由前一个数组 new-expression 产生的指针值。82如果不是,则行为未定义。 [注意:这意味着delete表达式的语法必须与new分配的对象的类型匹配,而不是new表达式的语法。 ——尾注
emphasis mine
由此我们可以看出,以不应该使用的方式使用delete是UB。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)