欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++核心編程之內(nèi)存分區(qū)模型詳解

 更新時(shí)間:2023年07月16日 09:38:51   作者:小灰不停前進(jìn)  
這篇文章主要為大家介紹了C++核心編程中內(nèi)存分區(qū)模型,C++程序在執(zhí)行時(shí),將內(nèi)存大方向分為四個(gè)區(qū)域,代碼區(qū),全局區(qū),棧區(qū),堆區(qū),文章通過(guò)代碼示例介紹的非常詳細(xì),感興趣的同學(xué)可以參考閱讀下

內(nèi)存分區(qū)模型

C++程序在執(zhí)行時(shí),將內(nèi)存大方向分為四個(gè)區(qū)域。

  • 代碼區(qū):存放函數(shù)體的二進(jìn)制代碼,由操作系統(tǒng)進(jìn)行管理。
  • 全局區(qū):存放全局變量和靜態(tài)變量以及常量。
  • 棧區(qū):由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量等
  • 堆區(qū):由程序員分配和釋放,若程序員不釋放,程序結(jié)束時(shí)由操作系統(tǒng)回收

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

程序運(yùn)行前

在程序編譯后,生成exe可執(zhí)行程序,未執(zhí)行該程序前分為兩個(gè)區(qū)域。
代碼區(qū):

  • 存放CPU執(zhí)行的機(jī)器指令
  • 代碼區(qū)時(shí)共享的,共享的目的時(shí)對(duì)于頻繁被執(zhí)行的程序,只需要在內(nèi)存中有一份代碼即可
  • 代碼區(qū)是只讀的,使其只讀的原因是防止程序意外地修改了他的指令

全局區(qū):

  • 全局變量和靜態(tài)變量存放在此處
  • 全局區(qū)還包含了常量區(qū),字符串常量和其他常量也存放在此
  • 該區(qū)域的數(shù)據(jù)在程序結(jié)束后由操作系統(tǒng)釋放

程序運(yùn)行后

棧區(qū):

  • 由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量等
  • 注意事項(xiàng):不要返回局部變量的地址,棧區(qū)開辟的數(shù)據(jù)由編譯器自動(dòng)釋放
#include<iostream>
#include<cstdlib>
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)釋放
	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做出改版,對(duì)返回值保留持續(xù)了)
	system("pause");
}

編譯器編譯時(shí)會(huì)提示不要返回局部變量或者臨時(shí)變量的地址。一般會(huì)被釋放產(chǎn)生問題(在2022VS中加入了更高的適配,對(duì)其做出了保留,但是不要如此使用)
堆區(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ù),由程序員手動(dòng)開辟,手動(dòng)釋放,釋放利用操作符delete
  • 語(yǔ)法 : new 數(shù)據(jù)類型
  • 利用new創(chuàng)建的數(shù)據(jù),會(huì)返回該數(shù)據(jù)對(duì)應(yīng)的類型的指針
  • 示例:
#include<iostream>
using namespace std;
//1、new的基本語(yǔ)法
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)釋放,再次訪問是非法操作,會(huì)報(bào)錯(cuò)
}
//2、在堆區(qū)利用new開辟一個(gè)數(shù)組
void test02()
{
	//創(chuàng)建10整型數(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í)候 要加【】才可以
	delete[] arr;
}
int main()
{
    test01();
	test02();
	system("pause");
	return 0;
}

到此這篇關(guān)于C++核心編程之內(nèi)存分區(qū)模型詳解的文章就介紹到這了,更多相關(guān)C++內(nèi)存分區(qū)模型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言中關(guān)于計(jì)算字符串長(zhǎng)度的幾種方式

    C語(yǔ)言中關(guān)于計(jì)算字符串長(zhǎng)度的幾種方式

    這篇文章主要介紹了C語(yǔ)言中關(guān)于計(jì)算字符串長(zhǎng)度的幾種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之堆排序源代碼

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之堆排序源代碼

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之堆排序源代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++多文件變量解析

    C++多文件變量解析

    大家注意不要在頭文件中定義變量,在頭文件中聲明變量。定義放在對(duì)應(yīng)的源文件中。其他地方只能用extern聲明
    2013-10-10
  • 基于C++字符串替換函數(shù)的使用詳解

    基于C++字符串替換函數(shù)的使用詳解

    本篇文章是對(duì)C++字符串替換函數(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++?繼承的范例講解

    C++?繼承的范例講解

    繼承是C++面向?qū)ο缶幊讨械囊婚T。繼承是子類繼承父類的特征和行為,或者是繼承父類得方法,使的子類具有父類得的特性和行為。重寫是子類對(duì)父類的允許訪問的方法實(shí)行的過(guò)程進(jìn)行重新編寫,返回值和形參都不能改變。就是對(duì)原本的父類進(jìn)行重新編寫,但是外部接口不能被重寫
    2022-06-06
  • C語(yǔ)言操作符超詳細(xì)講解下篇

    C語(yǔ)言操作符超詳細(xì)講解下篇

    C?語(yǔ)言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,賦值操作符,單目操作符,關(guān)系操作符,邏輯操作符,條件操作符等。本篇為第二篇,讓我們通讀本篇來(lái)詳細(xì)了解吧
    2022-04-04
  • C語(yǔ)言的分支和循環(huán)語(yǔ)句你了解嗎

    C語(yǔ)言的分支和循環(huán)語(yǔ)句你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的分支和循環(huán)語(yǔ)句,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • C++函數(shù)三種傳參形式(指針傳遞、引用傳遞、值傳遞)

    C++函數(shù)三種傳參形式(指針傳遞、引用傳遞、值傳遞)

    不論是哪種參數(shù)傳遞方式,都有形參和實(shí)參之分,本文主要介紹了C++函數(shù)三種傳參形式(指針傳遞、引用傳遞、值傳遞),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • 利用C++編寫一個(gè)Json解析器

    利用C++編寫一個(gè)Json解析器

    這篇文章主要為大家詳細(xì)介紹了如何利用C++編寫一個(gè)簡(jiǎn)單又好用的Json解析器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-03-03
  • visual studio 2013中配置opencv圖文教程 Opencv2.4.9安裝配置教程

    visual studio 2013中配置opencv圖文教程 Opencv2.4.9安裝配置教程

    這篇文章主要為大家詳細(xì)介紹了Opencv2.4.9安裝教程,以及在visualstudio 2013中opencv的配置步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04

最新評(píng)論