【问题标题】:Does C++14 require that the delete expression must call `void operator ::delete(void*, std::size_t)` instead of `void ::operator delete(void*)`?C++14 是否要求删除表达式必须调用 `void operator ::delete(void*, std::size_t)` 而不是 `void ::operator delete(void*)`?
【发布时间】:2014-07-07 06:00:40
【问题描述】:

根据this

void operator delete  (void*);                                    (1)   
void operator delete[](void*);                                    (2)   
void operator delete  (void*, const std::nothrow_t&);             (3)   
void operator delete[](void*, const std::nothrow_t&);             (4)   
void operator delete(void*, std::size_t)                          (5)
void operator delete[](void*, std::size_t)                        (6)
void operator delete(void*, std::size_t, const std::nothrow_t&)   (7)
void operator delete[](void*, std::size_t, const std::nothrow_t&) (8)

(5-8) 如果用户定义的替换被调用而不是 (1-4) 假如。标准库实现与 (1-4) 相同。

我相信引用的陈述是正确的;但是,我无法根据草案 C++14 标准 n3797 进行确认。

我检查了 3.7.4 和 18.6,没有发现明确要求删除表达式必须调用 void ::operator delete(void*, std::size_t) 而不是 void ::operator delete(void*)(如果前者存在)。

您能否将我引至标准草案的正确页面?

【问题讨论】:

    标签: c++ memory-management new-operator c++14


    【解决方案1】:

    释放函数的选择在:

    5.3.5 删除[expr.delete]

    10 如果类型是完整的并且如果释放函数查找找到 一个只有一个指针参数的通常的释放函数和一个 带有指针参数和大小的常用释放函数 参数,则选择的释放函数应为 有两个参数。否则,选择的释放函数 应该是一个参数的函数。

    【讨论】:

      猜你喜欢
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      • 2018-06-23
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多