C++程序內(nèi)存棧區(qū)與堆區(qū)模型案例分析
棧區(qū):
由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量等(由編譯器管理其“生死”)
注意事項(xiàng):不要返回局部變量的地址,棧區(qū)開(kāi)辟的數(shù)據(jù)由編譯器自動(dòng)釋放
棧區(qū)代碼演示:
//內(nèi)存四區(qū)-棧區(qū)
/* 棧區(qū):
由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量等(由編譯器管理其“生死”)
注意事項(xiàng):不要返回局部變量的地址,棧區(qū)開(kāi)辟的數(shù)據(jù)由編譯器自動(dòng)釋放
*/
#include <iostream>
using namespace std;
//棧區(qū)數(shù)據(jù)注意事項(xiàng) --- 不要返回局部變量的地址
//棧區(qū)數(shù)據(jù)由編譯器管理開(kāi)辟和釋放
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ū)開(kāi)辟內(nèi)存
堆區(qū)代碼演示:
/* 堆區(qū):
* 由程序員分配釋放,若程序員不釋放,程序結(jié)束后由操作系統(tǒng)回收(運(yùn)行期間你不管,它就不釋放。運(yùn)行結(jié)束就給他回收掉)
* 在C++中主要利用new在堆區(qū)開(kāi)辟內(nèi)存
*/
#include <iostream>
using namespace std;
int * func()
{
//利用new關(guān)鍵字 可以將數(shù)據(jù)開(kāi)辟到堆區(qū)
//指針本質(zhì)也是局部變量,放在棧上,指針保存的數(shù)據(jù)是放在堆區(qū)
int * p = new int (10); //用指針去接收這塊內(nèi)存,new創(chuàng)建這塊內(nèi)存,把地址返回給你
return p;
}
int main() {
//在堆區(qū)開(kāi)辟數(shù)據(jù)
int *p = func();
cout << *p << endl;
cout << *p << endl;
cout << *p << endl;
cout << *p << endl; //一直存活
return 0;
}new操作符:
C++中利用new操作符在堆區(qū)開(kāi)辟數(shù)據(jù)
堆區(qū)開(kāi)辟數(shù)據(jù),由程序員手動(dòng)開(kāi)辟,手動(dòng)釋放,釋放利用操作符delete
語(yǔ)法:new 數(shù)據(jù)類(lèi)型
利用new創(chuàng)建的數(shù)據(jù),會(huì)返回該數(shù)據(jù)對(duì)應(yīng)的類(lèi)型的指針
new操作符代碼演示:
#include <iostream>
using namespace std;
//1、new的基本語(yǔ)法
int * func()
{
//在堆區(qū)創(chuàng)建整型數(shù)據(jù)
//new返回的是:該數(shù)據(jù)類(lèi)型的指針
int * p = new int(10);
return p;
}
void test01()
{
int * p = func();
cout << *p << endl;
cout << *p << endl;
cout << *p << endl;
//堆區(qū)的數(shù)據(jù)由程序員管理開(kāi)辟,程序員管理釋放
//如果想釋放堆區(qū)的數(shù)據(jù),利用關(guān)鍵字delete
delete p;
cout << *p << endl; //此處程序報(bào)錯(cuò):內(nèi)存已經(jīng)釋放,再去訪問(wèn)就是非法操作
}
//2、在堆區(qū)利用new開(kāi)辟數(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)文章
C語(yǔ)言中實(shí)現(xiàn)KMP算法的實(shí)例講解
KMP算法即字符串匹配算法,C語(yǔ)言中KMP可以避免指針回溯從而達(dá)到高效,接下來(lái)就來(lái)總結(jié)一下C語(yǔ)言中實(shí)現(xiàn)KMP算法的實(shí)例講解2016-06-06
C++ Boost MultiIndex使用詳細(xì)介紹
Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)2022-11-11
一個(gè)string類(lèi)的簡(jiǎn)單實(shí)現(xiàn)案例
下面小編就為大家?guī)?lái)一篇一個(gè)string類(lèi)的簡(jiǎn)單實(shí)現(xiàn)案例。小編覺(jué)得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
C/C++可變參數(shù)函數(shù)的實(shí)現(xiàn)
這篇文章主要介紹了C/C++可變參數(shù)函數(shù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
C語(yǔ)言學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要介紹了C語(yǔ)言學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

