C++程序內(nèi)存棧區(qū)與堆區(qū)模型案例分析
棧區(qū):
由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量等(由編譯器管理其“生死”)
注意事項(xiàng):不要返回局部變量的地址,棧區(qū)開辟的數(shù)據(jù)由編譯器自動(dòng)釋放
棧區(qū)代碼演示:
//內(nèi)存四區(qū)-棧區(qū) /* 棧區(qū): 由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量等(由編譯器管理其“生死”) 注意事項(xiàng):不要返回局部變量的地址,棧區(qū)開辟的數(shù)據(jù)由編譯器自動(dòng)釋放 */ #include <iostream> using namespace std; //棧區(qū)數(shù)據(jù)注意事項(xiàng) --- 不要返回局部變量的地址 //棧區(qū)數(shù)據(jù)由編譯器管理開辟和釋放 int * func(int b) //形參數(shù)據(jù)也會(huì)放到棧區(qū) { b = 100; int a = 10; //局部變量 存放在棧區(qū),棧區(qū)的數(shù)據(jù)在函數(shù)執(zhí)行完后自動(dòng)釋放,當(dāng)此函數(shù)執(zhí)行完,棧上的數(shù)據(jù)就清空了 retern &a; //返回局部變量的地址 } int main() { //接受func函數(shù)的返回值 int * p = finc(1); cout << *p << endl; //第一次可以打印正確的數(shù)字,是因?yàn)榫幾g器做了一次保留 cout << *p << endl; //第二次這個(gè)數(shù)據(jù)就不再保留了 return 0; }
堆區(qū):
由程序員分配釋放,若程序員不釋放,程序結(jié)束后由操作系統(tǒng)回收(運(yùn)行期間你不管,它就不釋放。運(yùn)行結(jié)束就給他回收掉)
在C++中主要利用new在堆區(qū)開辟內(nèi)存
堆區(qū)代碼演示:
/* 堆區(qū): * 由程序員分配釋放,若程序員不釋放,程序結(jié)束后由操作系統(tǒng)回收(運(yùn)行期間你不管,它就不釋放。運(yùn)行結(jié)束就給他回收掉) * 在C++中主要利用new在堆區(qū)開辟內(nèi)存 */ #include <iostream> using namespace std; int * func() { //利用new關(guān)鍵字 可以將數(shù)據(jù)開辟到堆區(qū) //指針本質(zhì)也是局部變量,放在棧上,指針保存的數(shù)據(jù)是放在堆區(qū) int * p = new int (10); //用指針去接收這塊內(nèi)存,new創(chuàng)建這塊內(nèi)存,把地址返回給你 return p; } int main() { //在堆區(qū)開辟數(shù)據(jù) int *p = func(); cout << *p << endl; cout << *p << endl; cout << *p << endl; cout << *p << endl; //一直存活 return 0; }
new操作符:
C++中利用new操作符在堆區(qū)開辟數(shù)據(jù)
堆區(qū)開辟數(shù)據(jù),由程序員手動(dòng)開辟,手動(dòng)釋放,釋放利用操作符delete
語法:new 數(shù)據(jù)類型
利用new創(chuàng)建的數(shù)據(jù),會(huì)返回該數(shù)據(jù)對(duì)應(yīng)的類型的指針
new操作符代碼演示:
#include <iostream> using namespace std; //1、new的基本語法 int * func() { //在堆區(qū)創(chuàng)建整型數(shù)據(jù) //new返回的是:該數(shù)據(jù)類型的指針 int * p = new int(10); return p; } void test01() { int * p = func(); cout << *p << endl; cout << *p << endl; cout << *p << endl; //堆區(qū)的數(shù)據(jù)由程序員管理開辟,程序員管理釋放 //如果想釋放堆區(qū)的數(shù)據(jù),利用關(guān)鍵字delete delete p; cout << *p << endl; //此處程序報(bào)錯(cuò):內(nèi)存已經(jīng)釋放,再去訪問就是非法操作 } //2、在堆區(qū)利用new開辟數(shù)組 void test02() { //創(chuàng)建10整型數(shù)據(jù)的數(shù)組,在堆區(qū) int * arr = new int [10]; //10代表數(shù)組有10個(gè)元素 for(int i=0;i<10;i++) { arr[i]=i+100;//給10個(gè)元素賦值100~109 } for(int i=0;i<10;i++) { cout<<arr[i]<<endl; } //釋放堆區(qū)數(shù)組 //釋放數(shù)組的時(shí)候,要加一個(gè)[]才可以 delete[] arr; } int main() { //test01(); test02(); return 0; }
到此這篇關(guān)于C++程序內(nèi)存棧區(qū)與堆區(qū)模型案例分析的文章就介紹到這了,更多相關(guān)C++ 內(nèi)存分區(qū)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OpenCV reshape函數(shù)實(shí)現(xiàn)矩陣元素序列化
reshape函數(shù)是OpenCV中一個(gè)很有用的函數(shù),不僅可以改變矩陣的通道數(shù),還可以對(duì)矩陣元素進(jìn)行序列化。本文將主要介紹如何通過reshape實(shí)現(xiàn)矩陣元素序列化,需要的小伙伴可以參考一下2021-12-12C語言putenv()函數(shù)和getenv()函數(shù)的使用詳解
這篇文章主要介紹了C語言putenv()函數(shù)和getenv()函數(shù)的使用詳解,用來進(jìn)行環(huán)境變量的相關(guān)操作,需要的朋友可以參考下2015-09-09C語言切割多層字符串(strtok_r strtok使用方法)
這篇文章主要介紹了C語言切割多層字符串的方法,說了strtok的弱點(diǎn),使用strtok_r的方法2013-11-11C++簡(jiǎn)易版Tensor實(shí)現(xiàn)方法詳解
這篇文章主要介紹了C++簡(jiǎn)易版Tensor的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值2022-08-08C++入門概覽和嘗試創(chuàng)建第一個(gè)C++程序
這篇文章主要介紹了C++入門概覽和嘗試創(chuàng)建第一個(gè)C++程序,同時(shí)也包括編寫類的示例展示C++面向?qū)ο蟮奶匦?需要的朋友可以參考下2015-09-09