C++ 操作符删除失败,如果不能,为什么?

AnA*_*ons 3 c++ winapi iso delete-operator

在内存解除分配期间,操作符删除是否可以抛出异常或以其他方式发出错误信号?

换句话说,是否有可能operator delete失败,在这种情况下它的默认行为是什么?

ISO 标准对此有何规定?

例如,在 Windows 操作系统中 - C++operator newoperator 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 ????????????
}
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 5

在 C++11 18.6 中,delete 被定义为noexcept函数。从第 5.3.5 节删除

\n\n
\n

如果操作数是类类型,则通过调用上述转换函数将操作数转换为指针类型,并在本节的其余部分中使用转换后的操作数代替原始操作数。在第一个替代方案(删除对象)中,delete 操作数的值可以是空指针值、指向由先前的 new 表达式创建的非数组对象的指针,或者指向表示 a 的子对象 (1.8) 的指针。此类对象的基类(第 10 条)。如果不是,则行为未定义。在第二种选择(删除数组)中,delete 操作数的值可以是空指针值或由前一个数组 new-expression 产生的指针值。82如果不是,则行为未定义。[注意:这意味着delete表达式的语法必须与new分配的对象的类型匹配,而不是new表达式的语法。\xe2\x80\x94结束注

\n
\n\n

强调我的

\n\n

由此我们可以看出,以不应该使用的方式使用delete是UB。

\n