我对此代码有疑问:
#include <iostream>
#include <stdlib.h>
using namespace std;
void * operator new(size_t size)
{
cout << "New operator overloading " <<"\n";
void * p = malloc(size);
return p;
}
void operator delete(void * p)
{
cout << "Delete operator overloading " <<"\n";
free(p);
}
int main()
{
int n = 3, i;
int * p = new int[3];
for (i = 0; i<n; i++)
p[i]= i;
cout << "Array: ";
for(i = 0; i<n; i++)
cout << p[i] << " ";
cout << endl;
delete p;
}
如何将int[3]
的大小作为参数传递给void * operator new(size_t size)
?
请参见以下代码,该方法将无效:
#include <iostream>
using namespace std;
void sizef(size_t n)
{
cout<<n;
}
int main()
{
sizef(int[5]);
}
请说明其工作原理。
答案 0 :(得分:4)
标准[expr.new] reads:
new-expression 可以通过调用分配函数来获取对象的存储。 ...如果分配的类型是数组类型,则分配函数的名称为
operator new[]
,而释放函数的名称为operator delete[].
... C ++程序可以提供这些函数和/或类的替代定义特定版本。
and 1 :
new T[5]
导致以下调用之一:
operator new[](sizeof(T) * 5 + x)
operator new[](sizeof(T) * 5 + x, std::align_val_t(alignof(T)))
这里,
x
的每个实例都是一个非负的未指定值,表示数组分配开销; new-expression 的结果将从operator new[]
返回的值中减去此数量。 ...从一次调用new
到另一次调用,开销可能会有所不同。
1 请注意,operator new[]
会分配存储空间,它不会构造对象。对象构造和初始化是new
执行的工作的另一部分。
答案 1 :(得分:1)
编译器仅对new
运算符和new
运算符进行大小计算。 size_t
参数不是通用的。