C++中的new 和 operator new 区别

C++中的new 和 operator new 区别

创建新对象时,使用operator new 函数分配内存,然后调用构造函数初始化内存。在这里,new操作符同时执行分配和初始化,而new操作符只执行分配。

让我们看看它们各自是如何工作的。

new关键字

new操作符是一个操作符,表示在堆上分配内存的请求。如果有足够的内存可用,new operator会初始化内存,并将新分配并初始化的内存地址返回给指针变量。当您使用new关键字(normal new)创建类对象时。

  • 对象的内存使用operator new从堆中分配。
  • 调用类的构造函数以正确地初始化此内存。
// CPP program to illustrate 
// use of new keyword
#include<iostream>
using namespace std;
class car
{
    string name;
    int num;
  
    public:
        car(string a, int n)
        {
            cout << "Constructor called" << endl;
            this ->name = a;
            this ->num = n;
        }
  
        void enter()
        {
            cin>>name;
            cin>>num;
        }
  
        void display()
        {
            cout << "Name: " << name << endl;
            cout << "Num: " << num << endl;
        }
};
  
int main()
{
    // Using new keyword
    car *p = new car("Honda", 2017);
    p->display();
}

输出:

Constructor called
Name: Honda
Num: 2017

operator new

Operator new是一个分配原始内存的函数,在概念上有点类似于malloc()。

  • 它是覆盖默认堆分配逻辑的机制。
  • 它不初始化内存i.e构造函数没有被调用。然而,在重载的new返回之后,编译器也会根据需要自动调用构造函数。
  • 也可以全局重载operator new,或者针对特定类重载operator new
// CPP program to illustrate 
// use of operator new
#include<iostream>
#include<stdlib.h>
  
using namespace std;
  
class car
{
    string name;
    int num;
  
    public:
  
        car(string a, int n)
        {
            cout << "Constructor called" << endl;
            this->name = a;
            this->num = n;
        }
  
        void display()
        { 
            cout << "Name: " << name << endl;
            cout << "Num: " << num << endl;
        }
  
        void *operator new(size_t size)
        {
            cout << "new operator overloaded" << endl;
            void *p = malloc(size);
            return p;
        }
  
        void operator delete(void *ptr)
        {
            cout << "delete operator overloaded" << endl;
            free(ptr);
        }
};
  
int main()
{
    car *p = new car("HYUNDAI", 2012);
    p->display();
    delete p;
}

输出:

new operator overloaded
Constructor called
Name:HYUNDAI
Num:2012
delete operator overloaded

new 和 operator new区别

  1. Operator vs function: new既是一个操作符也是一个关键字,而Operator new只是一个函数。
  2. New调用” Operator New “: ” New Operator “调用” Operator New() “,就像+ Operator调用Operator +()一样
  3. Operator new可以重载:Operator new可以重载,就像允许执行定制任务的函数一样。
  4. 内存分配:’ new表达式’调用’ operator new ‘来分配原始内存,然后调用constructor。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程