malloc与new,free与delete
生活随笔
收集整理的這篇文章主要介紹了
malloc与new,free与delete
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
malloc,free是一種庫函數,不能被重載,new和delete是運算符,可以被重載
new和delete內部都調用malloc和free函數
new的三種用法: 1.new,不可以被重載直接new一個對象T* ptr = new T();new一個對象時做了兩件事情 * 調用了operator new申請空間 * 調用了構造函數,如果括號中為空,會調用默認構造函數2.operator new,可以被重載重載形式:必須為void* operator new(size_t n, . . .); 行為類似于malloc,就是申請一段空間重載后new一個對象會調用這個函數3.placement new原地構造一個對象,相當于顯示調用構造函數new (T*) T(args); 使用方式如下:A *pointer = (A*)malloc(sizeof(A));new(pointer)A(10);cout << pointer->i << endl;
delete:類似于new 會首先調用析構函數析構,然后調用free()釋放空間 可以被重載,重載形式如下:void operator delete(void* ptr, . . .);
new[]: 首先調用operator new[]申請n段連續的T空間,然后會調用n次默認構造函數,可以被重載 重載形式如下:void* operator new[](size_t n, . . .); 如果重載了此函數,new[]會調用這個函數
delete[]: 與new[]配套使用,會先調用n次析構函數,然后再釋放空間,可以被重載 重載形式如下:void operator delete[](void* ptr, . . .); 如果重載了此函數,delete[]會調用這個函數。
測試代碼:
#include <iostream> using namespace std; class A { public:A() : i(1) { cout << "A default constructor" << endl; }A(int j) : i(j) { cout << "A constructor" << endl; }~A() { cout << "A destructor" << endl; }int i; };class B { public:B() : i(1) { cout << "B default constructor" << endl; }B(int j) : i(j) { cout << "B constructor" << endl; }~B() { cout << "B destructor" << endl; }void* operator new(size_t n){cout << "B my new" << endl;B* p = (B*)malloc(n);return p;}void* operator new[](size_t n){cout << "B my new[]" << endl;B* p = (B*)malloc(n * sizeof(B));return p;}void operator delete(void* ptr){cout << "B my delete" << endl;free(ptr);}void operator delete[](void* ptr){cout << "B my delete[]" << endl;free(ptr);}int i; };int main() {//---------------------------A---------------------------// A *ptr_A_1 = new A;cout << ptr_A_1->i << endl;delete ptr_A_1;cout << endl;A *ptr_A_2 = new A();cout << ptr_A_2->i << endl;delete ptr_A_2;cout << endl;A *ptr_A_3 = new A(2);cout << ptr_A_3->i << endl;delete ptr_A_3;cout << endl;A *ptr_A_4 = new A[3];auto p = ptr_A_4;for(int i = 0; i < 3; ++i) cout << (p + i)->i << " ";cout << endl;delete[] ptr_A_4;cout << endl;//------------------------B-------------------------// B *ptr_B_1 = new B;cout << ptr_B_1->i << endl;delete ptr_B_1;cout << endl;B *ptr_B_2 = new B();cout << ptr_B_2->i << endl;delete ptr_B_2;cout << endl;B *ptr_B_3 = new B(2);cout << ptr_B_3->i << endl;delete ptr_B_3;cout << endl;B *ptr_B_4 = new B[3];auto p1 = ptr_B_4;for(int i = 0; i < 3; ++i) cout << (p1 + i)->i << " ";cout << endl;delete[] ptr_B_4;cout << endl;return 0; }
new的三種用法: 1.new,不可以被重載直接new一個對象T* ptr = new T();new一個對象時做了兩件事情 * 調用了operator new申請空間 * 調用了構造函數,如果括號中為空,會調用默認構造函數2.operator new,可以被重載重載形式:必須為void* operator new(size_t n, . . .); 行為類似于malloc,就是申請一段空間重載后new一個對象會調用這個函數3.placement new原地構造一個對象,相當于顯示調用構造函數new (T*) T(args); 使用方式如下:A *pointer = (A*)malloc(sizeof(A));new(pointer)A(10);cout << pointer->i << endl;
delete:類似于new 會首先調用析構函數析構,然后調用free()釋放空間 可以被重載,重載形式如下:void operator delete(void* ptr, . . .);
new[]: 首先調用operator new[]申請n段連續的T空間,然后會調用n次默認構造函數,可以被重載 重載形式如下:void* operator new[](size_t n, . . .); 如果重載了此函數,new[]會調用這個函數
delete[]: 與new[]配套使用,會先調用n次析構函數,然后再釋放空間,可以被重載 重載形式如下:void operator delete[](void* ptr, . . .); 如果重載了此函數,delete[]會調用這個函數。
測試代碼:
#include <iostream> using namespace std; class A { public:A() : i(1) { cout << "A default constructor" << endl; }A(int j) : i(j) { cout << "A constructor" << endl; }~A() { cout << "A destructor" << endl; }int i; };class B { public:B() : i(1) { cout << "B default constructor" << endl; }B(int j) : i(j) { cout << "B constructor" << endl; }~B() { cout << "B destructor" << endl; }void* operator new(size_t n){cout << "B my new" << endl;B* p = (B*)malloc(n);return p;}void* operator new[](size_t n){cout << "B my new[]" << endl;B* p = (B*)malloc(n * sizeof(B));return p;}void operator delete(void* ptr){cout << "B my delete" << endl;free(ptr);}void operator delete[](void* ptr){cout << "B my delete[]" << endl;free(ptr);}int i; };int main() {//---------------------------A---------------------------// A *ptr_A_1 = new A;cout << ptr_A_1->i << endl;delete ptr_A_1;cout << endl;A *ptr_A_2 = new A();cout << ptr_A_2->i << endl;delete ptr_A_2;cout << endl;A *ptr_A_3 = new A(2);cout << ptr_A_3->i << endl;delete ptr_A_3;cout << endl;A *ptr_A_4 = new A[3];auto p = ptr_A_4;for(int i = 0; i < 3; ++i) cout << (p + i)->i << " ";cout << endl;delete[] ptr_A_4;cout << endl;//------------------------B-------------------------// B *ptr_B_1 = new B;cout << ptr_B_1->i << endl;delete ptr_B_1;cout << endl;B *ptr_B_2 = new B();cout << ptr_B_2->i << endl;delete ptr_B_2;cout << endl;B *ptr_B_3 = new B(2);cout << ptr_B_3->i << endl;delete ptr_B_3;cout << endl;B *ptr_B_4 = new B[3];auto p1 = ptr_B_4;for(int i = 0; i < 3; ++i) cout << (p1 + i)->i << " ";cout << endl;delete[] ptr_B_4;cout << endl;return 0; }
轉載于:https://www.cnblogs.com/CoderZSL/p/8056656.html
總結
以上是生活随笔為你收集整理的malloc与new,free与delete的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装MariaDB和Apache
- 下一篇: python之metaclass