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

时间:2015-04-06 16:36:08

标签: c++ winapi iso delete-operator

运算符delete可以在内存解除分配期间抛出异常或以其他错误方式发出信号吗?

另一方面,operator delete可能会失败,在这种情况下它的默认行为是什么?

ISO标准对此有何看法?

例如在Windows操作系统中 - C ++ operator newoperator delete通常通过函数HeapAllocHeapFree实现。后面的函数返回一个布尔值,清楚地表明可能出现故障。想象一下C ++ operator delete将如何写在它上面:

void operator delete(void *pMem)
{
    extern HANDLE hHeap;
    extern DWORD dwFlags;

    BOOL bSuccee = HeapFree(hHeap, dwFlags, pMem);

    //return bSuccee ????????????
}

2 个答案:

答案 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以来,运算符deletenoexcept,所以它不会抛出,请参阅http://en.cppreference.com/w/cpp/memory/new/operator_delete

如果操作符delete抛出,那么你最终可能会抛出析构函数,所有的赌注都会被关闭。