运算符delete可以在内存解除分配期间抛出异常或以其他错误方式发出信号吗?
另一方面,operator delete
可能会失败,在这种情况下它的默认行为是什么?
ISO标准对此有何看法?
例如在Windows操作系统中 - C ++ operator new
和operator delete
通常通过函数HeapAlloc
和HeapFree
实现。后面的函数返回一个布尔值,清楚地表明可能出现故障。想象一下C ++ operator delete
将如何写在它上面:
void operator delete(void *pMem)
{
extern HANDLE hHeap;
extern DWORD dwFlags;
BOOL bSuccee = HeapFree(hHeap, dwFlags, pMem);
//return bSuccee ????????????
}
答案 0 :(得分:3)
在C ++ 11中,18.6 delete被定义为noexcept
函数。从第5.3.5节删除
如果操作数具有类类型,则通过调用上述转换函数将操作数转换为指针类型,并使用转换后的操作数代替本节其余部分的原始操作数。在第一个替代(删除对象)中,delete的操作数的值可以是空指针值,指向由前一个new表达式创建的非数组对象的指针,或指向表示一个子对象的子对象(1.8)的指针。这种对象的基类(第10条)。 如果不是,则行为未定义。在第二个替代(删除数组)中,delete的操作数的值可以是空指针值或由前一个数组new-expression产生的指针值.82 如果不是,则行为未定义。 [注意:这意味着delete-expression的语法必须与new分配的对象的类型匹配,而不是new-expression的语法。 - 注意
强调我的。
从这里我们可以看到使用删除的方式是不打算使用UB。
答案 1 :(得分:1)
自C ++ 11以来,运算符delete
为noexcept
,所以它不会抛出,请参阅http://en.cppreference.com/w/cpp/memory/new/operator_delete
如果操作符delete
抛出,那么你最终可能会抛出析构函数,所有的赌注都会被关闭。