C++ New::operator new



在C++中,可以使用new关键字在运行时动态分配RAM堆段中的内存。在声明时,会传递一个指定分配内存大小的参数。可以使用new运算符为预设和唯一的数据类型分配内存。

函数运算符new分配原始内存,在概念上与malloc()相同。

  • 它是覆盖默认堆分配逻辑的机制。
  • operator new也可以在全局或特定类中重载。

语法

以下是C++ New::operator new的语法:

void* operator new (std::size_t size) throw (std::bad_alloc);       (throwing allocation)
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) throw();                (nothrow allocation)
void* operator new (std::size_t size, void* ptr) throw(); 

参数

  • size - 包含请求内存块的大小(以字节为单位)。
  • nothrow_value - 包含常量nothrow。
  • ptr - 指向已分配的适当大小的内存块的指针。

示例1

让我们看一下下面的例子,我们将使用operator new并获取输出。

#include <cstdio>
#include <cstdlib>
#include <new>
void* operator new(std::size_t sz) {
   std::printf(" new(size_t), size = %zu\n", sz);
   if (sz == 1)
      ++sz;
   if (void *ptr = std::malloc(sz))
      return ptr;
   throw std::bad_alloc{};
}
int main() {
   int* p1 = new int;
   delete p1;
}

输出

让我们编译并运行上面的程序,这将产生以下结果:

 new(size_t), size = 4

示例2

让我们看一下另一种情况,我们将使用operator new。

#include <iostream>
#include <new>
struct MyClass {
   int data[100];
   MyClass() {
      std::cout << "It constructed [" << this << "]\n";
   }
};
int main () {
   std::cout << "1: ";
   MyClass * p1 = new MyClass;
   std::cout << "2: ";
   MyClass * p2 = new (std::nothrow) MyClass;
   std::cout << "3: ";
   new (p2) MyClass;
   MyClass * p3 = (MyClass*) ::operator new (sizeof(MyClass));
   delete p1;
   delete p2;
   delete p3;
   return 0;
}

输出

运行上述代码后,它将显示如下输出:

1: It constructed [0x5596f5df72c0]
2: It constructed [0x5596f5df7460]
3: It constructed [0x5596f5df7460]

示例3

考虑以下情况,我们将检查operator new的功能。

#include<iostream>
#include<stdlib.h>
using namespace std;
class car {
   string name;
   int num;
   public:
   car(string a, int n) {
      cout << "TutorialsPoint" << endl;
      this->name = a;
      this->num = n;
   }
   void display() {
      cout << "Name: " << name << endl;
      cout << "Num: " << num << endl;
   }
   void *operator new(size_t size) {
      cout << "Welcome" << endl;
      void *p = malloc(size);
      return p;
   }
};
int main() {
   car *p = new car("RX100", 2011);
   p->display();
   delete p;
}

输出

当代码执行时,它将生成如下输出:

Welcome
TutorialsPoint
Name: RX100
Num: 2011
广告