C++学习之详解new和delete

    技术2025-08-31  15

    很多时候我们在函数内部创建了对象,并且希望在函数返回后仍然使用这些对象。运算符负责创建这些对象。运算符delete负责销毁他们。new分配的对象位于自由存储之上或在动态内存中。 获取内存空间 自由存储运算符new、delete、new[]和delete[]的实现

    void* operator new(size_t); void operator delete(void *p); void *operator new[](size_t); void operator delete[](void *p);

    重载New和Delete运算符 new和delete运算符也可以像C ++中的其他运算符一样重载。New和Delete运算符可以全局重载,也可以在特定类中重载。

    如果使用类的成员函数将这些运算符重载,则意味着仅对于该特定类,这些运算符才重载。如果重载是在类外部完成的(即它不是类的成员函数),则只要您使用这些运算符(在类内或类外),都将调用重载的“ new”和“ delete”。这是全局超载。

    默认情况下,重载的new和delete运算符函数都是静态成员。因此,他们无权访问this指针。

    #include<iostream> #include<stdlib.h> using namespace std; class student { string name; int age; public: student() { cout<< "first Constructor is called\n" ; } student(string name, int age) { cout<< "second Constructor is called\n" ; this->name = name; this->age = age; } void display() { cout<< "Name:" << name << endl; cout<< "Age:" << age << endl; } void * operator new(size_t size) { cout<< "Overloading new operator with size: " << size << endl; void * p = ::new student(); //void * p = malloc(size); will also work fine return p; } void operator delete(void * p) { cout<< "Overloading delete operator " << endl; free(p); } ~student(){ cout<<"distractor is called\n"; } }; int main() { student * p = new student("Yash", 24); p->display(); delete p; }

    通过上面的截图,我们可以看出student * p = new student("Yash", 24);函数调用顺序是operator new->::new Student->Student()->student(string name, int age) ,并且operator new中的size是通过编译器在编译过程中获得的。 下面是将new运载符中的void * p = ::new student(); 替换成void * p = malloc(size);,发现在void * p = ::new student();主要作用是分配内存和执行构造函数。 new和delete运算符的全局重载

    #include<iostream> #include<stdlib.h> using namespace std; void * operator new(size_t size) { cout << "New operator overloading " << endl; void * p = malloc(size); return p; } void * operator new[](size_t size) { cout << "New [] operator overloading " << endl; void * p = malloc(size); return p; } void operator delete(void * p) { cout << "Delete operator overloading " << endl; free(p); } void operator delete[](void * p) { cout << "Delete [] operator overloading " << endl; free(p); } int main() { int n = 5, 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 * q = new int{}; delete q; }

    通过截图可以发现,全局new和delete主要作用是分配内存,

    Processed: 0.017, SQL: 9