C++程序在執行時,將內存大方向劃分爲4個區域
- 代碼區:存放函數體的二進制代碼,由操作系統進行管理的(程序狗寫的)
- 全局區:存放全局變量和靜態變量以及常量
- 棧區:由編譯器自動分配釋放, 存放函數的參數值,局部變量等
- 堆區:由程序員分配和釋放,若程序員不釋放,程序結束時由操作系統回收
代碼區:
特點:共享(只有一份),只讀(不可修改)
全局區:
存放全局變量和靜態變量以及常量
static int a=10;靜態常量。
注意:
程序在運行之前:
有全局區和代碼區
代碼區的特點是共享和只讀
全局區有全局變量,靜態變量,常量
常量區有const修飾的全局常量和字符串常量。
const修飾的局部常量,局部變量在棧區
程序運行之後:
棧區:
////局部變量和形參都在棧區,
////由編譯器自動分配釋放, 存放函數的參數值(形參), 局部變量等
////注意事項:不要返回局部變量的地址,
棧區開闢的數據由編譯器自動釋放
如下代碼:
#include<iostream>
using namespace std;
#include<string>
#include <cstdlib>//解決system不明確問題。
#include<ctime>
int *dadd(int b) //b形參
{
b =100;
int a = 10;
return &a;
}
int main()
{
int* p= dadd(1);
////局部變量和形參都在棧區,
////由編譯器自動分配釋放, 存放函數的參數值, 局部變量等
////注意事項:不要返回局部變量的地址,棧區開闢的數據由編譯器自動釋放
cout << *p << endl;
cout << *p << endl;
system("pause");
return 0;
}
堆區:
由程序員分配釋放,若程序員不釋放,程序結束時由操作系統回收。
在C++中主要利用new在堆區開闢內存。
指針其實也是一個局部變量,在棧區,但是指針可以進行存放堆區的地址 由new 搞定。
堆區由程序員決定其生死
#include<iostream>
using namespace std;
#include<string>
#include <cstdlib>//解決system不明確問題。
#include<ctime>
int *func() //b形參
{
//指針其實也是一個局部變量,在棧區,但是指針可以進行存放堆區的地址 由new 搞定。
int *p=new int (10);//new int(10)返回一個堆區的地址,由指針接收。
//堆區由程序員決定其生死
return p;
}
int main()
{
int* p= func();//在堆區開闢數據。
cout << *p << endl;
cout << *p << endl;
system("pause");
return 0;
}
**C++中利用==new==操作符在堆區開闢數據**
堆區開闢的數據,由程序員手動開闢,手動釋放,釋放利用操作符 delete
語法:new 數據類型
利用new創建的數據,會返回該數據對應的類型的指針
1.基本語法。
2.堆區開闢數組。
代碼如下:
#include<iostream>
using namespace std;
#include<string>
#include <cstdlib>//解決system不明確問題。
#include<ctime>
int *func() //b形參
{
int *p=new int (10);
return p;
}
void test01()//1.基本語法
{
int* p = func();
cout << *p << endl;
cout << *p << endl;
cout << *p << endl;
delete p;//釋放堆區數據
cout << *p << endl;//報錯,釋放後不可操作。
}
void test02()//2.堆區開闢數組
{
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;
}
delete [] arr;
}
int main()
{
//test01();
test02();
system("pause");
return 0;
}