日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++程序內存棧區與堆區模型案例分析_C 語言

作者:Zachery. ? 更新時間: 2022-06-01 編程語言

棧區:

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

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

棧區代碼演示:

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

堆區:

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

在C++中主要利用new在堆區開辟內存

堆區代碼演示:

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

new操作符:

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

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

語法:new 數據類型

利用new創建的數據,會返回該數據對應的類型的指針

new操作符代碼演示:

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

原文鏈接:https://blog.csdn.net/weixin_48270094/article/details/123815731

欄目分類
最近更新