重载新运算符:如何传递大小?

时间:2019-12-09 09:19:46

标签: c++ operator-overloading new-operator

我对此代码有疑问:

#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]);
}

请说明其工作原理。

2 个答案:

答案 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参数不是通用的。