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