【C++】內(nèi)存分區(qū)-創(chuàng)新互聯(lián)

目錄

創(chuàng)新互聯(lián)建站是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計,網(wǎng)站模板,微信公眾號開發(fā),軟件開發(fā),小程序設(shè)計,十余年建站對成都水泥攪拌車等多個行業(yè),擁有豐富的網(wǎng)站營銷經(jīng)驗。

C++ 程序執(zhí)行時將內(nèi)存大方向劃分為 4 個區(qū)域

代碼區(qū):

全局區(qū):

圖形理解:

棧區(qū):

堆區(qū):

new 關(guān)鍵字:


C++ 程序執(zhí)行時將內(nèi)存大方向劃分為 4 個區(qū)域

代碼區(qū):存放?函數(shù)體的二進制代碼?,由操作?系統(tǒng)管理
全局區(qū):存放?全局變量?和?靜態(tài)變量?以及?常量
棧? 區(qū):??由?編譯器自動分配釋放,存放函數(shù)的參數(shù)值、局部變量等
堆? 區(qū):??由?程序員分配和釋放,若程序員不釋放,程序結(jié)束時由操作系統(tǒng)回收

不同區(qū)域存放的數(shù)據(jù),賦予不同的生命周期

程序運行前
程序編譯后,生成了 exe 可執(zhí)行程序,未執(zhí)行該程序前分為兩個區(qū)域

代碼區(qū):

存放在 cpu 執(zhí)行的機器指令

-
代碼區(qū)是共享的,共享的目的是對于頻繁被執(zhí)行的程序,只需要在內(nèi)存中有一份代碼即可

-

代碼區(qū)是只讀的,使其只讀的原因是防止程序意外地修改他的指令

全局區(qū):

存放全局變量和靜態(tài)變量

-
全局區(qū)還包含常量區(qū),字符串常量和其他常量也存放在此

-
該區(qū)的數(shù)據(jù)在程序結(jié)束后由操作系統(tǒng)釋放

全局變量:創(chuàng)建在函數(shù)體外的變量都是全局變量,由下圖可知 全局變量 和 局部變量 不在內(nèi)存的同一塊區(qū)域

靜態(tài)變量:普通變量前面加上 static ,屬于靜態(tài)變量,由下圖可知,全局變量?和?靜態(tài)變量在內(nèi)存的同一塊區(qū)域

常量:

字符串常量(雙引號""),由下圖可知,字符串常量?和?全局變量、靜態(tài)變量?在內(nèi)存中的同一塊區(qū)域

const 修飾的全局常量?,由下圖可知 const 修飾的全局常量 和 全局變量、靜態(tài)變量?、字符串常量是在內(nèi)存的同一塊區(qū)域

const 修飾的局部變量,右下圖可知,局部變量?和 const 修飾的局部常量 在內(nèi)存的同一塊區(qū)域

圖形理解:

棧區(qū):

由編譯器自動分配釋放,存放 函數(shù)的參數(shù)值、局部變量?等

-

注意事項:不要返回局部變量的地址,棧區(qū)開辟的數(shù)據(jù)由編譯器自動釋放

// 棧區(qū)的數(shù)據(jù)疏議事項
// 棧區(qū)的數(shù)據(jù)由編譯器自動釋放

int* func()
{
    int a = 10; // 局部變量 , 存放在棧上, 棧區(qū)的數(shù)據(jù)在函數(shù)執(zhí)行完后自動釋放
    return &a;  // 返回局部變量地址
}

int main()
{
    int* p = func();
    cout<< *p<< endl; // 第一次編譯器給數(shù)據(jù)做了一次保留,屬于非法操作
    cout<< *p<< endl; // 數(shù)據(jù)不在保留
    system("pause");
    return 0;
}

warning C4172: 返回局部變量或臨時變量的地址: a

返回的地址內(nèi)存并在我們自己手里,這個管理權(quán)力在系統(tǒng)手里,系統(tǒng)隨時都可以更改這塊內(nèi)存中的內(nèi)容,為了避免出現(xiàn)意想不到的結(jié)果,所有不能返回局部變量地址

堆區(qū):

由程序員分配釋放,若程序員不釋放,程序結(jié)束是由操作系統(tǒng)回收

-

在 C++ 中主要用 new 在堆區(qū)開辟內(nèi)存

利用 new 關(guān)鍵字,可以將數(shù)據(jù)開辟到堆區(qū),new 返回內(nèi)存編碼

function 中的指針本質(zhì)也是局部變量,放在 棧區(qū),指針保存的數(shù)據(jù)放在堆區(qū)

int* function()
{
    int* a = new int(10); // 開辟到堆區(qū)
    // new 返回地址編號,括號里的 10 是給這個值賦值為 10
    return a;
}

int main()
{
    // 在堆區(qū)開辟數(shù)據(jù)
    int* p = function();

    cout<< *p<< endl;
    cout<< *p<< endl;

    system("pause");
    return 0;
}
new 關(guān)鍵字:

C++ 中使用 new 操作符在堆區(qū)開辟數(shù)據(jù)

釋放操作符 delete

語法:

new? 數(shù)據(jù)類型

利用 new 創(chuàng)建的數(shù)據(jù),會返回該數(shù)據(jù)對應(yīng)的類型的指針

new 數(shù)據(jù)類型(整形1);??,表示為 整形1 開辟一個整形的數(shù)據(jù)空間

利用 delete 關(guān)鍵字 釋放 new 開辟的內(nèi)存空間

// 1、 new 基本語法
int* funct()
{
    // 在堆區(qū)創(chuàng)建整形的數(shù)據(jù)
    // 返回該數(shù)據(jù)類型指針
    int* p = new int(10);
    return p;
}


void test01()
{
    int* p = funct();
    cout<< *p<< endl;
    cout<< *p<< endl;
    cout<< *p<< endl;
    // 堆區(qū)的數(shù)據(jù)由程序員管理釋放
    // 釋放使用關(guān)鍵字 delete 指針
    delete p;
    cout<< *p<< endl;
}


int main()
{
    test01();
    system("pause");
    return 0;
}

警告?? ?C6001?? ?使用未初始化的內(nèi)存“p”。

new 數(shù)據(jù)類型加上?[整形] ;,表示申請 整形 個元素的數(shù)組,返回數(shù)組連續(xù)空間的首地址

void test02()
{
    // 創(chuàng)建 10 整形數(shù)據(jù)的數(shù)組,在堆區(qū)
    int* arr = new int[10]; // 10 代表數(shù)組有 10 個元素,返回連續(xù)空間的首地址
    for (int i = 0; i< 10; i++)
    {
        arr[i] = i + 1; // 1 - 10
    }
    for (int i = 0; i< 10; i++)
    {
        cout<< arr[i]<< " ";
    }
    cout<< endl;
}


int main()
{
    test02();
    system("pause");
    return 0;
}

delete 釋放數(shù)組

delete [] 指針;?// 釋放數(shù)組的時候要加? [ ] (方括號),不加 [ ]? 則只會釋放一個指針

//釋放堆區(qū)數(shù)組
delete[]arr;

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

當前題目:【C++】內(nèi)存分區(qū)-創(chuàng)新互聯(lián)
URL標題:http://muchs.cn/article20/eipco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、商城網(wǎng)站響應(yīng)式網(wǎng)站、定制網(wǎng)站網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計公司

廣告

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

成都網(wǎng)站建設(shè)