最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++深入淺出講解內(nèi)存四區(qū)與new關鍵字的使用

 更新時間:2022年05月17日 11:04:25   作者:對象new不出來  
內(nèi)存四區(qū),一個非常重要的知識點,搞懂了內(nèi)存四區(qū),才能更快的去搞懂指針。我們寫的C語言代碼,不夸張的說,都是直接或者間接的在操作內(nèi)存。C語言之所以能夠開發(fā)操作系統(tǒng),就是指針的存在,而指針說白了就是地址,內(nèi)存地址,指針變量說白了就是存儲地址的變量

寫在前面

從本文開始我就要日常更新C++入門博文啦,從核心編程開始,之前的一些基礎我就不再從零整理了,只有函數(shù)傳參、結構體、指針、數(shù)組等稍微難理解的知識在之前的博文寫的比較全面;因為競爭確實很大,其他人總結的也很好,要看更詳細的基礎就看本站的技能樹,非常全面;我寫博客的初衷一是可以記錄自己的學習,加以鞏固;二是給更多的人更容易的講解來快速入門C++,C/C++永不過時!?。?/p>

內(nèi)存四區(qū)

下文有內(nèi)存四區(qū)的詳細介紹及作用

內(nèi)存四區(qū)的意義:不同區(qū)域存放的數(shù)據(jù)賦予不同的生命周期,讓我們的編程方式更靈活。

程序運行前

在程序編譯后,生成了可執(zhí)行程序.exe,未執(zhí)行程序前分為兩個區(qū)域為代碼區(qū)和全局區(qū)

代碼區(qū)

作用:

存放CPU執(zhí)行的機器指令(二進制代碼,由操作系統(tǒng)進行管理)

代碼區(qū)是共享的,共享的目的是對于頻繁被執(zhí)行的程序,只需要再內(nèi)存中有一份代碼即可

代碼區(qū)是只讀的,使其只讀的原因是防止程序意外地修改了它的指令

全局區(qū)

全局變量和靜態(tài)常量存放在此

全局區(qū)還包含了常量區(qū),字符串常量和其他常量也存放在此

該區(qū)域的數(shù)據(jù)在程序結束后由操作系統(tǒng)釋放

代碼示例:

#include<iostream>
using namespace std;
//全局變量
int g_a = 10;
int g_b = 10;
const int c_g_a=10;
const int c_g_b=10;
int main()
{
	//創(chuàng)建普通局部變量
	int a = 10;
	int b = 10;
	cout << "局部變量a的地址為:" << (int)& a << endl;
	cout << "局部變量b的地址為:" << (int)& b << endl;
	int c_l_a = 10;
	int c_l_b = 10;
	cout << "局部常量c_l_a的地址為:" << (int)&c_l_a << endl;
	cout << "局部變量c_l_b的地址為:" << (int)&c_l_b << endl;
	cout << "全局變量g_a的地址為:" << (int)&g_a << endl;
	cout << "全局變量g_b的地址為:" << (int)&g_b << endl;
	//靜態(tài)變量
	static int s_a = 10;
	static int s_b = 10;
	cout << "靜態(tài)變量s_a的地址為:" << (int)&s_a << endl;
	cout << "靜態(tài)變量s_b的地址為:" << (int)&s_b << endl;
	//字符串常量
	cout << "字符串常量的地址為:" << (int)&"Hello World" << endl;
	//const 修飾的變量
	//const 修飾的全局變量、const修飾的局部變量
	cout << "全局常量c_g_a的地址為:" << (int)&c_g_a << endl;
	cout << "全局常量c_g_b的地址為:" << (int)&c_g_b << endl;
}

各變量地址的關系:

從運行效果可以清楚的看到帶全局的變量地址所占空間相近,而局部的地址相差就比較遠了,看下我做的圖示總結:

程序運行后

棧區(qū)

由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量等

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

#include<iostream>
using namespace std;
int* func1(int b)//返回值類型為 int *,所以return一個地址才合法
{//形參數(shù)據(jù)也會開辟到棧區(qū)
	b = 100;
	int a = 10;//局部變量,存放在棧區(qū),棧區(qū)的數(shù)據(jù)在函數(shù)執(zhí)行完成后自動釋放
	return &a;//返回局部變量的地址
}
int main()
{
	//接受func1函數(shù)的返回值
	int* p = func1(10);
	cout << *p << endl;//第一次數(shù)據(jù)正常,因為編譯器會自動保留
	cout << *p << endl;//第二次往后是隨機數(shù),該地址被釋放
	cout << *p << endl;
}

tips:這里輸出只有一個10,剩下輸出結果無法猜測,因為返回的地址已經(jīng)被編譯器釋放掉

堆區(qū)

由程序員分配釋放,若程序員不釋放,程序結束時由操作系統(tǒng)回收

在C++中主要利用new在棧區(qū)開辟內(nèi)存

示例:

int * func()
{
	//利用new 關鍵字把棧開辟到堆區(qū)
	//指針 *p實質(zhì)上也是棧區(qū)數(shù)據(jù),指針保存的數(shù)據(jù)放到堆區(qū)
	int* p = new int (10);
	return p;
}
int main()
{
	int* a = func();
	cout << *a << endl;//無論輸出多少次,都能輸出a的值
	cout << *a << endl;
	cout << *a << endl;
}

這里不同于棧區(qū)的時,無論輸出多少次*a,都是結果十,下面來張圖助理解:

主函數(shù)中用*a作為*p的返回值,a的地址為0x0011,保存的數(shù)據(jù)為10,這是數(shù)據(jù)保存在堆中,除非程序結束,該地址都不會被釋放。

new關鍵字

new的基本語法

開辟:

數(shù)據(jù)類型 + 指針變量 = new +相同數(shù)據(jù)類型 +(賦值)

這樣可在堆區(qū)開辟數(shù)據(jù),作為棧區(qū)函數(shù)返回值也不會被編譯器自動釋放

刪除:

delete 變量地址

堆區(qū)數(shù)據(jù)由管理員開辟或釋放,如果想要釋放數(shù)據(jù)就利用delete關鍵字

利用new開辟數(shù)組

示例:int* Array = new int[n]; 和基本語法相比就是()變成了[],并且里面可以存放常量或者變量,當我們想控制數(shù)組長度的時候,這也是自定義的一種方法。讓 n 等于10,那么數(shù)組Array[]的長度為十,我們可以用隨機數(shù)來給數(shù)組賦值。釋放數(shù)組也是利用delete關鍵字,例如 delete[] Array; 刪除數(shù)組加[]放在數(shù)組名前。

例如:

void test02(int *Array)
{
	srand((unsigned int)time(NULL));
	for (int i = 0; i < 10; i++)
	{
		Array[i] = rand() % 20 + 1;
	}
	for (int i = 0; i < 10; i++)
	{
		cout << Array[i] << "  ";
	}
}
int main()
{
    int *Array = new int [10];
    test02(Array);
}

附帶個運行圖:

到此這篇關于C++深入淺出講解內(nèi)存四區(qū)與new關鍵字的使用的文章就介紹到這了,更多相關C++內(nèi)存四區(qū)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • c語言中的文件加密與解密

    c語言中的文件加密與解密

    這篇文章主要介紹了c語言中的文件加密與解密方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • C++ 非遞歸實現(xiàn)二叉樹的前中后序遍歷

    C++ 非遞歸實現(xiàn)二叉樹的前中后序遍歷

    本文將結合動畫和代碼演示如何通過C++ 非遞歸實現(xiàn)二叉樹的前中后序的遍歷,代碼具有一定的價值,感興趣的同學可以學習一下
    2021-11-11
  • C++段錯誤(Segmentation fault)快速定位的解決方法

    C++段錯誤(Segmentation fault)快速定位的解決方法

    寫過C++的朋友都知道,有時候程序編譯通過,并不能代表程序就是對的,在linux下做開發(fā)時,經(jīng)常會遇到跑崩潰的情況,但是在終端只會報Segmentation fault,如果工程代碼量少,你還能重新debug一下慢慢找,本文給大家介紹了C++段錯誤的快速定位,需要的朋友可以參考下
    2024-07-07
  • 詳解C語言中的getgrgid()函數(shù)和getgrnam()函數(shù)

    詳解C語言中的getgrgid()函數(shù)和getgrnam()函數(shù)

    這篇文章主要介紹了詳解C語言中的getgrgid()函數(shù)和getgrnam()函數(shù),是C語言入門學習中的基礎知識,需要的朋友可以參考下
    2015-08-08
  • C++ Opengl圖形顏色功能附源碼下載

    C++ Opengl圖形顏色功能附源碼下載

    這篇文章主要介紹了C++ Opengl圖形顏色功能附源碼下載,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • C++空類默認函數(shù)詳細解析

    C++空類默認函數(shù)詳細解析

    如果你只是聲明一個空類,不做任何事情的話,編譯器會自動為你生成一個默認構造函數(shù)、一個拷貝默認構造函數(shù)、一個默認拷貝賦值操作符和一個默認析構函數(shù)
    2013-10-10
  • delete[] p->elems和free(p->elems)區(qū)別介紹

    delete[] p->elems和free(p->elems)區(qū)別介紹

    delete[]和free()都是釋放內(nèi)存的函數(shù),但它們具有不同的使用方法和適用情況,這篇文章主要介紹了delete[] p->elems和free(p->elems)有什么區(qū)別,需要的朋友可以參考下
    2023-04-04
  • C語言實現(xiàn)BMP圖像處理(彩色圖轉灰度圖)

    C語言實現(xiàn)BMP圖像處理(彩色圖轉灰度圖)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)BMP圖像處理,彩色圖轉灰度圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++計算任意兩個日期天數(shù)差的方法詳解

    C++計算任意兩個日期天數(shù)差的方法詳解

    這篇文章主要為大家詳細介紹了如何利用C++實現(xiàn)任意兩個日期天數(shù)差,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-02-02
  • C語言字符函數(shù)和字符串函數(shù)示例詳解

    C語言字符函數(shù)和字符串函數(shù)示例詳解

    本文詳細介紹了C語言中字符分類函數(shù)、字符轉換函數(shù)及字符串操作函數(shù)的使用方法,并通過示例代碼展示了如何實現(xiàn)這些功能,通過這些內(nèi)容,讀者可以深入理解并掌握C語言中的字符串處理技巧,感興趣的朋友一起看看吧
    2025-03-03

最新評論

新民市| 黎城县| 报价| 陇西县| 长兴县| 嘉鱼县| 谢通门县| 上虞市| 肇源县| 乳源| 温宿县| 梧州市| 鄂托克前旗| 偃师市| 卢湾区| 昌都县| 竹溪县| 吕梁市| 平安县| 洛阳市| 渭南市| 江门市| 靖安县| 甘泉县| 柘城县| 前郭尔| 张家口市| 潮州市| 察雅县| 昌黎县| 泰州市| 普兰县| 衡水市| 宁武县| 依兰县| 石门县| 涟源市| 万源市| 拉孜县| 安多县| 平塘县|