重载New调用自动构造对象

C++: Overloaded New call constructs object automatically

本文关键字:对象 New 调用 重载      更新时间:2023-10-16

我试图重载new操作符,以便分配我自己的内存,但我仍然需要构造对象。这就是为什么我决定通过可变模板传递参数,以便正确地提供对象的构造函数。

在这个例子中构造函数被调用了两次,我无法解释为什么。似乎重载的new会自动调用构造函数。

#include <stdlib.h>
#include <iostream>
#include <new>
class A
{
public:
  template<typename... Args>
  void *operator new(size_t sz, Args ...parameters)
  {
    void *mem = ::operator new(sizeof(A));
    A *var = ::new (mem) A(parameters...);
    return var;
  }
  A() : num(0) { std::cout << "Default" << std::endl; }
  A(int nb) : num(nb) { std::cout << "Integer = " << num << std::endl; }
  const int num;
};
int main()
{
  A *obj = new A(3);
  std::cout << "Obj result = " << obj->num << std::endl;
}

修复,没有理由尝试在重载中调用构造函数,对象将在返回的void*的指定分配内存中构造。

我试图重载new操作符,以便分配我自己的内存,但我仍然需要构造对象。

不,你没有。operator new根据定义初始化对象。参见[expr.new]/15:

创建类型为的对象的new-expression T初始化该对象如下:

—如果省略new-initializer,则对象为default-initialized (8.5);如果未进行初始化,则对象的值不确定。

—否则,新初始化式将根据8.5的直接初始化规则。

您的重载至少可以像这样:

void *operator new(size_t sz)
{
    return ::operator new(sizeof(A));
}

static关键字可选