在 cppreference 示例中带有多个参数的 new

时间:2021-06-08 16:58:26

标签: c++ new-operator

来自 cppreference's new 页。

<块引用>
new T;      // calls operator new(sizeof(T))
           // (C++17) or operator new(sizeof(T), std::align_val_t(alignof(T))))
new T[5];   // calls operator new[](sizeof(T)*5 + overhead)
           // (C++17) or operator new(sizeof(T)*5+overhead, >std::align_val_t(alignof(T))))
new(2,f) T; // calls operator new(sizeof(T), 2, f)
           // (C++17) or operator new(sizeof(T), std::align_val_t(alignof(T)), 2, f)

new(2, f) T; 有什么作用?

2 个答案:

答案 0 :(得分:3)

<块引用>

new(2, f) T; 有什么作用?

placement-new 中的第二个参数可用于将参数传递给您的自定义 T::operator new 实现。

这是一个触发它的玩具示例(在输出中,您可以看到参数 f=42.0 被传递给 T::operator new):

#include <iostream>

struct T {
  T() {
    std::cout << "T::T called\n";
  }

  void* operator new(size_t s, int x, double f) {
    std::cout << "T::new called with s=" << s << ", x=" << x << ", f=" << f << '\n';
    return malloc(x * s);
  }

  char data[512];
};

int main() {
  std::cout << "new T[5]:\n";
  new T[5];

  double f = 42.0;
  std::cout << "\nnew(2, f) T:\n";
  new(2, f) T;
}

输出:

new T[5]:
T::T called
T::T called
T::T called
T::T called
T::T called

new(2, f) T:
T::new called with s=512, x=2, f=42
T::T called

答案 1 :(得分:-4)

小心使用在线示例中的此类技巧,它们通常很糟糕。

C++ 中的 new 关键字是 C 中以下内容的简写。

typedef struct {
    int a;
} Foo;

Foo *makeFoo(int a) {
    Foo *foo = (Foo *)malloc(sizeof(Foo));
    foo->a = a;
}

malloc 函数为该对象保留内存,表明它将用作指针。 new 运算符执行相同的操作,但默认为 sizeof(Foo)。您看到的参数是 sizeofalign_val_t 实例的结果。

相关问题