C與C++經(jīng)典面試題(內(nèi)存泄露)_第1頁
C與C++經(jīng)典面試題(內(nèi)存泄露)_第2頁
C與C++經(jīng)典面試題(內(nèi)存泄露)_第3頁
C與C++經(jīng)典面試題(內(nèi)存泄露)_第4頁
C與C++經(jīng)典面試題(內(nèi)存泄露)_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、C、C+語言面試題2007-07-15 18:571已知strcpy 函數(shù)的原型是:char *strcpy(char *strDest, const char *strSrc);其中strDest 是目的字符串,strSrc 是源字符串。不調(diào)用C+/C 的字符串庫函數(shù),請編寫函數(shù) strcpy答案:char *strcpy(char *strDest, const char *strSrc)if ( strDest = NULL | strSrc = NULL)return NULL ;if ( strDest = strSrc)return strDest ;char *tempptr =

2、 strDest ;while( (*strDest+ = *strSrc+) != 0);return tempptr ;2已知類String 的原型為:class Stringpublic:String(const char *str = NULL); / 普通構(gòu)造函數(shù)String(const String &other); / 拷貝構(gòu)造函數(shù) String(void); / 析構(gòu)函數(shù)String & operate =(const String &other); / 賦值函數(shù)private:char *m_data; / 用于保存字符串;請編寫String 的上述4

3、 個函數(shù)。答案:String:String(const char *str)if ( str = NULL ) /strlen在參數(shù)為NULL時會拋異常才會有這步判斷m_data = new char1 ;m_data0 = '0' ;elsem_data = new charstrlen(str) + 1;strcpy(m_data,str);String:String(const String &other)m_data = new charstrlen(other.m_data) + 1;strcpy(m_data,other.m_data);String &am

4、p; String:operator =(const String &other)if ( this = &other)return *this ;delete m_data;m_data = new charstrlen(other.m_data) + 1;strcpy(m_data,other.m_data);return *this ;String: String(void)delete m_data ;3.簡答3.1 頭文件中的ifndef/define/endif 干什么用?答:防止該頭文件被重復(fù)引用。3.2#include <filename.h> 和#

5、include “filename.h” 有什么區(qū)別?答:對于#include <filename.h> ,編譯器從標(biāo)準(zhǔn)庫路徑開始搜索filename.h對于#include “filename.h”,編譯器從用戶的工作路徑開始搜索filename.h3.3 在C+ 程序中調(diào)用被C 編譯器編譯后的函數(shù),為什么要加extern “C”?答:C+語言支持函數(shù)重載,C 語言不支持函數(shù)重載。函數(shù)被C+編譯后在庫中的名字與C 語言的不同。假設(shè)某個函數(shù)的原型為: void foo(int x, int y);該函數(shù)被C 編譯器編譯后在庫中的名字為_foo , 而C+ 編譯器則會產(chǎn)生像_foo_

6、int_int 之類的名字。C+提供了C 連接交換指定符號extern“C”來解決名字匹配問題。3.4 一個類有基類、內(nèi)部有一個其他類的成員對象,構(gòu)造函數(shù)的執(zhí)行順序是怎樣的。(Autodesk)答:先執(zhí)行基類的(如果基類當(dāng)中有虛基類,要先執(zhí)行虛基類的,其他基類則按照聲明派生類時的順序依次執(zhí)行),再執(zhí)行成員對象的,最后執(zhí)行自己的。3.5 請描述一個你熟悉的設(shè)計(jì)模式(Autodesk)3.6 在UML 中,聚合(aggregation)和組合(composition)有什么區(qū)別 Autodesk)答案:聚合關(guān)系更強(qiáng),類似于pages 和book 的關(guān)系;組合關(guān)系要弱,類似于books和booksh

7、elf 的關(guān)系。3.7C#和C+除了語法上的差別以外,有什么不同的地方?(Autodesk,Microsoft)答案:(C#我只是了解,不是很精通)(1) c#有垃圾自動回收機(jī)制,程序員不用擔(dān)心對象的回收。(2)c#嚴(yán)禁使用指針,只能處理對象。如果希望使用指針,則僅可在unsafe 程序塊中能使用指針。(3)c#只能單繼承。(4)必須通過類名訪問靜態(tài)成員。不能像C+中那樣,通過對象訪問靜態(tài)成員。(5)在子類中覆蓋父類的虛函數(shù)時必須用關(guān)鍵字override,覆蓋父類的方法要用關(guān)鍵字new3.8ADO.net 和ADO 的區(qū)別?答案:實(shí)際上除了“能夠讓應(yīng)用程序處理存儲于DBMS 中的數(shù)據(jù)“這一基本

8、相似點(diǎn)外,兩者沒有太多共同之處。但是ADO 使用OLE DB 接口并基于微軟的COM 技術(shù),而ADO.NET 擁有自己的ADO.NET 接口并且基于微軟的.NET 體系架構(gòu)。眾所周知.NET 體系不同于COM 體系,ADO.NET 接口也就完全不同于ADO和OLE DB 接口,這也就是說ADO.NET 和ADO是兩種數(shù)據(jù)訪問方式。ADO.net 提供對XML 的支持。3.9 New delete 與malloc free 的區(qū)別 ( Autodesk)區(qū)別: 1. new 自動計(jì)算需要分配的空間,而malloc要手動計(jì)算分配的空間。 2. new 是類型安全的,而malloc不是。 如: in

9、t * p = new double3; /編譯時能夠檢查出錯誤 int* p = malloc(n*sizeof(double);/編譯時不能夠檢查出錯誤 3. malloc/free需要庫文件支持,而new/delete不用。 4. operator new 對應(yīng)于malloc, 但operator new 可以重載,可以自定義內(nèi)存分配策略,甚至不做內(nèi)存分配。但malloc做不到。 5. new 能為非內(nèi)部數(shù)據(jù)分配動態(tài)內(nèi)存,而malloc不能。 3.9.2那為什么有了new/delete,還要malloc/free呢?3.10 #define DOUBLE(x) x+x (Autodesk

10、)i = 5*DOUBLE(10); i 是多少?正確的聲明是什么?答案:i 為60。正確的聲明是#define DOUBLE(x) (x+x)3.11 有哪幾種情況只能用intialization list 而不能用assignment? (Autodesk)答案:當(dāng)類中含有const、reference 成員變量;基類的構(gòu)造函數(shù)都需要參數(shù);類中含有其他類的成員對象,而該類的構(gòu)造函數(shù)都需要參數(shù)。3.11 C+是不是類型安全的? (Autodesk)答案:不是。兩個不同類型的指針之間可以強(qiáng)制轉(zhuǎn)換。C#是類型安全的。3.12 main 函數(shù)執(zhí)行以前,還會執(zhí)行什么代碼? (Autodesk)答案:

11、全局對象的構(gòu)造函數(shù)會在main 函數(shù)之前執(zhí)行。3.13 描述內(nèi)存分配方式以及它們的區(qū)別。 (Autodesk , Microsoft)答案:1) 從靜態(tài)存儲區(qū)域分配。內(nèi)存在程序編譯的時候就已經(jīng)分配好,這塊內(nèi)存在程序的整個運(yùn)行期間都存在。例如全局變量,static 變量。(2) 在棧上創(chuàng)建。在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時這些存儲單元自動被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集。(3) 從堆上分配,亦稱動態(tài)內(nèi)存分配。程序在運(yùn)行的時候用malloc 或new 申請任意多少的內(nèi)存,程序員自己負(fù)責(zé)在何時用free 或delete 釋放內(nèi)存。動態(tài)內(nèi)存的生存期由我們

12、決定,使用非常靈活,但問題也最多。3.14 什么是虛擬存儲器?virtual memory 怎樣映射到physical memory?頁面替換算法有哪些? (Microsoft)見操作系統(tǒng) p238 頁。掌握的頁面替換算法NRU(最近不用),F(xiàn)IFO,第二次機(jī)會頁面替換算法,LRU(最近最少使用算法)3.15 有四個同樣的容器,里面裝滿了粒數(shù)相同的藥丸,正常藥丸的質(zhì)量為m,變質(zhì)藥丸的質(zhì)量為m+1,現(xiàn)在已知這四個容器中,有一個裝的全是變質(zhì)藥丸,用電子秤只稱一次,找出哪個容器裝的是變質(zhì)藥丸 (Microsoft)答案:把四個容器依次編號為1、2、3、4,然后從中分別取出1、2、3、4 粒藥丸,稱這

13、10 粒藥丸的質(zhì)量,如果質(zhì)量為10m+1,則說明第一個容器裝的是變質(zhì)藥丸,如果為10m+2 則說明第二個裝的變質(zhì)藥丸,依次類推。3.16 比較一下C+中static_cast 和 dynamic_cast 的區(qū)別。 (Autodesk)dynamic_casts在幫助你瀏覽繼承層次上是有限制的。它不能被用于缺乏虛函數(shù)的類型上,它被用于安全地沿著類的繼承關(guān)系向下進(jìn)行類型轉(zhuǎn)換。如你想在沒有繼承關(guān)系的類型中進(jìn)行轉(zhuǎn)換,你可能想到static_cast3.17 Struct 和class 的區(qū)別 (Autodesk)答案:struct 中成員變量和成員函數(shù)默認(rèn)訪問權(quán)限是public,class 是pri

14、vate3.18 當(dāng)一個類A 中沒有生命任何成員變量與成員函數(shù),這時sizeof(A)的值是多少,如果不是零,請解釋一下編譯器為什么沒有讓它為零。(Autodesk)答案:肯定不是零。我舉個反例,如果是零的話,聲明一個class A10對象數(shù)組,而每一個對象占用的空間是零,這時就沒辦法區(qū)分A0,A1了 3.18 這道題我又找到答案了,為了確保每個對象都擁有唯一的地址!可查閱3.19 在8086 匯編下,邏輯地址和物理地址是怎樣轉(zhuǎn)換的?(Intel)答案:通用寄存器給出的地址,是段內(nèi)偏移地址,相應(yīng)段寄存器地址*10H+通用寄存器內(nèi)地址,就得到了真正要訪問的地址。3.20 描述一下C+的多態(tài) (m

15、icrosoft)答案:C+的多態(tài)表現(xiàn)在兩個部分,一個是靜態(tài)連編下的函數(shù)重載,運(yùn)算符重載;動態(tài)連編下的虛函數(shù)、純虛函數(shù)(抽象類)4.寫出BOOL,int,float,指針類型的變量a 與零的比較語句。答案:BOOL : if ( !a )int : if ( a = 0)float : const EXPRESSION EXP = 0.000001if ( a < EXP && a >-EXP)pointer : if ( a != NULL)5.請說出const 與#define 相比優(yōu)點(diǎn)答案:(1) const 常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型。編譯器可以對

16、前者進(jìn)行類型安全檢查。而對后者只進(jìn)行字符替換,沒有類型安全檢查,并且在字符替換可能會產(chǎn)生意料不到的錯誤。(2) 有些集成化的調(diào)試工具可以對const 常量進(jìn)行調(diào)試,但是不能對宏常量進(jìn)行調(diào)試。6簡述數(shù)組與指針的區(qū)別數(shù)組要么在靜態(tài)存儲區(qū)被創(chuàng)建(如全局?jǐn)?shù)組),要么在棧上被創(chuàng)建。指針可以隨時指向任意類型的內(nèi)存塊。(1)修改內(nèi)容上的差別char a = “hello”;a0 = X;char *p = “world”; / 注意p 指向常量字符串p0 = X; / 編譯器不能發(fā)現(xiàn)該錯誤,運(yùn)行時錯誤(2) 用運(yùn)算符sizeof 可以計(jì)算出數(shù)組的容量(字節(jié)數(shù))。sizeof(p),p 為指針得到的是一個指針

17、變量的字節(jié)數(shù),而不是p 所指的內(nèi)存容量。C+/C 語言沒有辦法知道指針?biāo)傅膬?nèi)存容量,除非在申請內(nèi)存時記住它。注意當(dāng)數(shù)組作為函數(shù)的參數(shù)進(jìn)行傳遞時,該數(shù)組自動退化為同類型的指針。char a = "hello world"char *p = a;cout<< sizeof(a) << endl; / 12 字節(jié)cout<< sizeof(p) << endl; / 4 字節(jié)計(jì)算數(shù)組和指針的內(nèi)存容量void Func(char a100)cout<< sizeof(a) << endl; / 4 字節(jié)而不是

18、100 字節(jié)7類成員函數(shù)的重載、覆蓋和隱藏區(qū)別答案:成員函數(shù)被重載的特征:(1)相同的范圍(在同一個類中);(2)函數(shù)名字相同;(3)參數(shù)不同;(4)virtual 關(guān)鍵字可有可無。覆蓋是指派生類函數(shù)覆蓋基類函數(shù),特征是:(1)不同的范圍(分別位于派生類與基類);(2)函數(shù)名字相同;(3)參數(shù)相同;(4)基類函數(shù)必須有virtual 關(guān)鍵字。“隱藏”是指派生類的函數(shù)屏蔽了與其同名的基類函數(shù),規(guī)則如下:(1)如果派生類的函數(shù)與基類的函數(shù)同名,但是參數(shù)不同。此時,不論有無virtual關(guān)鍵字,基類的函數(shù)將被隱藏(注意別與重載混淆)。(2)如果派生類的函數(shù)與基類的函數(shù)同名,并且參數(shù)也相同,但是基類函

19、數(shù)沒有virtual 關(guān)鍵字。此時,基類的函數(shù)被隱藏(注意別與覆蓋混淆)8There are two int variables: a and b, dont use “if”, “? :”, “switch”or other judgement statements, find out the biggest one of the twonumbers.答案:( ( a + b ) + abs( a b ) ) / 29如何打印出當(dāng)前源文件的文件名以及源文件的當(dāng)前行號?答案:cout << _FILE_ ;cout<<_LINE_ ;_FILE_和_LINE_是系統(tǒng)預(yù)

20、定義宏,這種宏并不是在某個文件中定義的,而是由編譯器定義的。10main 主函數(shù)執(zhí)行完畢后,是否可能會再執(zhí)行一段代碼,給出說明?答案:可以,可以用_onexit 注冊一個函數(shù),它會在main 之后執(zhí)行int fn1(void), fn2(void), fn3(void), fn4 (void);void main( void )String str("zhanglin");_onexit( fn1 );_onexit( fn2 );_onexit( fn3 );_onexit( fn4 );printf( "This is executed first.n&quo

21、t; );int fn1()printf( "next.n" );return 0;int fn2()printf( "executed " );return 0;int fn3()printf( "is " );return 0;int fn4()printf( "This " );return 0;The _onexit function is passed the address of a function (func) to be called when the program terminates nor

22、mally. Successive calls to _onexit create a register of functions that are executed in LIFO (last-in-first-out) order. The functions passed to _onexit cannot take parameters.11如何判斷一段程序是由C 編譯程序還是由C+編譯程序編譯的?答案:#ifdef _cpluspluscout<<"c+"#elsecout<<"c"#endif12文件中有一組整數(shù),要求

23、排序后輸出到另一個文件中答案:void Order(vector<int> &data) /起泡排序int count = data.size() ;int tag = false ;for ( int i = 0 ; i < count ; i+)for ( int j = 0 ; j < count - i - 1 ; j+)if ( dataj > dataj+1)tag = true ;int temp = dataj ;dataj = dataj+1 ;dataj+1 = temp ;if ( !tag )break ;void main( vo

24、id )vector<int>data;ifstream in("c:data.txt");if ( !in)cout<<"file error!"exit(1);int temp;while (!in.eof()in>>temp;data.push_back(temp);in.close();Order(data);ofstream out("c:result.txt");if ( !out)cout<<"file error!"exit(1);for ( i =

25、0 ; i < data.size() ; i+)out<<datai<<" "out.close();13排序方法比較 (intel)排序方法 平均時間 最壞時間 輔助存儲1:直接插入排序:插入排序的基本操作就是將一個數(shù)據(jù)插入到已經(jīng)排好序的有序數(shù)據(jù)中,從而得到一個新的、個數(shù)加一的有序數(shù)據(jù),算法適用于少量數(shù)據(jù)的排序,時間復(fù)雜度為O(n2)。2:起泡排序:依次比較相鄰的兩個數(shù),將小數(shù)放在前面,大數(shù)放在后面(時間復(fù)雜度為O(n2) n2/2-n/2,)3:選擇排序:每一趟從待排序的數(shù)據(jù)元素中選出最?。ɑ蜃畲螅┑囊粋€元素,順序放在已排好序的數(shù)列的最后

26、,直到全部待排序的數(shù)據(jù)元素排完。 選擇排序是不穩(wěn)定的排序方法(4)快速排序;通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序 n log n(5)堆排序; 二叉樹 堆排序的最壞時間復(fù)雜度為O(nlog2n)。(6)歸并排序;14一個鏈表的結(jié)點(diǎn)結(jié)構(gòu)struct Nodeint data ;Node *next ;typedef struct Node Node ;(1)已知鏈表的頭結(jié)點(diǎn)head,寫一個函數(shù)把這個鏈表逆序 ( Intel)Node * ReverseList(Node *head) /鏈表

27、逆序if ( head = NULL | head->next = NULL )return head;Node *p1 = head ;Node *p2 = p1->next ;Node *p3 = p2->next ;p1->next = NULL ;while ( p3 != NULL )p2->next = p1 ;p1 = p2 ;p2 = p3 ;p3 = p3->next ;p2->next = p1 ;head = p2 ;return head ;(2)已知兩個鏈表head1 和head2 各自有序,請把它們合并成一個鏈表依然有序。N

28、ode * Merge(Node *head1 , Node *head2)if ( head1 = NULL)return head2 ;if ( head2 = NULL)return head1 ;Node *head = NULL ;Node *p1 = NULL;Node *p2 = NULL;if ( head1->data < head2->data )head = head1 ;p1 = head1->next;p2 = head2 ;elsehead = head2 ;p2 = head2->next ;p1 = head1 ;Node *pcu

29、rrent = head ;while ( p1 != NULL && p2 != NULL)if ( p1->data <= p2->data )pcurrent->next = p1 ;pcurrent = p1 ;p1 = p1->next ;elsepcurrent->next = p2 ;pcurrent = p2 ;p2 = p2->next ;if ( p1 != NULL )pcurrent->next = p1 ;if ( p2 != NULL )pcurrent->next = p2 ;return he

30、ad ;(2)已知兩個鏈表head1 和head2 各自有序,請把它們合并成一個鏈表依然有序,這次要求用遞歸方法進(jìn)行。 ( Autodesk)答案:Node * MergeRecursive(Node *head1 , Node *head2)if ( head1 = NULL )return head2 ;if ( head2 = NULL)return head1 ;Node *head = NULL ;if ( head1->data < head2->data )head = head1 ;head->next = MergeRecursive(head1-&g

31、t;next,head2);elsehead = head2 ;head->next = MergeRecursive(head1,head2->next);return head ;15分析一下這段程序的輸出 (Autodesk)class Bpublic:B()cout<<"default constructor"<<endl;B()cout<<"destructed"<<endl;B(int i):data(i)cout<<"constructed by parame

32、ter" << data <<endl;private:int data;B Play( B b)return b ;int main(int argc, char* argv)B temp = Play(5);return 0;請自己執(zhí)行一下看看。16.寫一個函數(shù)找出一個整數(shù)數(shù)組中,第二大的數(shù) (microsoft)答案:const int MINNUMBER = -32767 ;int find_sec_max( int data , int count) /類似于1 4 4 4這樣的序列將認(rèn)為1是第二大數(shù)int maxnumber = data0 ;in

33、t sec_max = MINNUMBER ;for ( int i = 1 ; i < count ; i+)if ( datai > maxnumber )sec_max = maxnumber ;maxnumber = datai ;elseif ( datai > sec_max )sec_max = datai ;return sec_max ;17 寫一個在一個字符串中尋找一個子串第一個位置的函數(shù)這個題目的一般算法比較簡單我就不給出了,如果要求高效率的話請參見數(shù)據(jù)結(jié)構(gòu)中的KMP 算法,不過在筆試時間有限情況下,寫出那個算法還是挺難的。 一、#include “fi

34、lename.h”和#include 的區(qū)別 #include “filename.h”是指編譯器將從當(dāng)前工作目錄上開始查找此文件 #include 是指編譯器將從標(biāo)準(zhǔn)庫目錄中開始查找此文件 二、頭文件的作用 加強(qiáng)安全檢測 通過頭文件可能方便地調(diào)用庫功能,而不必關(guān)心其實(shí)現(xiàn)方式 三、* , &修飾符的位置 對于*和&修飾符,為了避免誤解,最好將修飾符緊靠變量名 四、if語句 不要將布爾變量與任何值進(jìn)行比較,那會很容易出錯的。 整形變量必須要有類型相同的值進(jìn)行比較 浮點(diǎn)變量最好少比點(diǎn),就算要比也要有值進(jìn)行限制 指針變量要和NULL進(jìn)行比較,不要和布爾型和整形比較 五、const和#

35、define的比較 const有數(shù)據(jù)類型,#define沒有數(shù)據(jù)類型 個別編譯器中const可以進(jìn)行調(diào)試,#define不可以進(jìn)行調(diào)試 在類中定義常量有兩種方式 1、 在類在聲明常量,但不賦值,在構(gòu)造函數(shù)初始化表中進(jìn)行賦值; 2、 用枚舉代替const常量。 六、C+函數(shù)中值的傳遞方式 有三種方式:值傳遞(Pass by value)、指針傳遞(Pass by pointer)、引用傳遞(Pass by reference) void fun(char c) /pass by value void fun(char *str) /pass by pointer void fun(char &a

36、mp;str) /pass by reference 如果輸入?yún)?shù)是以值傳遞的話,最好使用引用傳遞代替,因?yàn)橐脗鬟f省去了臨時對象的構(gòu)造和析構(gòu) 函數(shù)的類型不能省略,就算沒有也要加個void 七、函數(shù)體中的指針或引用常量不能被返回 Char *func(void) char str=”Hello Word”; /這個是不能被返回的,因?yàn)閟tr是個指定變量,不是一般的值,函數(shù)結(jié)束后會被注銷掉 return str; 函數(shù)體內(nèi)的指針變量并不會隨著函數(shù)的消亡而自動釋放 八、一個內(nèi)存拷貝函數(shù)的實(shí)現(xiàn)體 void *memcpy(void *pvTo,const void *pvFrom,size_t si

37、ze) assert(pvTo!=NULL)&&(pvFrom!=NULL); byte *pbTo=(byte*)pvTo; /防止地址被改變 byte *pbFrom=(byte*)pvFrom; while (size- >0) *pbTo+ = *pbForm+; return pvTo; 九、內(nèi)存的分配方式 分配方式有三種,請記住,說不定那天去面試的時候就會有人問你這問題 1、 靜態(tài)存儲區(qū),是在程序編譯時就已經(jīng)分配好的,在整個運(yùn)行期間都存在,如全局變量、常量。 2、 棧上分配,函數(shù)內(nèi)的局部變量就是從這分配的,但分配的內(nèi)存容易有限。 3、 堆上分配,也稱動態(tài)分配,

38、如我們用new,malloc分配內(nèi)存,用delete,free來釋放的內(nèi)存。 十、內(nèi)存分配的注意事項(xiàng) 用new或malloc分配內(nèi)存時,必須要對此指針賦初值。 用delete 或free釋放內(nèi)存后,必須要將指針指向NULL 不能修改指向常量的指針數(shù)據(jù) 十一、內(nèi)容復(fù)制與比較 /數(shù)組 char a=”Hello Word!”; char b10; strcpy(b,a); if (strcmp(a,b)=0) /指針 char a=”Hello Word!”; char *p; p=new charstrlen(a)+1; strcpy(p,a); if (strcmp(p,a)=0) 十二、si

39、zeof的問題 記住一點(diǎn),C+無法知道指針?biāo)笇ο蟮拇笮。羔樀拇笮∮肋h(yuǎn)為4字節(jié) char a=”Hello World!” char *p=a; count< count< 而且,在函數(shù)中,數(shù)組參數(shù)退化為指針,所以下面的內(nèi)容永遠(yuǎn)輸出為4 void fun(char a1000) count< 十三、關(guān)于指針 1、 指針創(chuàng)建時必須被初始化 2、 指針在free 或delete后必須置為NULL 3、 指針的長度都為4字節(jié) 、釋放內(nèi)存時,如果是數(shù)組指針,必須要釋放掉所有的內(nèi)存,如 char *p=new char100; strcpy(p,”Hello World”); del

40、ete p; /注意前面的號 p=NULL; 、數(shù)組指針的內(nèi)容不能超過數(shù)組指針的最大容易。 如: char *p=new char5; strcpy(p,”Hello World”); /報(bào)錯 目標(biāo)容易不夠大 delete p; /注意前面的號 p=NULL; 十四、關(guān)于malloc/free 和new /delete l malloc/free 是C/C+的內(nèi)存分配符,new /delete是C+的內(nèi)存分配符。 l 注意:malloc/free是庫函數(shù),new/delete是運(yùn)算符 l malloc/free不能執(zhí)行構(gòu)造函數(shù)與析構(gòu)函數(shù),而new/delete可以 l new/delete不能

41、在C上運(yùn)行,所以malloc/free不能被淘汰 l 兩者都必須要成對使用 l C+中可以使用_set_new_hander函數(shù)來定義內(nèi)存分配異常的處理 如何查出內(nèi)存泄漏和非法操作的BUG(在Release版本下)? 檢查window (release)下的內(nèi)存泄漏 1、 放置關(guān)鍵字 assert() 2、 生成map 文件。它并不往可執(zhí)行文件exe 中添加任何東西,只是在編譯的時候?qū)⒏鱾€函數(shù)入口地址記錄在后綴為.map的文件中,程序崩潰的時候可以得到一個EIP地址,通過地址知道崩潰所在函數(shù) 3、 可以設(shè)置斷點(diǎn),在希望設(shè)置斷點(diǎn)的地方加入 _ASM int 3 4、 可以通過編譯時的匯編程序看出 5、 采用第三方工具十五、+的特性 +新增加有重載(overload),內(nèi)聯(lián)(inline),Const,Virtual四種機(jī)制 重載和內(nèi)聯(lián):即可用于全局函數(shù),也可用于類的成員函數(shù); Const和Virtual:只可用于類的成員函數(shù); 重載:在同一類中,函數(shù)名相同的函數(shù)。由不同的參數(shù)決定調(diào)用那個函數(shù)。函數(shù)可要不可要Virtual關(guān)鍵字。和全局函數(shù)同名的函數(shù)不叫重載。如果在類中調(diào)用同名的全局函數(shù),必須用全局引用符號:引用。 覆蓋是指派生類函數(shù)覆蓋基類函數(shù) 函數(shù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論