記憶體管理
記憶體的分配方式
答:分配方式有三種,
1、 靜態儲存區,是在程式編譯時就已經分配好的,在整個執行期間都存在,如全域性變數、常量。
2、 棧上分配,函式內的區域性變數就是從這分配的,但分配的記憶體容易有限。
3、 堆上分配,也稱動態分配,如我們用new,malloc分配記憶體,用delete,free來釋放的記憶體
new/delete 與 malloc()/free() 的區別?
malloc() 與 free() 是c語言的標準庫函式, new/delete 是c++的運算子, 他們都可以用來申請和釋放記憶體, malloc()和free()不在編譯器控制許可權之內, 不能把建構函式和析構函式的任務強加給他們
記憶體分配的注意事項
用new或malloc分配記憶體時,必須要對此指標賦初值。
用delete 或free釋放記憶體後,必須要將指標指向null
關於malloc/free 和new /delete
malloc/free 是c/c+的記憶體分配符,new /delete是c++的記憶體分配符。
注意:malloc/free是庫函式,new/delete是運算子
malloc/free不能執行建構函式與析構函式,而new/delete可以
new/delete不能在c上執行,所以malloc/free不能被淘汰
兩者都必須要成對使用
c++中可以使用_set_new_hander函式來定義記憶體分配異常的處理
delete與 delete 區別
delete只會呼叫一次析構函式,而delete會呼叫每乙個成員的析構函式。在more effective c++中有更為詳細的解釋:「當delete操作符用於陣列時,它為每個陣列元素呼叫析構函式,然後呼叫operator delete來釋放記憶體。」delete與new配套,delete 與new 配套
memtest *mtest1=new memtest[10];
memtest *mtest2=new memtest;
int *pint1=new int [10];
int *pint2=new int;
deletepint1; //-1-
deletepint2; //-2-
deletemtest1;//-3-
deletemtest2;//-4-
在-4-處報錯。
這就說明:對於內建簡單資料型別,delete和delete功能是相同的。對於自定義的複雜資料型別,delete和delete不能互用。delete刪除乙個陣列,delete刪除乙個指標。簡單來說,用new分配的記憶體用delete刪除;用new分配的記憶體用delete刪除。delete會呼叫陣列元素的析構函式。內部資料型別沒有析構函式,所以問題不大。如果你在用delete時沒用括號,delete就會認為指向的是單個物件,否則,它就會認為指向的是乙個陣列。
new,delete和malloc,free的用法
malloc和freememtest *mtest1=new memtest[10];
memtest *mtest2=new memtest;
int *pint1=new
int [10];
int *pint2=new
int;
deletepint1;
deletepint2;
以下是幾個對於可能出現記憶體洩露的問題char *p = (char *) malloc( 100 )//分配記憶體
if ( *p == null ) //檢視記憶體是否分配成功
free( p ) // 釋放記憶體
p = null
//將記憶體置為空,防止也指標的出現
1.
2.void test1()
//字串str1需要11個位元組才能存放下(包括末尾的』\0』),而string只有10個位元組的空間,strcpy會導致陣列越界
3.void test2()
strcpy( string, str1 );
} //如果面試者指出字元陣列str1不能在陣列內結束可以給3分;如果面試者指出strcpy(string,str1)呼叫使得從str1記憶體起複製到string記憶體起所複製的位元組數具有不確定性可以給7分,在此基礎上指出庫函式strcpy工作方式的給10分
4.void test3(char* str1)
} //if(strlen(str1)<= 10)應改為if(strlen(str1) < 10),因為strlen的結果未統計』\0』所占用的1個位元組
5.void getmemory( char *p )
void test( void )
//傳入中getmemory(char *p )函式的形參為字串指標,在函式內部修改形參並不能真正的改變傳入形參的值,執行完char *str = null;
//getmemory( str );
//後的str仍然為null
6.char *getmemory( void )
void test( void )
//char p = "hello world";
//return p; 的p陣列為函式內的區域性自動變數,在函式返回後,記憶體已經被釋放。這是許多程式設計師常犯的錯誤,其根源在於不理解變數的生存期
7.void getmemory( char **p, int num )
void test( void )
//getmemory避免了試題4的問題,傳入getmemory的引數為字串指標的指標,但是在getmemory中執行申請記憶體及賦值語句
//*p = (char *) malloc( num );後未判斷記憶體是否申請成功,應加上:
//if ( *p == null )
//
8.void test( void )
//char *str = (char *) malloc(100);後未進行記憶體是否申請成功的判斷;另外,在free(str)後未置str為空,導致可能變成乙個「野」指標,應加上:
//str = null
總結:swap( int* p1,int* p2 )
//p是乙個「野」指標,有可能指向系統區,導致程式執行的崩潰
1.字串是以「\0」結尾的,在拷貝資料的時候,不要忘了陣列
2.strcpy(s1,s2);strcpy函式的意思是:把字串s2中的內容copy到s1中,連字串結束標誌也一起copy,當遇到」\0」作為結束符
3 strlen是計算字串的位元組數,不算』\0』所占用的1個位元組
4 函式內部修改形參並不能真正的改變傳入形參的值
5 函式中的區域性自動變數,在函式返回後,記憶體已經被釋放
6 申請了記憶體應該判斷是否申請成功
7 對於釋放記憶體之後,應該把他置為null,防止也指標的出現
C 面試題(一)
1.介紹一下stl,詳細說明stl如何實現vector。answer stl 標準模版庫,standard template library 它由容器演算法迭代器組成。stl有以下的一些優點 可以方便容易地實現搜尋資料或對資料排序等一系列的演算法 除錯程式時更加安全和方便 即使是人們用stl在uni...
C 經典面試題 一
最近看一些面試題,覺得如果自己被問到了,並不能很利落的回答出來。一是從來沒有這個意識,二是沒有認真的梳理下。1.c和c 中struct有什麼區別?1 c 中的struct類似於class,有變數,有建構函式 虛函式等,有繼承,多型等類的特徵 2 c中的struct只有變數,不能有函式,但是可以有函式...
C 面試題集(一)
1.c 中指標的優缺點有哪些 答案 優點 1 提高程式的編譯效率和執行速度。2 通過指標可使用主調函式和被調函式之間共享變數或資料結構,便於實現雙向資料通訊。3 可以實現動態的儲存分配。4 便於表示各種資料結構,編寫高質量的程式。缺點 1 使用未正確初始化的指標導致程式崩潰 2 引用已釋放的指標 3...