亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++程序內存棧區(qū)與堆區(qū)模型案例分析

 更新時間:2022年03月30日 09:22:16   作者:Zachery.  
一直以來總是對這個問題的認識比較朦朧,我相信很多朋友也是這樣的,總是聽到內存一會在棧上分配,一會又在堆上分配,那么它們之間到底是怎么的區(qū)別呢,讓我們一起來看看

棧區(qū):

由編譯器自動分配釋放,存放函數的參數值,局部變量等(由編譯器管理其“生死”)

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

棧區(qū)代碼演示:

//內存四區(qū)-棧區(qū)
/* 棧區(qū):
由編譯器自動分配釋放,存放函數的參數值,局部變量等(由編譯器管理其“生死”)
注意事項:不要返回局部變量的地址,棧區(qū)開辟的數據由編譯器自動釋放
*/
#include <iostream>
using namespace std;
 
//棧區(qū)數據注意事項 --- 不要返回局部變量的地址
//棧區(qū)數據由編譯器管理開辟和釋放
 
int * func(int b) //形參數據也會放到棧區(qū)
{
    b = 100;
    int a = 10; //局部變量 存放在棧區(qū),棧區(qū)的數據在函數執(zhí)行完后自動釋放,當此函數執(zhí)行完,棧上的數據就清空了
    retern &a;  //返回局部變量的地址
}
int main() {
 
    //接受func函數的返回值
    int * p = finc(1);
    cout << *p << endl; //第一次可以打印正確的數字,是因為編譯器做了一次保留
    cout << *p << endl; //第二次這個數據就不再保留了
 
    return 0;
}

堆區(qū):

由程序員分配釋放,若程序員不釋放,程序結束后由操作系統(tǒng)回收(運行期間你不管,它就不釋放。運行結束就給他回收掉)

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

堆區(qū)代碼演示:

/* 堆區(qū):
 * 由程序員分配釋放,若程序員不釋放,程序結束后由操作系統(tǒng)回收(運行期間你不管,它就不釋放。運行結束就給他回收掉)
 * 在C++中主要利用new在堆區(qū)開辟內存
 */
#include <iostream>
using namespace std;
 
int * func()
{
    //利用new關鍵字 可以將數據開辟到堆區(qū)
    //指針本質也是局部變量,放在棧上,指針保存的數據是放在堆區(qū)
    int * p = new int (10); //用指針去接收這塊內存,new創(chuàng)建這塊內存,把地址返回給你
    return p;
}
int main() {
    //在堆區(qū)開辟數據
    int *p = func();
    
    cout << *p << endl;
    cout << *p << endl;
    cout << *p << endl;
    cout << *p << endl; //一直存活
    
    return 0;
}

new操作符:

C++中利用new操作符在堆區(qū)開辟數據

堆區(qū)開辟數據,由程序員手動開辟,手動釋放,釋放利用操作符delete

語法:new 數據類型

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

new操作符代碼演示:

#include <iostream>
using namespace std;
 
//1、new的基本語法
int * func()
{
    //在堆區(qū)創(chuàng)建整型數據
    //new返回的是:該數據類型的指針
    int * p = new int(10);
    return p;
}
 
void test01()
{
    int * p = func();
    cout << *p << endl;
    cout << *p << endl;
    cout << *p << endl;
    //堆區(qū)的數據由程序員管理開辟,程序員管理釋放
    //如果想釋放堆區(qū)的數據,利用關鍵字delete
    delete p;
    cout << *p << endl; //此處程序報錯:內存已經釋放,再去訪問就是非法操作
}
 
//2、在堆區(qū)利用new開辟數組
void test02()
{
    //創(chuàng)建10整型數據的數組,在堆區(qū)
    int * arr = new int [10]; //10代表數組有10個元素
    for(int i=0;i<10;i++)
    {
        arr[i]=i+100;//給10個元素賦值100~109
 
    }
    for(int i=0;i<10;i++)
    {
        cout<<arr[i]<<endl;
    }
    //釋放堆區(qū)數組
    //釋放數組的時候,要加一個[]才可以
    delete[] arr;
}
int main() {
    //test01();
    test02();
 
 
    return 0;
}

到此這篇關于C++程序內存棧區(qū)與堆區(qū)模型案例分析的文章就介紹到這了,更多相關C++ 內存分區(qū)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • OpenCV reshape函數實現矩陣元素序列化

    OpenCV reshape函數實現矩陣元素序列化

    reshape函數是OpenCV中一個很有用的函數,不僅可以改變矩陣的通道數,還可以對矩陣元素進行序列化。本文將主要介紹如何通過reshape實現矩陣元素序列化,需要的小伙伴可以參考一下
    2021-12-12
  • C語言putenv()函數和getenv()函數的使用詳解

    C語言putenv()函數和getenv()函數的使用詳解

    這篇文章主要介紹了C語言putenv()函數和getenv()函數的使用詳解,用來進行環(huán)境變量的相關操作,需要的朋友可以參考下
    2015-09-09
  • C語言中讀取時間日期的基本方法

    C語言中讀取時間日期的基本方法

    這篇文章主要介紹了C語言中讀取時間日期的基本方法,分別是time()函數和gmtime()函數的使用,注意返回值的區(qū)別,需要的朋友可以參考下
    2015-08-08
  • C語言切割多層字符串(strtok_r strtok使用方法)

    C語言切割多層字符串(strtok_r strtok使用方法)

    這篇文章主要介紹了C語言切割多層字符串的方法,說了strtok的弱點,使用strtok_r的方法
    2013-11-11
  • C++ Boost EnableIf函數使用介紹

    C++ Boost EnableIf函數使用介紹

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • 利用Matlab制作一款狗頭翻牌子小游戲

    利用Matlab制作一款狗頭翻牌子小游戲

    本文將用Matlab制作一個狗頭翻牌子的小游戲,就是點擊一個牌子時,該牌子和周圍四個牌子也會相應發(fā)生變化,想辦法讓所有牌子都在同一面即為游戲勝利。感興趣的可以跟隨小編學習一下
    2022-03-03
  • C語言實現航班管理系統(tǒng)

    C語言實現航班管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現航班管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++基于prim實現迷宮生成

    C++基于prim實現迷宮生成

    這篇文章主要為大家詳細介紹了C++基于prim實現迷宮生成,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C++簡易版Tensor實現方法詳解

    C++簡易版Tensor實現方法詳解

    這篇文章主要介紹了C++簡易版Tensor的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值
    2022-08-08
  • C++入門概覽和嘗試創(chuàng)建第一個C++程序

    C++入門概覽和嘗試創(chuàng)建第一個C++程序

    這篇文章主要介紹了C++入門概覽和嘗試創(chuàng)建第一個C++程序,同時也包括編寫類的示例展示C++面向對象的特性,需要的朋友可以參考下
    2015-09-09

最新評論