日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C/C++的內存管理你了解嘛_C 語言

作者:Bitdancing ? 更新時間: 2022-04-06 編程語言

C/C++內存分布

在這里插入圖片描述

int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{
static int staticVar = 1;
int localVar = 1;
int num1[10] = {1, 2, 3, 4};
char char2[] = "abcd";
char* pChar3 = "abcd";
int* ptr1 = (int*)malloc(sizeof (int)*4);
int* ptr2 = (int*)calloc(4, sizeof(int));
int* ptr3 = (int*)realloc(ptr2, sizeof(int)*4);
free (ptr1);
free (ptr3);
}

習題

1. 選擇題:
  選項: A.棧 B.堆 C.數據段(靜態區) D.代碼段(常量區)
  globalVar在哪里?__C__  staticGlobalVar在哪里?__C__
  staticVar在哪里?__C__  localVar在哪里?__A__
  num1 在哪里?__A__
  
  char2在哪里?__A__   *char2在哪里?_A__
  pChar3在哪里?_A___   *pChar3在哪里?__D__
  ptr1在哪里?__A__    *ptr1在哪里?__B__

2. 填空題:(32位程序)
  sizeof(num1) = __40__;  
  sizeof(char2) = __5__;   strlen(char2) = __4__;
  sizeof(pChar3) = __4__;   strlen(pChar3) = __4__;
  sizeof(ptr1) = __4__;

在這里插入圖片描述

1.堆又叫堆棧,非靜態局部變量、函數參數、返回值等等,棧是向下增長的。

2.內存映射段是高效的I/O映射方式,用于裝載一個共享的動態內存庫。用戶可使用系統接口創建共享內存,做進程間通信。

3.堆用于程序運行時動態內存分配,堆是可以向上增長的。

4.數據段 – 存儲全局數據和靜態數據。

5.代碼段 – 可執行的代碼/只讀常量?

C語言中動態內存管理方式

malloc,?calloc,?realloc?的區別?

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

calloc?會初始化, 相當于?malloc?+?memset, 按字節初始化,空間每個字節都初始化為0。
realloc擴容,分為原地擴,異地擴。

C++ 內存管理方式

申請和釋放單個元素的空間,使用new和delete操作符,申請和釋放連續的空間,使用new[]和delete[]。

int* p1 = new int(5); 

動態申請一個int空間,這塊空間初始化為5.

int* p2 = new int[5];

動態申請5個int空間。

int* p3 = new int[5]{1,2,3,4,5};

給上初始值

new和delete操作自定義類型

在申請自定義類型的空間時,new?會調用構造函數,?delete?會調用析構函數,而?malloc?與?free?不會。

operator new?與?operator delete函數

new?和?delete?是用戶進行 動態內存申請 和釋放的操作符,?operator new?和?operator delete?是系統提供的全局函數。
new 在底層調用operator new全局函數來申請空間,delete 在底層通過operator delete全局函數來釋放空間。

  • operator new?:該函數通過?malloc?來申請空間,當?malloc?申請空間成功時直接返回;申請空間失敗,嘗試執行空間不足應對措施,如果改應對措施用戶設置了,則就行申請,否則 跑異常。
  • operator delete:該函數最終是通過free來釋放空間的。?

new和delete的實現原理

1.內置類型

如果申請的是內置類型的空間,?new?和?malloc,?deletefree基本類似,不同的地方是:new/delete申請和釋放的是單個元素的空間。

new[]?和?delete[]?申請的是連續空間,而且new在申請空間失敗時會拋異常,?malloc?會返回?NULL

2.自定義類型

  • new原理

1.調用?operator new?函數申請空間

2.在申請的空間上執行構造函數,完成對象的構造。?

  • delete的原理

1.在空間上執行析構函數,完成對象中資源的清理工作。

2.調用?operator delete?函數釋放對象的空間。

  • ?new T[N]的原理

1.調用operator new[]函數,在operator new[]中實際調用operator new函數完成N個對象空間的申請

2.在申請的空間上執行N次構造函數?

  • delete[]的原理

1.在釋放的對象空間上執行N次析構函數,完成N個對象中資源的清理

2.調用operator delete[]釋放空間,實際在operator delete[]中調用operator delete來釋放空間?

malloc/free和new/delete的區別

malloc/free和new/delete的共同點是:都是從堆上申請空間,并且需要用戶手動釋放。

不同的地方是:

1.malloc和free是函數,new和delete是操作符

2.malloc申請的空間不會初始化,new可以初始化

3.malloc申請空間時,需要手動計算空間大小并傳遞,new只需在其后跟上空間的類型即可

4.malloc的返回值為void*, 在使用時必須強轉,new不需要,因為new后跟的是空間的類型

5.malloc申請空間失敗時,返回的是NULL,因此使用時必須判空,new不需要,但是new需要捕獲異常

6.申請自定義類型對象時,malloc/free只會開辟空間,不會調用構造函數與析構函數,而new在申請空間后會調用構造函數完成對象的初始化,delete在釋放空間前會調用析構函數完成空間中資源的清理

總結

原文鏈接:https://blog.csdn.net/Joy_Cheung666/article/details/122652132

欄目分類
最近更新