幾個常用的內存分配函數
void* malloc(size_t size)
void* calloc(size_t memb,size_t size)
void* realloc(void *p,size_t size)
void* aligned_alloc(siee_t alignment, size_t size)
所引發的錯誤
- 1.初始化錯誤
- 2.未檢查返回值
- 3.對空指針或無效指針解引用
- 4.引用已釋放的內存
- 5.對同一塊內存釋放多次
- 6.內存泄漏
- 7.零長度分配
1.初始化錯誤
使用malloc()函數在堆區申請的內存塊,可能是上一個程序的遺留,具有隱私信息; 由此引發了三個標準
1."不要假定內存分配函數已經初始化" -(C安全編碼標準)
2."不要引用未初始化內存 " -(C安全編碼標準)
3."清除可能重複使用資源中的敏感信息" -(C安全編碼標準)
2.未檢查返回值
sign* start = malloc(nmuOfRecodrds * sizeof(sign));
sign* point=(sign*)start;
point=start+tempNum-1;
3.空指針或無效指針解引用
無效指針解引用:就是指引用無效值:空指針,
未按照指定對象類型的正確對齊地址,生存週期結束後的對象地址;
4.引用已釋放的內存
看對象所存儲的內存模型是哪裏,還有他的生命週期;
如:
當原有的內存被釋放,但是內存地址被保留到*p中,而後另外一個函數,
被重新分配到與它對齊大小的數據塊,然後*p就可以使用這一塊內存。
5.對同一塊內存釋放多次
int main(void){
char* a=NULL ;
char* b=NULL;
a=(char *)malloc(sizeof(char)*3);
free(a);
b=(char *)malloc(sizeof(char)*3);
free(a);
return 0;
}
6.內存泄漏
這個問題是我最早接觸的關於內存的問題,簡單來說就是內存沒有回收。
實際上可能引出很多問題,如果攻擊者可以引用內存分配函數,
而且還沒有被釋放掉,就可能導致拒絕服務攻擊。
還有就是其實堆內存是由操作系統管理的,如果main函數結束之後,堆就會清空
,就以目前的內存來說,這根本就不足以造成很大的影響,
但是如果內存泄漏是發生在一個多次引用的函數中,如dll或者so中,就會造成很大的影響
7.零長度分配
暫時沒怎麼看懂,但是我瞭解到零長度數組在struct中的作用,
結束一個帶有零長度數組的結構,以允許該數組根據需要動態調整大小.這非常方便,當我想確定我的struct在運行時而不是編譯時佔用的空間量時,
可以節省大量內存。c99支持,gcc也支持,但是vs不支持