中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c++動態分配的代碼實例詳解

發布時間:2020-07-20 09:37:20 來源:億速云 閱讀:138 作者:小豬 欄目:編程語言

這篇文章主要講解了c++動態分配的代碼實例詳解,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

1. c語言中動態分配和釋放

在c中,申請動態內存是使用malloc和free,這兩個函數是c的標準庫函數,分配內存使用的是系統調用,使用它們必須包含stdlib.h,才能編譯通過。

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

示例代碼如下:

#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++動態分配和釋放

c++中,申請動態內存是使用new和delete,這兩個關鍵字實際上是運算符,并不是函數。

需要注意的是:new的不是數組的話,則直接delete就好,并且只會調用一次析構函數,而new[]的話,則需使用delete[]來釋放,并且數組中每一個元素都會調用一次析構函數,調用完析構函數再釋放內存。

3. new/delete的底層實現

對于基本數據類型(無需構造函數)而言new是重載了new運算符,調用了operator new,復雜數據類型則在此基礎上還會調用構造函數,而operator new里面則是調用的malloc函數,如果調用malloc失敗,則直接拋出異常;

對于基本數據類型(無需析構函數)而言delete是重載了delete運算符,調用了operator delete,復雜數據類型則在此基礎上還會調用析構函數,而operator delete里面則是調用的free函數。

4. new[]/delete[]的底層實現

簡單數據類型(包括基本數據類型和不需要析構函數的類型)
對于簡單數據類型而言,new[]調用的是operator new[],計算出數組總大小之后調用operator new。值得一提的是,可以通過()初始化數組為零值,實例:

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

等同于:

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

簡單數據類型時delete[]則和delete一樣,沒區別。

復雜數據類型

對于復雜數據類型而言new[]先調用operator new[]分配內存,然后在指針的前四個字節寫入數組大小,最后看分配了多少個元素就調用多少次構造函數,之所以要在前4個字節寫入數組大小,是因為釋放內存之前會調用每個對象的析構函數。但是編譯器并不知道p實際所指對象的大小。如果沒有儲存數組大小,編譯器就不知道應該調用幾次析構函數;
new[]分配的內存只能由delete[]釋放,如果由delete釋放會崩潰,為什么會崩潰呢?

假設指針p指向new[]分配的內存,因為要4字節存儲數組大小,實際分配的內存地址為[p-4],系統記錄的也是這個地址,delete[]實際釋放的就是p-4指向的內存,而delete會直接釋放p指向的內存,這個內存根本沒有被系統記錄,所以會崩潰。

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

根據前面new實現原理說的,C++里,如果new分配內存失敗,默認是拋出異常的。所以,如果分配成功,p == NULL就絕對不會成立;而如果分配失敗了,也不會執行 if ( p == NULL ),因為分配失敗時,new 就會拋出異常跳過后面的代碼。如果你想檢查 new 是否成功,應該捕捉異常:

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

當然,標準 C++ 亦提供了一個方法來抑制 new 拋出異常,而返回空指針,如下:

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

6. delete失敗時是什么現象,一般是因為什么原因

delete失敗可能是因為內存在之前已經delete過一次了,再次delete就會失敗,linux下報錯:double free or corruption,已放棄。

7. placement new的使用

placement new用于在已經分配好的內存上,再進行二次分配,具體實現如下:

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

int main()

{

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

  X *x = new (buf) X;

  x->Do();

  x->~X(); //一定要主動調用析構函數去析構

  delete []buf;

  return 0;

}

看完上述內容,是不是對c++動態分配的代碼實例詳解有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汉中市| 灵石县| 剑川县| 崇明县| 金山区| 莫力| 遵义市| 罗山县| 吉林省| 城口县| 苏尼特右旗| 岫岩| 黎川县| 黑龙江省| 石台县| 佛山市| 天峨县| 册亨县| 营山县| 巴中市| 方城县| 濉溪县| 孙吴县| 新和县| 镇巴县| 枣阳市| 林口县| 华宁县| 武义县| 长白| 原阳县| 勃利县| 田林县| 平遥县| 泸西县| 永康市| 洪雅县| 论坛| 泊头市| 万安县| 汉源县|