c 之記憶體管理

2021-06-20 09:19:59 字數 1925 閱讀 1729

c++使用3

種不同解決方案儲存資料,區別是資料保留在記憶體中的時間

兩種儲存持續性為自動:自動變數和暫存器變數(

register

沒有記憶體位址)(堆疊)

在函式外定義的變數和使用關鍵字static定義的變數的儲存持續性都為靜態.分為

3 外部鏈結性,內部鏈結性和無鏈結性

所有靜態變數都有下面的兩個初始化特徵:

1.未被初始化的靜態變數的所有位數都被設定成0

2.只能使用常量表示式來初始化靜態變數

對於鏈結性為外部的變數,有且只有乙個檔案中包含了該變數的外部定義。其他檔案要引用該變數,必須在引用宣告中使用關鍵字extern

#include

//全域性變數

using

namespace

std;

intgloble = 10;

//定義

intab(

inta

,intb,

int*p)

儲存描述

持續性作用域

鏈結性如何宣告

自動自動

**塊無

在**塊中宣告(可使用關鍵字auto)

暫存器自動

**塊無

在**塊中使用關鍵字register

靜態,無鏈結性

靜態**塊

無在**塊中使用關鍵字static

靜態,外部鏈結性

靜態檔案

外部在函式外部

靜態,內部鏈結性

靜態檔案

內部在函式外部使用關鍵字static /*

*c++的訪問修飾符

*主要有:const--常數型,volatile--暫態型

*1.const--常數型

*const型變數在程式執行期間是不可以改變的,編譯程式可以隨意的將這些變數放到唯讀儲存器rom中

*const用途:可以阻止引數被修改,即當乙個指標傳送給乙個函式後,函式可能修改該指標所指向的變數,然而,如果指標在引數說明段

*用const修飾,函式就無法修改指標所指的內容了。

*通常,當乙個標準庫函式不必修改呼叫引數指引的物件時,引數則用const來修飾,

*2.volatile

*volatile通知編譯器:變數值可能由程式中沒有顯示說明的方式所改變。

*全域性變數的位址可能被傳遞到作業系統的時針子程式,用來儲存系統實時時間。

*引用修飾符volatile的原因:大多數c編譯程式都假定表示式內部的內容不變,並以這一假定來自動優化某些表示式。

*有些編譯程式都假定表示式內部的內容不變,並以這一假定來自動優化某些表示式。有些編譯程式在編譯時還有改變表示式的計算順序,volatile

*可以防止這些改變發生。

*const 和volatile可以一起使用,例如:如果假定0x80是僅由外部條件改變的埠的值,那麼下面說明既可以消除使用者希望防止的說有偶發***:

*const volatile unsigned char * port=0x80;*/

用new操作符分配的記憶體將一直存在,直到使用delete操作符將其釋放或程式終止

placement new操作符:

#include #include //1.引入new標頭檔案

const int buf = 512;

const int n = 5;

char buffer[buf];//2.

int main()

{ using namespace std;

double * pd1,* pd2;

cout<<"calling new and placement new:\n";

pd1 = new double[n];//

pd2 = new (buffer) double[n];//3.定義

for (int i =0 ;i

C 之記憶體管理

malloc calloc realloc 上述三種方式是使用者在堆上開闢空間的辦法,用完後必須用free釋放,否則會造成記憶體洩露。值得一提的是實際開闢的記憶體比申請的空間大 前面多申請32個位元組,後面多申請4個位元組。具體原因這裡就不再闡述,詳情見c語言動態分配記憶體 c語言記憶體管理方式在c...

C 之記憶體管理介紹

申請記憶體,使用運算子 new 釋放記憶體,使用運算子 delete 申請記憶體 int p new int 釋放記憶體 delete p.申請乙個塊記憶體 int arr new int 10 釋放塊記憶體 delete arr 判斷申請記憶體是否失敗 if null p 則說明記憶體分配失敗了,...

c基礎之記憶體管理

一 作用域 全域性變數和區域性變數 靜態全域性和區域性變數 總結 型別作用域 生命週期 區域性變數 int a 10 從變數定義到函式結束 區域性變數建立到函式結束 全域性變數 int a 10 整個專案檔案 程式建立到程式結束 static 區域性變數 int a 10 從變數定義到函式結束 程式...