不调用放置释放功能

8 c++ memory-management c++11

我编写的以下代码必须调用放置释放和分配函数.

#include <iostream>
using namespace std;

struct A
{
    void * operator new [] (size_t t, int, int)
    {
        cout << "3 parameters allocation" << endl;
        return ::operator new[](t);
    }

    void operator delete [] (void *p, int, int)
    {
        cout << "3 parameters deallocation" << endl;
        return ::operator delete[](p);
    }
};

int main() 
{
    A *a = new (5,5) A[10]; //operator new [] (size_t, int, int) invoked
    delete [] a; //Error. Overload resolution is failed.
}
Run Code Online (Sandbox Code Playgroud)

演示

5.3.4/22说N3797:

如果放置分配函数具有相同数量的参数,则放置分配函数的声明与放置分配函数的声明匹配,并且在参数转换(8.3.5)之后,除第一个之外的所有参数类型都相同.如果查找找到单个匹配的释放函数,则将调用该函数; 否则,不会调用解除分配函数.

它没有实现C++11或者是我的误解?

eca*_*mur 9

如果提供了特定于类的释放函数,则除非具有一个或两个参数的特定于类的释放函数可用,否则未通过作用域解析运算符作为前缀的delete-expression格式不正确:

10 - 如果类型完成并且如果释放函数查找同时找到通常的释放函数,只有指针参数和通常的释放函数同时具有指针参数和大小参数,则所选的释放函数应该是具有两个参数的解除分配函数.否则,所选的解除分配函数应该是具有一个参数的函数.

所以你需要:

  • 提供void operator delete[](void*);,
  • 提供void operator delete[](void*, size_t);,或
  • ::delete[] a.

  • §12.5[class.free]/p4可能更相关."如果查找结果不明确或不可访问,或者查找选择了放置重新分配功能,则程序格式错误." (5认同)