日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

C++內(nèi)存分區(qū)模型超詳細(xì)講解_C 語言

作者:溪午聞璐 ? 更新時間: 2022-12-26 編程語言

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

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

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

內(nèi)存四區(qū)意義:

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

2、程序運(yùn)行前

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

代碼區(qū):

? 存放 CPU 執(zhí)行的機(jī)器指令;

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

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

全局區(qū):

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

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

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

總結(jié):

  • C++中在程序運(yùn)行前分為全局區(qū)和代碼區(qū)
  • 代碼區(qū)特點(diǎn)是共享和只讀
  • 全局區(qū)中存放全局變量、靜態(tài)變量、常量
  • 常量區(qū)中存放 const修飾的全局常量 和 字符串常量

3、程序運(yùn)行后

棧區(qū):

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

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

示例:

int * func()
{
	int a = 10;
	return &a;
}
int main() {
	int *p = func();
	cout << *p << endl;
	cout << *p << endl;
	system("pause");
	return 0;
}

堆區(qū):

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

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

int* func()
{
    // 利用new關(guān)鍵字,可以將數(shù)據(jù)開辟到堆區(qū)
    // 指針 本質(zhì)上是局部變量,放在棧區(qū),指針保存的數(shù)據(jù)放在堆區(qū)
	int* a = new int(10); // new,開辟數(shù)據(jù)到堆區(qū),返回數(shù)據(jù)地址
	return a;
}
int main() {
	int *p = func();
	cout << *p << endl;
	cout << *p << endl;
	system("pause");
	return 0;
}

4、new操作符

C++中利用new操作符在堆區(qū)開辟數(shù)據(jù)?

堆區(qū)開辟的數(shù)據(jù),由程序員手動開辟,手動釋放,釋放利用操作符:delete

? 語法:new 數(shù)據(jù)類型

? 利用new創(chuàng)建的數(shù)據(jù),會返回該數(shù)據(jù)對應(yīng)的類型的指針

int* func()
{
	int* a = new int(10);
	return a;
}
int main() {
	int *p = func();
	cout << *p << endl;
	cout << *p << endl;
    // 堆區(qū)的數(shù)據(jù),由程序員管理開辟(new),程序員管理釋放(delete)
	// 利用delete釋放堆區(qū)數(shù)據(jù)
	delete p;
	//cout << *p << endl; //報錯,釋放的空間不可訪問
	system("pause");
	return 0;
}

示例:開辟數(shù)組

//堆區(qū)開辟數(shù)組
int main() {
	int* arr = new int[10];
	for (int i = 0; i < 10; i++)
	{
		arr[i] = i + 100;
	}
	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << endl;
	}
	//釋放數(shù)組 delete 后加 []
	delete[] arr;
	system("pause");
	return 0;
}

原文鏈接:https://blog.csdn.net/sssxlxwbwz/article/details/128060246

欄目分類
最近更新