C ++ 14是否要求delete表达式必须调用`void operator :: delete(void *,std :: size_t)`而不是`void :: operator delete(void *)`?

时间:2014-07-07 06:00:41

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

根据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*)如果前者存在。

您能否将我推荐到标准草案的正确页面?

1 个答案:

答案 0 :(得分:9)

解除分配函数的选择解释如下:

5.3.5删除[expr.delete]

  

10如果类型完成且解除分配函数查找结果   通常的释放函数,只有一个指针参数和一个   通常的释放函数,包含指针参数和大小   参数,然后选择的释放函数应该是一个   有两个参数。否则,选择解除分配功能   应该是带有一个参数的函数。