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

實(shí)例代碼分析c++動(dòng)態(tài)分配

 更新時(shí)間:2020年06月02日 16:38:52   作者:晟夏的葉  
這篇文章主要介紹了c++動(dòng)態(tài)分配的的相關(guān)資料,文中代碼簡(jiǎn)單易懂,方便大家更好的學(xué)習(xí)參考,感興趣的朋友可以了解下

1. c語(yǔ)言中動(dòng)態(tài)分配和釋放

在c中,申請(qǐng)動(dòng)態(tài)內(nèi)存是使用malloc和free,這兩個(gè)函數(shù)是c的標(biāo)準(zhǔn)庫(kù)函數(shù),分配內(nèi)存使用的是系統(tǒng)調(diào)用,使用它們必須包含stdlib.h,才能編譯通過(guò)。

malloc后需要檢查內(nèi)存是否分配成功,free則要在指針不為空的情況下才能進(jìn)行。

示例代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
 char *p = (char*)malloc(10);
 if ( p == NULL)
 {
 printf("error\n");
 }
 strncpy(p, "23456", sizeof(p)-1);
 printf("p=%s\n", p);
 if ( p != NULL)
 {
 free(p);
 p = NULL;
 }
 return 0;
}

2. c++動(dòng)態(tài)分配和釋放

c++中,申請(qǐng)動(dòng)態(tài)內(nèi)存是使用new和delete,這兩個(gè)關(guān)鍵字實(shí)際上是運(yùn)算符,并不是函數(shù)。

需要注意的是:new的不是數(shù)組的話,則直接delete就好,并且只會(huì)調(diào)用一次析構(gòu)函數(shù),而new[]的話,則需使用delete[]來(lái)釋放,并且數(shù)組中每一個(gè)元素都會(huì)調(diào)用一次析構(gòu)函數(shù),調(diào)用完析構(gòu)函數(shù)再釋放內(nèi)存。

3. new/delete的底層實(shí)現(xiàn)

對(duì)于基本數(shù)據(jù)類型(無(wú)需構(gòu)造函數(shù))而言new是重載了new運(yùn)算符,調(diào)用了operator new,復(fù)雜數(shù)據(jù)類型則在此基礎(chǔ)上還會(huì)調(diào)用構(gòu)造函數(shù),而operator new里面則是調(diào)用的malloc函數(shù),如果調(diào)用malloc失敗,則直接拋出異常;

對(duì)于基本數(shù)據(jù)類型(無(wú)需析構(gòu)函數(shù))而言delete是重載了delete運(yùn)算符,調(diào)用了operator delete,復(fù)雜數(shù)據(jù)類型則在此基礎(chǔ)上還會(huì)調(diào)用析構(gòu)函數(shù),而operator delete里面則是調(diào)用的free函數(shù)。

4. new[]/delete[]的底層實(shí)現(xiàn)

簡(jiǎn)單數(shù)據(jù)類型(包括基本數(shù)據(jù)類型和不需要析構(gòu)函數(shù)的類型)
對(duì)于簡(jiǎn)單數(shù)據(jù)類型而言,new[]調(diào)用的是operator new[],計(jì)算出數(shù)組總大小之后調(diào)用operator new。值得一提的是,可以通過(guò)()初始化數(shù)組為零值,實(shí)例:

char* p = new char[32]();

等同于:

char *p = new char[32];
memset(p,0, 32);

簡(jiǎn)單數(shù)據(jù)類型時(shí)delete[]則和delete一樣,沒(méi)區(qū)別。

復(fù)雜數(shù)據(jù)類型

對(duì)于復(fù)雜數(shù)據(jù)類型而言new[]先調(diào)用operator new[]分配內(nèi)存,然后在指針的前四個(gè)字節(jié)寫入數(shù)組大小,最后看分配了多少個(gè)元素就調(diào)用多少次構(gòu)造函數(shù),之所以要在前4個(gè)字節(jié)寫入數(shù)組大小,是因?yàn)獒尫艃?nèi)存之前會(huì)調(diào)用每個(gè)對(duì)象的析構(gòu)函數(shù)。但是編譯器并不知道p實(shí)際所指對(duì)象的大小。如果沒(méi)有儲(chǔ)存數(shù)組大小,編譯器就不知道應(yīng)該調(diào)用幾次析構(gòu)函數(shù);
new[]分配的內(nèi)存只能由delete[]釋放,如果由delete釋放會(huì)崩潰,為什么會(huì)崩潰呢?

假設(shè)指針p指向new[]分配的內(nèi)存,因?yàn)橐?字節(jié)存儲(chǔ)數(shù)組大小,實(shí)際分配的內(nèi)存地址為[p-4],系統(tǒng)記錄的也是這個(gè)地址,delete[]實(shí)際釋放的就是p-4指向的內(nèi)存,而delete會(huì)直接釋放p指向的內(nèi)存,這個(gè)內(nèi)存根本沒(méi)有被系統(tǒng)記錄,所以會(huì)崩潰。

5. c++中new失敗了怎么辦

根據(jù)前面new實(shí)現(xiàn)原理說(shuō)的,C++里,如果new分配內(nèi)存失敗,默認(rèn)是拋出異常的。所以,如果分配成功,p == NULL就絕對(duì)不會(huì)成立;而如果分配失敗了,也不會(huì)執(zhí)行 if ( p == NULL ),因?yàn)榉峙涫r(shí),new 就會(huì)拋出異常跳過(guò)后面的代碼。如果你想檢查 new 是否成功,應(yīng)該捕捉異常:

try {
    int* p = new int[SIZE];
   // 其它代碼
} catch ( const bad_alloc& e ) {
   return -1;
}

當(dāng)然,標(biāo)準(zhǔn) C++ 亦提供了一個(gè)方法來(lái)抑制 new 拋出異常,而返回空指針,如下:

int* p = new (std::nothrow) int; // 這樣如果 new 失敗了,就不會(huì)拋出異常,而是返回空指針
if ( p == NULL ) // 像這樣,這個(gè)判斷就有意義了
return -1;

6. delete失敗時(shí)是什么現(xiàn)象,一般是因?yàn)槭裁丛?/strong>

delete失敗可能是因?yàn)閮?nèi)存在之前已經(jīng)delete過(guò)一次了,再次delete就會(huì)失敗,linux下報(bào)錯(cuò):double free or corruption,已放棄。

7. placement new的使用

placement new用于在已經(jīng)分配好的內(nèi)存上,再進(jìn)行二次分配,具體實(shí)現(xiàn)如下:

//假設(shè)有類X,成員函數(shù)Do(),代碼如下:

int main()

{

  char *buf = new char[sizeof(X)];

  X *x = new (buf) X;

  x->Do();

  x->~X(); //一定要主動(dòng)調(diào)用析構(gòu)函數(shù)去析構(gòu)

  delete []buf;

  return 0;

}

以上就是實(shí)例代碼分析c++動(dòng)態(tài)分配的詳細(xì)內(nèi)容,更多關(guān)于c++動(dòng)態(tài)分配的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++實(shí)現(xiàn)LeetCode(63.不同的路徑之二)

    C++實(shí)現(xiàn)LeetCode(63.不同的路徑之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(63.不同的路徑之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++11/14 線程中使用Lambda函數(shù)的方法

    C++11/14 線程中使用Lambda函數(shù)的方法

    這篇文章主要介紹了C++11/14 線程中使用Lambda函數(shù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • C++實(shí)現(xiàn)迷宮算法實(shí)例解析

    C++實(shí)現(xiàn)迷宮算法實(shí)例解析

    這篇文章主要介紹了C++實(shí)現(xiàn)迷宮算法實(shí)例解析,是一個(gè)比較經(jīng)典的C++算法,有一定的學(xué)習(xí)與借鑒價(jià)值,需要的朋友可以參考下
    2014-07-07
  • C語(yǔ)言嵌套鏈表實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)

    C語(yǔ)言嵌套鏈表實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言嵌套鏈表實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C++線程之thread詳解

    C++線程之thread詳解

    這篇文章主要為大家詳細(xì)介紹了C++線程中的thread,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • C語(yǔ)言實(shí)現(xiàn)會(huì)員計(jì)費(fèi)系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)會(huì)員計(jì)費(fèi)系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)會(huì)員計(jì)費(fèi)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++編程析構(gòu)函數(shù)拷貝構(gòu)造函數(shù)使用示例詳解

    C++編程析構(gòu)函數(shù)拷貝構(gòu)造函數(shù)使用示例詳解

    這篇文章主要為大家介紹了C++編程構(gòu)造函數(shù)中析構(gòu)函數(shù)及拷貝構(gòu)造函數(shù)的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • mfc入門教程之通過(guò)控制變量制作計(jì)算器

    mfc入門教程之通過(guò)控制變量制作計(jì)算器

    這篇文章主要介紹了mfc入門教程之通過(guò)控制變量制作計(jì)算器,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • c++11新特性多線程操作實(shí)戰(zhàn)

    c++11新特性多線程操作實(shí)戰(zhàn)

    這篇文章主要介紹了c++11新特性多線程操作實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • c語(yǔ)言實(shí)現(xiàn)含遞歸清場(chǎng)版掃雷游戲

    c語(yǔ)言實(shí)現(xiàn)含遞歸清場(chǎng)版掃雷游戲

    掃雷大家應(yīng)該都玩過(guò),這是一個(gè)十分經(jīng)典的游戲,下面這篇文章主要給大家介紹了關(guān)于c語(yǔ)言實(shí)現(xiàn)含遞歸清場(chǎng)版掃雷游戲的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11

最新評(píng)論