【问题标题】:Overloading new operator: How the size will be passed?重载新运算符:大小将如何传递?
【发布时间】:2019-12-09 09:19:46
【问题描述】:

我对这段代码有一个疑问:

#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)和相应的运算符 delete ):en.cppreference.com/w/cpp/memory/new/operator_new
  • 在你的情况下不会。分配数组时,编译器会生成operator new[]() 的调用,而不是operator new()。无论哪种方式,由于编译器可以看到新表达式,它知道正在分配什么以及所需的大小,因此将其传递给它选择的任何分配函数。

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


【解决方案1】:

标准[expr.new]reads:

new-expression 可以通过调用分配函数来获取对象的存储空间。 ... 如果分配的类型是数组类型,则分配函数的名称是 operator new[],而释放函数的名称是 operator delete[]. ... C++ 程序可以提供这些函数的替代定义和/或特定于类的版本。

and1:

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 执行的另一部分工作。

【讨论】:

    【解决方案2】:

    编译器对new 运算符进行大小计算,并且仅对new 运算符进行。对于size_t 参数来说,这不是通用的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2016-03-24
      • 2021-10-02
      • 2018-09-25
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      相关资源
      最近更新 更多