为什么用一个参数而不是两个参数调用deallocation函数?

时间:2014-07-24 17:37:44

标签: c++ memory-management

我一直试图了解以下行为:

#include <iostream>
#include <cstdlib>

using namespace std;

struct A
{ 
    void operator delete[](void *p)
    {
        cout << "delete\n";
        ::operator delete[](p);
    }

    void operator delete[](void *p, size_t t)
    {
        cout << "delete with two arguments\n";
        ::operator delete[](p);
    }
};

int main()
{
    A *a = new A[5];
    delete [] a;
}

demo

在示例中,调用一个参数的非放置重新分配函数。但是5.3.6 / 10 N3797 C ++ 14工作草案说:

  

如果类型已完成且释放函数查找同时找到两者   通常的释放函数,只有一个指针参数和一个   通常的释放函数,包含指针参数和大小   参数,然后选择的释放函数应该是一个   有两个参数

这是一个错误吗?

3 个答案:

答案 0 :(得分:5)

该规则是C ++ 14中的新规则,您可以根据C ++ 11标准进行编译。指定-std=c++14没有区别,所以推测编译器还没有实现该特定规则。这并不特别令人惊讶,因为C ++ 14还没有正式发布。

答案 1 :(得分:1)

所以这是一个新的C ++ 1y规则,但我们可以从defect report 1788看到该语言可能会更改为以下内容:

  

要调用的函数选择如下:

  • 如果类型是完整的,并且对于第二个替代(删除数组),操作数是指向具有非平凡析构函数或其(可能是多维)数组的类类型的指针,选择具有两个参数的函数。

  • 否则,未指定选择了哪两个释放函数。

答案 2 :(得分:0)

在N3797的3.7.4.2/2中,它说:

  

如果类T具有名为operator的成员释放函数   删除[]只有一个参数,那么该函数是通常的   (非放置)释放功能。如果T类没有声明   这样的运算符delete []但确实声明了成员释放   函数名为operator delete [],正好有两个参数,即   其中第二个类型为std :: size_t,那么这个函数是通常的   释放功能。

由于你有单个参数delete []函数,那就是被调用的函数。