記憶體管理 new

2021-10-25 11:46:47 字數 4499 閱讀 4449

作用域:作用的範圍

a.普通區域性變數

#include

intmain

(int argc,

char

*ar**)

內部定義的變數就是區域性變數

//只有執行到定義變數的這個語句,系統才會給這個變數分配空間

//當離開{},這個非static區域性自動釋放

//區域性變數的作用域在當前的{},離開此{},無法使用此變數

//{}的普通區域性變數,加不加auto關鍵字等價,普通區域性變數也加自動變數

//不同的{}中,變數名字可以一樣

//普通區域性變數不初始化,它的數為隨機數

int tmp=11;

}

a=11;

//err因為a只有在上面的{}內有效

}

b.static區域性變數
#include

//在{}內部定義的變數就是區域性變數

//static區域性變數,實在編譯階段就已經分配空間,函式沒有調研前,它就已經存在

//當離開{},static區域性變數不會釋放,只有程式結束,static變數才會自動釋放

//區域性變數的作用域在當前的{},離開此{},無法使用此變數

//{}的普通區域性變數,加不加auto關鍵字等價,普通區域性變數也加自動變數

//不同的{}中,變數名字可以一樣

//如果static區域性變數不初始化,

//如果static區域性變數不初始化,它的值預設為0

//static區域性變數初始化語句,只會執行一次,但是可以賦值多次

//static變數只能用常量初始化

void

fun(

)void

static_fun()

intmain

(int argc,

char

*ar**)

c.普通區域性變數和static區域性變數的區別

記憶體分配和釋放

普通區域性變數只有執行到定義變數的語句才分配空間

static區域性變數在編譯階段(函式還沒有執行),變數的空間已經分配

static區域性變數只有在整個程式結束才自動釋放

初始化

普通區域性變數不初始化,值為隨機數

static區域性變數不初始化,值為0

static區域性變數初始化語句只有第一次執行時有效

static區域性變數只能用常量初始化

d.普通全域性變數

#include

//在{}外面(函式外面)定義的變數為全域性變數

//只有定義了全域性變數。任何地方都能使用此變數

//如果使用變數時,在前面找不到此全域性變數的定義,需要宣告才能使用

//全域性變數不初始化,預設賦值為0

//宣告只是針對全域性變數,不是針對區域性變數

//全域性變數只能定義一次,但是能宣告多次

//全域性變數在編譯階段已經分配空間(函式沒有執行前),只有在整個程式結束,才自動釋放

void

fun2()

void

fun3()

int a=10;

void

fun(

)int

main()

e.c語言全域性變數的缺陷
#include

int a;

int a;

int a=0;

//定義,其他為宣告

int a;

int a;

int b;

int b;

int b;

int b;

//有一次是定義,其他為宣告

//如果定義乙個全域性變數,沒有賦值,無法確定是定義還是宣告

f.c語言全域性變數宣告和定義的建議寫法
#include

//定義乙個全域性變數,建議初始化

int a=10;

//如果宣告乙個全域性變數,建議加extern

extern

int a;

g.static全域性變數

static全域性變數和普通全域性變數的區別就是作用域不一樣(檔案作用域)

extern關鍵字只適用於普通全域性變數

乙個檔案只能有乙個static全域性變數

static全域性變數只能在當前檔案使用,別的檔案不能使用

不同檔案只能出現乙個普通全域性變數的定義

乙個檔案只能有乙個static全域性變數的定義,不同檔案間的static全域性變數就算名字相同,也是沒有關係的兩個變數

h.普通函式和static函式的區別(檔案作用域)

所以檔案只能有乙個普通函式的定義

乙個檔案可以有乙個static函式的定義

普通函式所有檔案都能呼叫,前提是使用前宣告

static函式只能在定義所在的檔案中使用

i.總結

型別作用域

生命週期

auto變數

一對{}內

當前函式

static區域性變數

一對{}內

整個程式執行期

extern變數

整個程式

整個程式執行期

static全域性變數

當前檔案

整個程式執行期

extern函式

整個程式

整個程式執行期

static函式

當前檔案

整個程式執行期

register變數

一對{}內

當前函式

在程式沒有執行前,有幾個記憶體分割槽已經確定,雖然分割槽確定,但是沒有載入記憶體,程式只有執行時才載入記憶體:

當執行程式,載入記憶體,首先根據前面確定的記憶體分割槽(text,data,bsss)先載入,然後額外載入兩個區

#include

#include

intmain()

;int

*p=(

int*

)malloc

(1000000000

*sizeof

(int))

;if(p==null)

return0;

}

a.memset()
#include

void

*memset

(void

*s,int c,size_t n)

;//功能:將s的記憶體區域的前n個字元以引數c填入

//引數:

//c:填充的字元:c雖然引數為int,但必須是unsigned char,範圍為0~255

//n:指定需要設定的大小

int a[10]

;memset

(a,0

,sizeof

(a))

;memset

(a,97

,sizeof

(a))

;int i=0;

for(i=

0;i<

10;i++

)

#include

#include

intmain()

b.memcpy的使用
#include

intmain()

c.memmove和memcmp的使用
#include

intmain()

;int b[10]

;//第3個引數是指拷貝記憶體的總大小

memcpy

(b,a,10*

sizeof

(int))

;memcpy

(b,a,

sizeof

(a))

;//使用memcpy()最好別出現記憶體重疊

//如果出現記憶體重疊,最好使用memmove

memcpu

(&a[2]

,a,5

*sizeof

(int))

;//err

memmove

(&a[2]

,a,5

*sizeof

(int))

;}

#include

intmain()

//malloc(sizeof(int));

//引數是指定堆區分配多大的空間

//失敗返回null

#include

#include

intmain()

//動態分配的空間,如果程式沒有結束,不會自動釋放

//一般使用完,需要人為釋放free()

//free(p);不是釋放p變數,而是釋放p所指向的記憶體

//同一塊堆區記憶體只能釋放一次、

//釋放不是指記憶體消失,而是指這塊記憶體使用者不能再使用,系統**了,如果使用者再用,就是操作非法記憶體

//記憶體洩漏:動態分配了空間,不釋放

C C 記憶體管理 new和delete

c 語言中的動態記憶體管理方式有malloc calloc realloc 和 free,但是 malloc 和 free 是函式,new 和 delete 是 c 用於管理堆記憶體的兩個運算子 1.內建型別操作void test1 動態申請10個int型別的空間。並初始化為 delete p1 d...

C 記憶體管理new和operator new

在c 中我們知道函式可以進行過載,而一些操作符也是可以過載的。比如new和delete操作符。我們知道new和delete是c 中負責申請記憶體空間和釋放空間的。針對與系統內建型別的變數的使用和操作就不過多介紹。今天看看針對於某個物件的使用。先給出乙個簡單的test類 class test test...

動態管理記憶體之new和delete

cpp中使用new運算子來動態申請特定數量的記憶體。一般通過new顯示申請的內存在變數銷毀的時候要通過delete顯示釋放記憶體還給系統。使得這塊記憶體空間可以被作業系統 以作它用。假如程式中動態分配了很多記憶體空間,但使用完畢後都不釋放,則這些空間無法用於儲存別的資料,將造成嚴重的記憶體浪費。一 ...