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

Why does deallocation function called with one argument instead of two?

本文关键字:参数 调用 两个 释放 函数 一个 为什么      更新时间:2023-10-16

我一直在试图理解以下行为:

#include <iostream>
#include <cstdlib>
using namespace std;
struct A
{ 
    void operator delete[](void *p)
    {
        cout << "deleten";
        ::operator delete[](p);
    }
    void operator delete[](void *p, size_t t)
    {
        cout << "delete with two argumentsn";
        ::operator delete[](p);
    }
};
int main()
{
    A *a = new A[5];
    delete [] a;
}

演示在本例中,调用带有一个参数的非放置释放函数。但是5.3.6/10 N3797 c++ 14工作草案说:

如果类型是完整的,并且释放函数查找找到了这两者通常的释放函数,只有一个指针形参和一个通常的释放函数,带有指针形参和大小参数,则选择的回收函数为带两个参数

是bug吗?

该规则在c++ 14中是新的,并且您是在c++ 11标准下编译的。指定-std=c++14没有区别,所以可能编译器还没有实现那个特定的规则。这并不奇怪,因为c++ 14还没有正式发布。

所以这是一个新的c++规则,但是我们可以从缺陷报告1788中看到语言可能会更改为以下内容:

要调用的函数按如下方式选择:

  • 如果类型是完整的,并且仅对于第二个选择(delete数组),操作数是指向具有重要析构函数的类类型的指针或该类类型的(可能是多维的)数组,则选择具有两个形参的函数。

  • 否则,不指定选择哪一个回收函数

在N3797的3.7.4.2/2中说:

如果类T有一个名为operator的成员回收函数删除只带一个参数的[],则该函数是一个常规函数(非放置)释放功能。如果类T没有声明这样的操作符delete[],但声明了成员的释放函数名为operator delete[],有两个参数:第二个函数的类型是std::size_t,那么这个函数就是一个常见的回收功能。

因为你只有一个参数delete[]函数,它就是被调用的那个