常見的程式崩潰的原因:
由assert()觸發的;
操作記憶體時,越界了;
記憶體沒有被初始化就拿去用了;
棧溢位了;
使用了野指標。
總之,非法操作記憶體會對引起程式崩潰。
c中動態記憶體管理方式:
使用malloc/calloc/realloc/free進行動態記憶體管理。
malloc、calloc、realloc的相同點與不同點:
相同點:
都是在堆上開闢空間的。
都是通過free來釋放空間的。
返回值:成功都是void*,失敗都是null。
不同點:(體現在每個函式的功能和引數列表不同)
malloc只負責把空間開闢出來。malloc(位元組數)
calloc(單個元素所佔位元組數的大小,需要的元素個數)
realloc對空間進行擴增和縮減,
realloc(位址,新開闢空間的大小)
// 如果新的大小大於原記憶體大小,則新分配不會被初始化;
// 如果新的大小小於原記憶體大小,則可能會導致部分資料丟失
面試題:什麼是記憶體洩露?如何檢測乙個系統是否存在記憶體洩露?
常見的記憶體洩露:
void memoryleaks()
c++記憶體管理方式:
c語言記憶體管理方式在c++中可以繼續使用,但盡量使用自己的記憶體管理方式:c++中通過new和delete運算子進行動態記憶體管理
void testnewdelete()
int main()
c語言動態申請記憶體空間須:
申請後要對其進行判空。
要傳入想要申請的位元組數。
若要接受開闢的這段空間,必須對其進行型別轉化。
c++不需要。
注意:
1. new和delete是運算子,而不是函式;但malloc / calloc / realloc / free都是函式。
2. new和delete、new和delete一定要匹配使用!!!否則會出現記憶體洩露甚至程式發生崩潰。
malloc/free和new/delete比較
測試malloc和free、new和delete、new和delete都沒有匹配起來時:
void test()
int main()
上述**能通過編譯,也能正常執行,不存在記憶體洩露
構造test類,再來測試以下**:
class test
/*~test()
*/};void main()
c語言動態記憶體分配 C 動態記憶體分配
動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...
C 中的動態記憶體分配
目錄 為什麼分配動態記憶體?堆的別名 空閒儲存器 new 和 delete 操作符 為陣列動態分配記憶體 在程式中處理固定數量的變數,這樣的應用非常有限。經常需要在執行期間根據程式的輸入資料來決定應給儲存不同型別的變數分配的空間量。例如,如果需要儲存乙個班的學生資訊,由於學生數目不固定,學生的名字長...
c 動態記憶體分配
c語言中提供的動態記憶體分配為了解決陣列的靜態的分配方式的問題 即陣列大小必須在定義時指定,程式在執行時不能動態改變陣列的大小 在標準庫中提供了三個動態記憶體分配的函式供程式呼叫,下面將分別對這三個函式進行介紹 1.void malloc size t size malloc 在分配一段連續的記憶體...