全局分配函数和const void *

时间:2014-06-26 14:31:32

标签: c++ c++11 language-lawyer

根据C ++ 11,下面的代码是否构成“未定义的行为”(由于使用了const_cast,请参阅下面的引用)?

const void* p = operator new(123);
operator delete(const_cast<void*>(p));

C ++ 11标准(3.7.4.2.3)的相关引用:

  

提供给释放函数的第一个参数的值可以是空指针值;如果是这样,并且如果解除分配功能是标准库中提供的功能,则该呼叫没有效果。否则,如果标准库中提供给operator delete(void*)的值不是先前在标准库中调用operator new(std::size_t)operator new(std::size_t, const std::nothrow_t&)返回的值之一,则行为未定义

如果答案是否定的,请提供C ++ 11标准中的引号来确认。

1 个答案:

答案 0 :(得分:4)

这不是未定义的。原因是:

  1. operator new返回void*,因此保证返回可修改的(非常量)内存:[support.dynamic]

    void* operator new(std::size_t size);
    
  2. const_cast如果引用的对象不是const,则抛弃constness是有效的:[expr.const.cast]§7,引用[dcl.type.cv],特别是§3+ 4

      

    3指向cv限定类型的指针或引用不需要实际指向或引用cv限定对象,但它   被视为好像;即使对象,也不能使用const限定的访问路径来修改对象   referenced是一个非const对象,可以通过其他一些访问路径进行修改。

         

    4除了可以修改声明mutable(7.1.1)的任何类成员外,任何修改const的尝试都是如此   对象在其生命周期(3.8)中导致未定义的行为。

  3. const_cast不会修改操作数的值:[expr.const.cast]§3:

      

    ...指针的结果   const_cast指的是原始对象。