全局分配函数和const void*

Global allocation functions and const void*

本文关键字:void const 分配 函数 全局      更新时间:2023-10-16

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

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

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

提供给解除分配函数的第一个参数的值可能是空指针值;如果是这样,并且deallocation函数是标准库中提供的函数,则该调用无效。否则,如果提供给标准库中operator delete(void*)的值不是标准库中先前调用operator new(std::size_t)operator new(std::size_t, const std::nothrow_t&)返回的值之一,则行为将被取消定义

如果答案是否定的,请提供C++11标准中的报价来证实这一点。

它不是未定义的。理由是:

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

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

    3指向cv限定类型的指针或引用实际上不需要指向或引用cv限定对象,但它被视为确实如此;const限定的访问路径不能用于修改对象,即使该对象被引用是一个非常量对象,可以通过其他访问路径进行修改。

    4除了声明为mutable(7.1.1(的任何类成员都可以修改外,任何修改常量的尝试对象在其生存期内(3.8(会导致未定义的行为。

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

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