C語言堆記憶體管理上出現的問題,記憶體泄露,野指標使用,非法釋放指標,記憶體管理指標
C語言堆記憶體管理上出現的問題,記憶體泄露,野指標使用,非法釋放指標
(1)開闢的記憶體沒有釋放,造成記憶體泄露
(2)野指標被使用或釋放
(3)非法釋放指標
(1)開闢的記憶體沒有釋放,造成記憶體泄露,下面的例子就可能造成20個位元組的泄露,記憶體泄露不是一個立即會引發故障的錯誤,但是
它將消耗系統記憶體。
void function1(){char *pa;pa = (char*)malloc(sizeof(char)*20);if(NULL !=pa){strcpy(pa,”hello”);printf(“pa = %x\n”,(unsigned int)pa);printf(“pa = %s\s”,pa);}return;}
(2)野指標被使用或釋放
野指標是一個已經被釋放的記憶體指標,他指向的位置已經被使用free或者realloc函數釋放了,但是該指標依然在使用。
void function2(){char *pa;pa = (char*)malloc(sizeof(char)*20);if(NULL !=pa){strcpy(pa,”hello”);printf(“pa = %x\n”,(unsigned int)pa);printf(“pa = %s\s”,pa);}free(pa);printf(“ pa = %s”,pa);return;}
正確的記憶體釋放應該是下面的
void function2(){char *pa;pa = (char*)malloc(sizeof(char)*20);if(NULL !=pa){strcpy(pa,”hello”);printf(“pa = %x\n”,(unsigned int)pa);printf(“pa = %s\s”,pa);}free(pa);pa = NULL;if(NULL != pa){printf(“pa = %s\n”,(unsigned int)pa);}return;}
(3)非法釋放指標
void function3(){char a[20];int b;free(a);free(&b);return;}
上面的程式中,a[20]是一個棧上的數組,a是這塊記憶體的地址;b是棧上面的一個變數,&b是它的地址。這些棧上的記憶體,編譯器
將自動管理和回收資源,程式中使用free將他們釋放,是一種錯誤的寫法。
char *pa;pa = (char*)malloc(sizeof(char)*20);free(pa);free(pa);
上面的一段程式,將記憶體釋放兩次是錯誤的寫法,因為第一次釋放後,該地址已經變成,未分配的堆記憶體,free函數不能釋放未分配的堆記憶體。
char *pa;char *pa;pa = (char*)malloc(sizeof(char)*20);pb = pa++;free(pb);
在上面的程式中,雖然pa是一個被分配出的堆記憶體指標,pb作為pa的地址加1,也是一個堆記憶體的指標,而且這個指標所指向的也是已經分配的記憶體。然而記憶體pb依然是非法的記憶體釋放。這是由於這個指標並不是從malloc分配出來的,而是中間的一個指標值。
C語言指標問題--填空題 問:為何會發生記憶體泄露?
因為test函數中定義的str變數,並且在裡面申請了空間,但是當函數結束時,str也就結束了,所以無法釋放申請了的空間,自然泄露了!~
C++記憶體泄露,野指標含義
給個例子你就知道了
char* p1 = new char[10];
char*p2 = p1;
這時候 你釋放了p1
delete[] p1;
p1=NULL
但這時候p2還是不為NULL,它指向了一個已經被你釋放掉的記憶體,這就成了野指標了