欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C/C++的內(nèi)存管理你了解嘛

 更新時間:2022年01月24日 11:49:08   作者:Bitdancing  
這篇文章主要為大家介紹了C/C++的內(nèi)存管理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

C/C++內(nèi)存分布

在這里插入圖片描述

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);
}

習(xí)題

1. 選擇題:
  選項(xiàng): A.棧 B.堆 C.數(shù)據(jù)段(靜態(tài)區(qū)) D.代碼段(常量區(qū))
  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.堆又叫堆棧,非靜態(tài)局部變量、函數(shù)參數(shù)、返回值等等,棧是向下增長的。

2.內(nèi)存映射段是高效的I/O映射方式,用于裝載一個共享的動態(tài)內(nèi)存庫。用戶可使用系統(tǒng)接口創(chuàng)建共享內(nèi)存,做進(jìn)程間通信。

3.堆用于程序運(yùn)行時動態(tài)內(nèi)存分配,堆是可以向上增長的。

4.數(shù)據(jù)段 – 存儲全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù)。

5.代碼段 – 可執(zhí)行的代碼/只讀常量 

C語言中動態(tài)內(nèi)存管理方式

malloc, calloc, realloc 的區(qū)別?

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

calloc 會初始化, 相當(dāng)于 malloc + memset, 按字節(jié)初始化,空間每個字節(jié)都初始化為0。
realloc擴(kuò)容,分為原地擴(kuò),異地擴(kuò)。

C++ 內(nèi)存管理方式

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

int* p1 = new int(5); 

動態(tài)申請一個int空間,這塊空間初始化為5.

int* p2 = new int[5];

動態(tài)申請5個int空間。

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

給上初始值

new和delete操作自定義類型

在申請自定義類型的空間時,new 會調(diào)用構(gòu)造函數(shù), delete 會調(diào)用析構(gòu)函數(shù),而 malloc 與 free 不會。

operator new 與 operator delete函數(shù)

new 和 delete 是用戶進(jìn)行 動態(tài)內(nèi)存申請 和釋放的操作符, operator new 和 operator delete 是系統(tǒng)提供的全局函數(shù)。
new 在底層調(diào)用operator new全局函數(shù)來申請空間,delete 在底層通過operator delete全局函數(shù)來釋放空間。

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

new和delete的實(shí)現(xiàn)原理

1.內(nèi)置類型

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

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

2.自定義類型

  • new原理

1.調(diào)用 operator new 函數(shù)申請空間

2.在申請的空間上執(zhí)行構(gòu)造函數(shù),完成對象的構(gòu)造。 

  • delete的原理

1.在空間上執(zhí)行析構(gòu)函數(shù),完成對象中資源的清理工作。

2.調(diào)用 operator delete 函數(shù)釋放對象的空間。

  •  new T[N]的原理

1.調(diào)用operator new[]函數(shù),在operator new[]中實(shí)際調(diào)用operator new函數(shù)完成N個對象空間的申請

2.在申請的空間上執(zhí)行N次構(gòu)造函數(shù) 

  • delete[]的原理

1.在釋放的對象空間上執(zhí)行N次析構(gòu)函數(shù),完成N個對象中資源的清理

2.調(diào)用operator delete[]釋放空間,實(shí)際在operator delete[]中調(diào)用operator delete來釋放空間 

malloc/free和new/delete的區(qū)別

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

不同的地方是:

1.malloc和free是函數(shù),new和delete是操作符

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

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

4.malloc的返回值為void*, 在使用時必須強(qiáng)轉(zhuǎn),new不需要,因?yàn)閚ew后跟的是空間的類型

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

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

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C++11中列表初始化機(jī)制的概念與實(shí)例詳解

    C++11中列表初始化機(jī)制的概念與實(shí)例詳解

    在我們實(shí)際編程中,我們經(jīng)常會碰到變量初始化的問題,對于不同的變量初始化的手段多種多樣,下面這篇文章主要給大家介紹了關(guān)于C++11中列表初始化機(jī)制的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • C++ 輕量級對象JSON序列化實(shí)現(xiàn)詳情

    C++ 輕量級對象JSON序列化實(shí)現(xiàn)詳情

    本文以jsoncpp庫為基礎(chǔ),設(shè)計(jì)這樣一個可以支持一個函數(shù) 可以一行代碼 unmarshal /marshal 對象,需要的朋友小伙伴可以參考以下
    2021-09-09
  • C++有符號和無符號之間的轉(zhuǎn)換問題

    C++有符號和無符號之間的轉(zhuǎn)換問題

    在開發(fā)中經(jīng)常會遇到有符號和無符號之間的轉(zhuǎn)換問題,如果不清楚問題根源,很難解決bug,今天小編通過本文給大家分享c++有符號無符號轉(zhuǎn)換問題,需要的朋友參考下
    2021-07-07
  • 數(shù)據(jù)結(jié)構(gòu)順序表操作示例

    數(shù)據(jù)結(jié)構(gòu)順序表操作示例

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)順序表操作示例,其中有在第I個元素前插入數(shù)據(jù)x,元素從0開始計(jì)數(shù)、刪除第i個元素,元素從0開始計(jì)數(shù)的方法,需要的朋友可以參考下
    2014-03-03
  • 一篇文章帶你了解C語言二分查找

    一篇文章帶你了解C語言二分查找

    這篇文章主要為大家詳細(xì)介紹了C語言二分查找法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Qt+QWidget實(shí)現(xiàn)簡約美觀的加載動畫

    Qt+QWidget實(shí)現(xiàn)簡約美觀的加載動畫

    這篇文章主要為大家詳細(xì)介紹了Qt如何結(jié)合QWidget實(shí)現(xiàn)簡約美觀的加載動畫,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • C語言之字符串模糊查詢方法的實(shí)現(xiàn)

    C語言之字符串模糊查詢方法的實(shí)現(xiàn)

    本篇文章主要為大家介紹字符串模糊查詢的C語言程序編寫方法,有需要的朋友可以參考下
    2015-07-07
  • C++示例分析內(nèi)聯(lián)函數(shù)與引用變量及函數(shù)重載的使用

    C++示例分析內(nèi)聯(lián)函數(shù)與引用變量及函數(shù)重載的使用

    為了消除函數(shù)調(diào)用的時空開銷,C++ 提供一種提高效率的方法,即在編譯時將函數(shù)調(diào)用處用函數(shù)體替換,類似于C語言中的宏展開。這種在函數(shù)調(diào)用處直接嵌入函數(shù)體的函數(shù)稱為內(nèi)聯(lián)函數(shù)(Inline Function),又稱內(nèi)嵌函數(shù)或者內(nèi)置函數(shù)
    2022-08-08
  • 老生常談C++的單例模式與線程安全單例模式(懶漢/餓漢)

    老生常談C++的單例模式與線程安全單例模式(懶漢/餓漢)

    下面小編就為大家?guī)硪黄仙U凜++的單例模式與線程安全單例模式(懶漢/餓漢)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C++實(shí)現(xiàn)字符串刪除字符后逆序輸出

    C++實(shí)現(xiàn)字符串刪除字符后逆序輸出

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)字符串刪除字符后逆序輸出,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05

最新評論