C++核心編程之內(nèi)存分區(qū)模型詳解
內(nèi)存分區(qū)模型
C++程序在執(zhí)行時(shí),將內(nèi)存大方向分為四個區(qū)域。
- 代碼區(qū):存放函數(shù)體的二進(jìn)制代碼,由操作系統(tǒng)進(jìn)行管理。
- 全局區(qū):存放全局變量和靜態(tài)變量以及常量。
- 棧區(qū):由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量等
- 堆區(qū):由程序員分配和釋放,若程序員不釋放,程序結(jié)束時(shí)由操作系統(tǒng)回收
內(nèi)存四區(qū)意義:
不同區(qū)域存放的數(shù)據(jù),賦予不同的生命周期,給我們更大的靈活編程。
程序運(yùn)行前
在程序編譯后,生成exe可執(zhí)行程序,未執(zhí)行該程序前分為兩個區(qū)域。
代碼區(qū):
- 存放CPU執(zhí)行的機(jī)器指令
- 代碼區(qū)時(shí)共享的,共享的目的時(shí)對于頻繁被執(zhí)行的程序,只需要在內(nèi)存中有一份代碼即可
- 代碼區(qū)是只讀的,使其只讀的原因是防止程序意外地修改了他的指令
全局區(qū):
- 全局變量和靜態(tài)變量存放在此處
- 全局區(qū)還包含了常量區(qū),字符串常量和其他常量也存放在此
- 該區(qū)域的數(shù)據(jù)在程序結(jié)束后由操作系統(tǒng)釋放
程序運(yùn)行后
棧區(qū):
- 由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量等
- 注意事項(xiàng):不要返回局部變量的地址,棧區(qū)開辟的數(shù)據(jù)由編譯器自動釋放
#include<iostream>
#include<cstdlib>
using namespace std;
//棧區(qū)數(shù)據(jù)注意事項(xiàng) --- 不要返回局部變量的地址
//棧區(qū)的數(shù)據(jù)由編譯器管理開辟和釋放
int* func(int b) //形參數(shù)據(jù)也會放在棧區(qū)
{
b = 100;
int a = 10; //局部變量 存放在棧區(qū),棧區(qū)的數(shù)據(jù)在函數(shù)執(zhí)行完后自動釋放
return &a; //返回局部變量的地址
}
int main()
{
//接受func函數(shù)的返回值
int * p = func(1);
cout << *p << endl; //第一次可以答應(yīng)正確的數(shù)字,是因?yàn)榫幾g器做了保留
cout << *p << endl; //第二次這數(shù)據(jù)就不再保留了(2022版本的vs做出改版,對返回值保留持續(xù)了)
system("pause");
}編譯器編譯時(shí)會提示不要返回局部變量或者臨時(shí)變量的地址。一般會被釋放產(chǎn)生問題(在2022VS中加入了更高的適配,對其做出了保留,但是不要如此使用)
堆區(qū)
- 由程序員分配釋放,若是程序員不釋放,程序結(jié)束時(shí)由操作做系統(tǒng)回收
- 在C++中主要利用new在堆區(qū)開辟內(nèi)存
示例
#include<iostream>
using namespace std;
int* func()
{
//利用new關(guān)鍵字可以將數(shù)據(jù)開辟到堆區(qū)
//指針 本質(zhì)也是局部變量,放在棧上
int* p=new int(10);
return p;
}
int main()
{
//在堆區(qū)開辟數(shù)據(jù)
int* p = func();
cout << *p << endl;
cout << *p << endl;
system("pause");
return 0;
}總結(jié):
- 堆區(qū)數(shù)據(jù)由程序員管理開辟和釋放
- 堆區(qū)數(shù)據(jù)利用new關(guān)鍵字進(jìn)行開辟內(nèi)存
new操作符
- c++中利用new操作符在堆區(qū)開辟數(shù)據(jù)
- 堆區(qū)開辟的數(shù)據(jù),由程序員手動開辟,手動釋放,釋放利用操作符delete
- 語法 : new 數(shù)據(jù)類型
- 利用new創(chuàng)建的數(shù)據(jù),會返回該數(shù)據(jù)對應(yīng)的類型的指針
- 示例:
#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; //內(nèi)存已經(jīng)釋放,再次訪問是非法操作,會報(bào)錯
}
//2、在堆區(qū)利用new開辟一個數(shù)組
void test02()
{
//創(chuàng)建10整型數(shù)組,在堆區(qū)
int * arr = new int[10]; //10代表數(shù)組有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ū)的數(shù)組
//釋放數(shù)組的時(shí)候 要加【】才可以
delete[] arr;
}
int main()
{
test01();
test02();
system("pause");
return 0;
}到此這篇關(guān)于C++核心編程之內(nèi)存分區(qū)模型詳解的文章就介紹到這了,更多相關(guān)C++內(nèi)存分區(qū)模型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vc6.0中c語言控制臺程序中的定時(shí)技術(shù)(定時(shí)器)
這篇文章主要介紹了vc6.0中c語言控制臺程序中的定時(shí)技術(shù)(定時(shí)器),需要的朋友可以參考下2014-04-04
C語言中調(diào)用Swift函數(shù)實(shí)例詳解
這篇文章主要介紹了C語言中調(diào)用Swift函數(shù)實(shí)例詳解的相關(guān)資料,實(shí)現(xiàn)該功能可以通過定義全局的指向Blocks的對象指針來實(shí)現(xiàn),需要的朋友可以參考下2017-07-07

