日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

malloc与new,free与delete

發布時間:2024/9/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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; }

轉載于:https://www.cnblogs.com/CoderZSL/p/8056656.html

總結

以上是生活随笔為你收集整理的malloc与new,free与delete的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。