欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

c++動(dòng)態(tài)分配淺析

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

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

站在用戶的角度思考問題,與客戶深入溝通,找到鄧州網(wǎng)站設(shè)計(jì)與鄧州網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋鄧州地區(qū)。

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++中,申請動(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[]來釋放,并且數(shù)組中每一個(gè)元素都會(huì)調(diào)用一次析構(gòu)函數(shù),調(diào)用完析構(gòu)函數(shù)再釋放內(nèi)存。

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

對于基本數(shù)據(jù)類型(無需構(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失敗,則直接拋出異常;

對于基本數(shù)據(jù)類型(無需析構(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)

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

等同于:

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

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

  • 復(fù)雜數(shù)據(jù)類型
    對于復(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è)對象的析構(gòu)函數(shù)。但是編譯器并不知道p實(shí)際所指對象的大小。如果沒有儲(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)存根本沒有被系統(tǒng)記錄,所以會(huì)崩潰。

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

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

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

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

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

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

delete失敗可能是因?yàn)閮?nèi)存在之前已經(jīng)delete過一次了,再次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;

}

分享題目:c++動(dòng)態(tài)分配淺析
文章轉(zhuǎn)載:http://chinadenli.net/article12/iegpdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄定制開發(fā)、云服務(wù)器建站公司、網(wǎng)站設(shè)計(jì)公司微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
偷拍偷窥女厕一区二区视频| 日韩欧美国产三级在线观看| 国产在线成人免费高清观看av| 亚洲深夜精品福利一区| 国产精品九九九一区二区| 国产午夜精品亚洲精品国产| 欧洲自拍偷拍一区二区| 国产成人午夜福利片片| 国产欧美高清精品一区| 午夜国产成人福利视频| 99热九九在线中文字幕| 福利一区二区视频在线| 欧美日韩精品人妻二区三区| 加勒比东京热拍拍一区二区| 久七久精品视频黄色的| 久久午夜福利精品日韩| 午夜福利激情性生活免费视频| 91人妻人人做人碰人人九色| 中文字幕精品少妇人妻| 亚洲欧美日韩中文字幕二欧美| 欧美日韩国产精品黄片| 国产精品亚洲一区二区| 日本精品啪啪一区二区三区| 久久本道综合色狠狠五月| 欧美精品中文字幕亚洲| 亚洲天堂有码中文字幕视频| 欧美成人黄色一区二区三区| 成人午夜视频在线播放| 欧美日韩国产精品黄片| 少妇成人精品一区二区| 日本欧美一区二区三区就| 日本丰满大奶熟女一区二区| 欧美精品亚洲精品日韩精品| 午夜国产成人福利视频| 亚洲一区二区精品国产av | 爽到高潮嗷嗷叫之在现观看| 护士又紧又深又湿又爽的视频| 日韩少妇人妻中文字幕| 精品精品国产自在久久高清| 色丁香之五月婷婷开心| 亚洲精品伦理熟女国产一区二区 |