我编写的以下代码必须调用放置释放和分配函数.
#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
或者是我的误解?
如果提供了特定于类的释放函数,则除非具有一个或两个参数的特定于类的释放函数可用,否则未通过作用域解析运算符作为前缀的delete-expression格式不正确:
10 - 如果类型完成并且如果释放函数查找同时找到通常的释放函数,只有指针参数和通常的释放函数同时具有指针参数和大小参数,则所选的释放函数应该是具有两个参数的解除分配函数.否则,所选的解除分配函数应该是具有一个参数的函数.
所以你需要:
void operator delete[](void*);
,void operator delete[](void*, size_t);
,或::delete[] a
.