C++后端知識總結(jié)

1:new delete 與 malloc free的區(qū)別

? ? 1-> new是C++運(yùn)算符,malloc是C的庫函數(shù)

? ? 2-> 通過new創(chuàng)建的是具有類型的,malloc返回的則是void * ,需要進(jìn)行類型強(qiáng)制轉(zhuǎn)換

? ? 3-> new可以自動調(diào)用構(gòu)造函數(shù),而malloc不會

? ? 4-> new失敗時會調(diào)用new_handler處理函數(shù),而malloc失敗直接返回null

? ? 5-> delete是C++運(yùn)算符,free是C標(biāo)準(zhǔn)庫函數(shù)

? ? 6-> delete自動調(diào)用對象的析構(gòu)函數(shù),而malloc不會

2:C++中explicit的作用

? ? 1-> 指定構(gòu)造函數(shù)或者轉(zhuǎn)換函數(shù)為顯式,它不能用于隱式轉(zhuǎn)換和復(fù)制初始化;

? ? 2-> 避免構(gòu)造函數(shù)的參數(shù)自動轉(zhuǎn)換成類對象的標(biāo)識符,vector構(gòu)造函數(shù)有explicit,string構(gòu) 造函數(shù)沒有explicit;

? ? 3-> explicit關(guān)鍵字只能用在類內(nèi)部的構(gòu)造函數(shù)聲明上;

? ? 4-> explicit關(guān)鍵字用作單個參數(shù)的構(gòu)造函數(shù);

? ? 5-> explicit關(guān)鍵字用來修飾類的構(gòu)造函數(shù),被修飾的構(gòu)造函數(shù)的類,不能發(fā)生相應(yīng)的隱式類型轉(zhuǎn)換;

3:進(jìn)程和線程的區(qū)別:進(jìn)程是火車,線程是車廂

? ? 1-> 線程=車廂線程在進(jìn)程下行進(jìn)(單純的車廂無法運(yùn)行)

? ? 2-> 一個進(jìn)程可以包含多個線程(一輛火車可以有多個車廂)

? ? 3-> 不同進(jìn)程間數(shù)據(jù)很難共享(一輛火車上的乘客很難換到另外一輛火車,比如站點換乘)

? ? 4-> 同一進(jìn)程下不同線程間數(shù)據(jù)很易共享(A車廂換到B車廂很容易)

? ? 5-> 進(jìn)程要比線程消耗更多的計算機(jī)資源(采用多列火車相比多個車廂更耗資源)

? ? 6-> 進(jìn)程間不會相互影響,一個線程掛掉將導(dǎo)致整個進(jìn)程掛掉(一列火車不會影響到另外一列 火車,但是如果一列火車上中間的一節(jié)車廂著火了,將影響到所有車廂)

? ? 7-> 進(jìn)程可以拓展到多機(jī),進(jìn)程最多適合多核(不同火車可以開在多個軌道上,同一火車的車 廂不能在行進(jìn)的不同的軌道上)

? ? 8-> 進(jìn)程使用的內(nèi)存地址可以上鎖,即一個線程使用某些共享內(nèi)存時,其他線程必須等它結(jié)束 ,才能使用這一塊內(nèi)存。(比如火車上的洗手間)-"互斥鎖"

? ? 9-> 進(jìn)程使用的內(nèi)存地址可以限定使用量(比如火車上的餐廳,最多只允許多少人進(jìn)入,如果 滿了需要在門口等,等有人出來了才能進(jìn)去)

4:產(chǎn)生死鎖的主要原因:

? ? 1-> 系統(tǒng)資源不足

? ? 2-> 進(jìn)程運(yùn)行推進(jìn)的順序不合適,

? ? 3-> 資源分配不當(dāng)

5:產(chǎn)生死鎖的必要條件

? ? 1-> 互斥條件:一個資源每次只能被一個進(jìn)程使用

? ? 2-> 請求與保持條件:一個進(jìn)程因請求資源阻塞時,對已經(jīng)獲得的資源保持不放

? ? 3-> 不剝奪條件:進(jìn)程已獲得的資源,在未使用之前不能強(qiáng)行剝奪

? ? 4-> 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系

6:TCP與UDP的區(qū)別:

? ? 1-> TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建 立連接

? ? 2-> TCP提供可靠的服務(wù)。也就是說,通過TCP連接傳送的數(shù)據(jù),無差錯,不丟失,不重復(fù),且按序到達(dá);UDP盡最大努力交付,即不保證可靠交付

? ? 3-> TCP面向字節(jié)流,實際上是TCP把數(shù)據(jù)看成一連串無結(jié)構(gòu)的字節(jié)流;UDP是面向報文的UDP 沒有擁塞控制,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會使源主機(jī)的發(fā)送速率降低(對實時應(yīng)用很有用,如 IP電話,實時視頻會議等)

? ? 4-> 每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信

? ? 5-> TCP首部開銷20字節(jié);UDP的首部開銷小,只有8個字節(jié)

? ? 6-> TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道

7: const的用法

? ? 1-> 在定義的時候必須進(jìn)行初始化

? ? 2-> 指針可以是const指針,也可以是指向const對象的指針

? ? 3-> 類的成員函數(shù)可以返回的是常成員變量,不能修改類的成員變量(mutable除外), 類的成員函數(shù)可以返回的是常對象,即被const聲明的對象

? ? 4>? 類的成員變量是常成員變量,必須在構(gòu)造函數(shù)的列表初始化

? ? 5-> 修飾變量,說明該變量不可以被改變,定義為const的形參在函數(shù)內(nèi)部是不能修改的

? ? 6-> 修飾指針,分為指向常量的指針(pointer to const)和自身是常量的指針(常量指針,const pointer);

? ? 7-> 修飾引用,指向常量的引用(reference to const),用于形參類型,即避免了拷貝,又避免了函數(shù)對值的修改;

? ? 8-> 修飾成員函數(shù),說明該成員函數(shù)內(nèi)不能修改成員變量

8:static的用法:

? ? 1-> 在函數(shù)體內(nèi),一個被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過程中其值保持不變

? ? 2-> 在模塊內(nèi)但在函數(shù)體外,一個被聲明為靜態(tài)的變量可以被模塊內(nèi)所有的函數(shù)訪問,但不能 被模塊外其他函數(shù)訪問,他是一個本地的全局變量

? ? 3-> 在模塊內(nèi),一個被聲明為靜態(tài)的函數(shù)只可能被這一塊內(nèi)的其他函數(shù)調(diào)用。

? ? 4-> 類內(nèi)的static成員變量屬于整個類所擁有,不能再類內(nèi)進(jìn)行定義,只能在類的作用域內(nèi)進(jìn)行定義

? ? 5-> 類的static成員函數(shù)屬于整個類擁有,不能包含this指針,只能調(diào)用static成員函數(shù)

? ? 6->修飾普通變量:修改變量的存儲區(qū)域和生命周期,使得變量存儲在靜態(tài)區(qū),在main函數(shù)運(yùn)行前就分配了內(nèi)存空間,如果有初始值就用初始值初始化,如果沒有,就用默認(rèn)的初始值初始化

? ? 7->修飾普通函數(shù),表示函數(shù)的作用范圍,僅僅在定義該函數(shù)的文件范圍內(nèi)可以使用,起到一個隱藏的作用

? ? 8->修飾成員變量,修飾成員變量使得所有的對象只保存一個該變量,而且不需要生成對象就可以訪問該成員

? ? 9-> 修飾成員函數(shù),修飾成員函數(shù)使得不需要生成對象就可以訪問該函數(shù),但是在static函數(shù)內(nèi)不能訪問非static成員。

9:指針和引用的區(qū)別

? ? 1-> 引用是直接訪問,指針是間接訪問,引用必須進(jìn)行初始化

? ? 2-> 引用是變量的別名,本身不單獨(dú)分配自己的內(nèi)存空間,而指針有自己的內(nèi)存空間

? ? 3-> 引用綁定內(nèi)存空間(必須賦值處置),一個變量名不能更改綁定,可以改變對象的值

10: struct和class的區(qū)別

? ? 1-> struct成員關(guān)鍵字也可以實現(xiàn)類,struct成員訪問級別為public,class的成員訪問級別為 private

? ? 2->class默認(rèn)為private繼承,struct保留字定義的人具有public繼承

11:C++中哪些不能是虛函數(shù)

? ? 1-> 構(gòu)造函數(shù),構(gòu)造函數(shù)聲明為虛函數(shù)時,那么由于對象未創(chuàng)建,還沒有內(nèi)存空間,沒有虛函數(shù)表地址來調(diào)用虛函數(shù)即構(gòu)造函數(shù)

? ? 2-> 內(nèi)聯(lián)函數(shù)在編譯時被展開,虛函數(shù)在運(yùn)行時才能動態(tài)綁定函數(shù),特指多態(tài)

? ? 3-> 友員函數(shù),因為不可以被繼承

? ? 4-> 靜態(tài)成員函數(shù),只有一個實體,不能被繼承,父子共同使用

12:內(nèi)聯(lián)函數(shù)與宏定義的區(qū)別:

? ? 1-> 內(nèi)聯(lián)函數(shù)必須是與函數(shù)體在一起才有效

? ? 2-> 在C++中,在類的內(nèi)部定義了函數(shù)體的的函數(shù),被默認(rèn)為是內(nèi)聯(lián)函數(shù),不管是不是有inline關(guān)鍵字。

? ? 3-> 內(nèi)聯(lián)函數(shù)在編譯時展開,宏在預(yù)編譯時展開

? ? 4-> 內(nèi)聯(lián)函數(shù)直接嵌入到目標(biāo)代碼,宏是做簡單的文本替換

? ? 5-> 內(nèi)聯(lián)函數(shù)有類型檢測,語法判斷等功能,而宏沒有

? ? 6-> inline函數(shù)是函數(shù),而宏不是函數(shù)

13: inline函數(shù)可以為虛函數(shù)嗎

? ? 1-> virtual函數(shù)可以為inline函數(shù),不會造成語法錯誤

? ? 2-> 虛函數(shù)是運(yùn)行才決定調(diào)用基類還是子類的對應(yīng)函數(shù),而inline則是在編譯時決定展開與否,因此若是多態(tài)的虛函數(shù),是不知道其會調(diào)用哪個函數(shù),在運(yùn)行時才會知道

14:寧可以pass-by-reference-to-const替換pass-by-value

? ? 1-> 但是該規(guī)則并不適合內(nèi)置類型,以及STL的迭代器和函數(shù)對象,對他們而言,pass-by-value比較合適

15 :輸入輸出操作符重載的標(biāo)準(zhǔn)模式如下所示:

? ? 1-> std::ostream &operator<< (std::ostream& os, const ClassA& ca);。而且重載類操作符應(yīng)該為非類成員函數(shù)

16 :C++異常處理涉及到三個關(guān)鍵字:try、catch、throw

? ? 1->try中的代碼標(biāo)示將被激活的特定異常,它后面通常會跟著一個或者多個catch塊

? ? 2->catch在你想要處理問題的地方,通過異常處理捕獲異常,catch關(guān)鍵字用于捕獲異常

? ? 3-> 當(dāng)問題出現(xiàn)時,程序會拋出一個異常,這是通過使用throw關(guān)鍵字來實現(xiàn)的

17 :smart pointer 也就是模板指針

? ? 1-> shared_ptr允許多個指針指向同一個對象,通??梢圆捎胢ake_shared進(jìn)行初始化 shared_ptr<int> p1 =make_shared<int>(42)

? ? 2-> shared_ptr都有一個關(guān)鍵的計數(shù)器,當(dāng)該shared_ptr初始化另一個shared_ptr,或者將他作為參數(shù)傳遞給一個函數(shù),以及作為函數(shù)的返回值會增加。當(dāng)給該

shared_ptr賦予一個新值或者被銷毀,離開其局部作用域,計數(shù)器就會被遞減

? ? 3-> 智能指針構(gòu)造函數(shù)是explicit的,因此不能將一個內(nèi)置指針隱式轉(zhuǎn)換為智能指針,必須使用直接初始化形式 shared_ptr<int> p1(new int(1024))

? ? 4-> 不要混合使用智能指針和普通指針

18 : nothrow 如果將nothow傳遞給new,就是告訴它我們不能拋出異常 --> int * ptr =new (std::nothrow)int(1024)

19 : NULL nullptr 0的區(qū)別

? ? 1-> 在C語言中NULL被定義為:一個為void *指針,指向的地址為0 #define NULL ((void *)0) ,在C++中,NULL會被定義為0

? ? 2-> 在寫C語言時,給指針變量賦值可以使用NULL。在使用C++語言時,可以使用0,使用空指針時,使用nullptr

20: 內(nèi)存泄漏

1->忘記delete內(nèi)存,容易造成內(nèi)存泄漏

2->釋放已經(jīng)釋放掉的對象

3->同一塊內(nèi)存釋放2次,因此delete之后需要重置指針

21 :拷貝構(gòu)造函數(shù)(深拷貝和淺拷貝)

? ? 1-> 拷貝構(gòu)造函數(shù)的參數(shù)必須要使用引用類型,賦值運(yùn)算符通常返回一個指向其左側(cè)運(yùn)算對象的引用

? ? 2-> 構(gòu)造函數(shù)初始化對象的非static數(shù)據(jù)成員,析構(gòu)函數(shù)釋放對象使用的資源,并且析構(gòu)非static數(shù)據(jù)成員

? ? 3-> 對于一個給定類,只會有唯一一個析構(gòu)函數(shù),與普通指針不同,智能指針成員在析構(gòu)階段會被自動銷毀

? ? 4-> 淺拷貝,只是增加了一個指針指向已經(jīng)存在的內(nèi)存地址;如果原地址發(fā)生改變,那么淺拷貝的對象也會發(fā)生改變,問題在于析構(gòu)的

時候回多次釋放重復(fù)地址。

? ? 5-> 深拷貝,是增加了一個指針并且申請了一個新的內(nèi)存,使這個增加的指針指向這個內(nèi)存;

22: 什么時候會調(diào)用析構(gòu)函數(shù)

? ? 1-> 變量在離開其作用域時會被銷毀

? ? 2-> 當(dāng)一個對象被銷毀時,其成員被銷毀

? ? 3-> 容器被銷毀時,其元素被銷毀

? ? 4-> 對于動態(tài)分配的對象,對它指向的指針應(yīng)用delete運(yùn)算符時被銷毀

? ? 5-> 對于臨時對象,當(dāng)創(chuàng)建它的完整表達(dá)式結(jié)束時被銷毀

23:? default 和 delete 構(gòu)造函數(shù)

? ? 1-> 可以對構(gòu)造函數(shù),拷貝構(gòu)造函數(shù),賦值重載函數(shù),析構(gòu)函數(shù)使用default。使用默認(rèn)的合成函數(shù)

? ? 2-> 防止拷貝,防止賦值可以使用delete,但是析構(gòu)函數(shù)不能使用這個delete函數(shù)

24: 四種顯式風(fēng)格轉(zhuǎn)換

? ? 1-> static_cast,在進(jìn)行上行轉(zhuǎn)換時,把子類的指針或者引用轉(zhuǎn)換成父類來表示,這種轉(zhuǎn)換是安全的。但是把父類的指針或者引用轉(zhuǎn)換為子類來表示,就是不安全的

? ? 2-> dynamic_cast,在進(jìn)行上行轉(zhuǎn)換時,與static_cast效果一樣.在進(jìn)行下行轉(zhuǎn)化時,具有類型檢查的功能,比static_cast更安全。

? ? 3-> reinpreter_cast 其必須有指針,編譯時不用檢查,type-id必須是一個指針、引用、算術(shù)類型、函數(shù)指針或者成員指針。它可以把一個指針轉(zhuǎn)換成一個整數(shù),也可以把一個整數(shù)轉(zhuǎn)換成一個指針(先把一個指針轉(zhuǎn)換成一個整數(shù),在把該整數(shù)轉(zhuǎn)換成原類型的指針,還可以得到原先的指針值)。

? ? 4-> const_cast 將轉(zhuǎn)換掉表達(dá)式的const性質(zhì),除了添加和刪除const特性,使用const_cast符來執(zhí)行其他任何類型的轉(zhuǎn)換都會引起編譯錯誤

25: 重載,覆蓋,隱藏的區(qū)別

? ? 1-> 重載,是指在同一個類內(nèi)(同一個范圍內(nèi)),函數(shù)名相同,函數(shù)參數(shù)不同,virtual關(guān)鍵字可有可無;

? ? 2-> 覆蓋,是指在不同的類內(nèi)(基類和子類),函數(shù)名相同,函數(shù)參數(shù)相同,且基類必須具有virtual關(guān)鍵字;

? ? 3-> 隱藏,是指在不同類內(nèi),函數(shù)名相同,函數(shù)參數(shù)相同則沒有vitrual關(guān)鍵字,函數(shù)參數(shù)不同則virtual關(guān)鍵字可有可無;

26: C++和C的區(qū)別

? ? 1-> C++仍然以C為基礎(chǔ),有區(qū)塊(blocks),語句(statements),預(yù)處理器(preprocessor),內(nèi)置數(shù)據(jù)類型,數(shù)組,指針;許多時候C++的解法不過就是較高級別的C解法

? ? 2-> Object_Oriented C++ ,C with class(構(gòu)造函數(shù),析構(gòu)函數(shù))封裝(encapsualtion),繼承(inheritance),多態(tài)(polymorphism),virtual函數(shù)動態(tài)綁定,這一部分是面 對對象設(shè)計之古典守則在C++上直接實施

? ? 3-> template C++,C++的泛型編程部分

? ? 4-> STL庫,STL是個template程序庫,它對容器(container),迭代器(iterators),算法(algorithms)以及函數(shù)對象(function objects)的規(guī)約有極佳的緊密配合與協(xié)調(diào)。

27: TCP/IP 4層模型

? ? 1-> 鏈路層,包括用于協(xié)作IP數(shù)據(jù)在已有網(wǎng)絡(luò)介質(zhì)上的傳輸協(xié)議,定義向地址解析協(xié)議(arp)協(xié)議,提供TCP/IP協(xié)議的數(shù)據(jù)結(jié)構(gòu)和實際物理硬件之間的接口;

? ? 2-> 網(wǎng)路層,本層包含IP協(xié)議,RIP協(xié)議,主要是負(fù)責(zé)數(shù)據(jù)的包裝、尋址和路由,同時還包含網(wǎng)絡(luò)間控制報文協(xié)議(ICMP)用來提供網(wǎng)絡(luò)診斷信息;

? ? 3-> 傳輸層,它主要提供兩種端到端的通信服務(wù),其中TCP協(xié)議提供可靠的數(shù)據(jù)流運(yùn)輸服務(wù),UDP協(xié)議提供不可靠的用戶數(shù)據(jù)報服務(wù);

? ? 4-> 應(yīng)用層,因特網(wǎng)的應(yīng)用層協(xié)議包括Finger,WHOIS,FTP(文本傳輸協(xié)議)、Gopher、HTTP(超文本傳輸協(xié)議),Telent(遠(yuǎn)程終端協(xié)議),SMTP(簡單郵件傳送協(xié)議),IRC(因特網(wǎng)中繼會話),NNTP(網(wǎng)絡(luò)新聞傳輸協(xié)議)

28:constexpr

1-> 怎么說呢,const修飾的是類型,constexpr修飾的是用來算出值的那段代碼

2-> constexpr函數(shù)必須滿足如下的限制,函數(shù)返回值不能是void類型,函數(shù)體不能聲明變量或者定義新的類型,函數(shù)體只能包含聲明、NULL語句或者一條return語句

代碼舉例:

(1)constexpr int get_five() {return 5;}

? ? ? ? ? int some_value[get_five() + 7];

29 確定對象在使用前已經(jīng)被初始化,確保每一個構(gòu)造函數(shù)都將對象的每一個成員初始化

30: const 和static成員的相關(guān)初始化規(guī)定

? ? 1-> const static數(shù)據(jù)成員可以在類內(nèi)初始化,也可以在類外初始化,不能在構(gòu)造函數(shù)中初始化,也不能在構(gòu)造函數(shù)中的初始化列表初始化。

? ? 2-> static數(shù)據(jù)成員只能在類外,即類的實現(xiàn)文件中初始化,也不能在構(gòu)造函數(shù)中初始化,不能在構(gòu)造函數(shù)中的初始化列表中初始化。

? ? 3-> const數(shù)據(jù)成員只能在構(gòu)造函數(shù)的初始化列表

? ? 4-> 普通數(shù)據(jù)成員不能在類內(nèi)初始化,可以在構(gòu)造函數(shù)中初始化,也可以在構(gòu)造函數(shù)的初始化列表中初始化。

31 說說static的作用有哪些

? ? 1-> 隱藏,當(dāng)我們同時編譯多個文件時,所有未加static的全局變量和函數(shù)都具有全局可見性,如果加了static就會對其他源文件隱藏

? ? 2-> static的第二個作用是保持變量內(nèi)容的持久,存儲在靜態(tài)數(shù)據(jù)區(qū)的變量會在程序剛開始運(yùn)行時就會完成初始化,也是唯一的一次初始化,和全局變量比起來,static變量就可以控制變量的可見范圍

? ? 3-> static的第三個作用是默認(rèn)初始化為0,也就是說static的主要功能是隱藏,其次因為static變量存放在靜態(tài)存儲區(qū),所以具備持久性和默認(rèn)值0

? ? 4-> 類的靜態(tài)成員函數(shù)屬于整個類而非類的對象,所以它沒有this指針,這就導(dǎo)致了它僅能訪問類的靜態(tài)數(shù)據(jù)核靜態(tài)成員函數(shù)

? ? 5-> 不能將static成員函數(shù)定義為虛函數(shù)

? ? 6-> static數(shù)據(jù)成員只能在類外,即類的實現(xiàn)文件中初始化,也不能在構(gòu)造函數(shù)中初始化,不能在構(gòu)造函數(shù)中的初始化列表中初始化。且前面不加static

? ? 7-> 為了防止父類的影響,可以在自定義一個與父類相同的靜態(tài)變量,以屏蔽父類的影響。

32 再談C++四種顯示風(fēng)格轉(zhuǎn)換----static_cast

? ? 1-> static_cast<type_id> (expresssion) ,該運(yùn)算符把expression轉(zhuǎn)換為type-id類型,但沒有運(yùn)行時的類型檢查來保證其安全性

? ? 2-> 用于類層次中基類和子類之間的指針轉(zhuǎn)換,進(jìn)行上行轉(zhuǎn)換(把子類指針或引用轉(zhuǎn)換為基類指針或引)是安全的,在進(jìn)行下行轉(zhuǎn)換(把基類指針或者引用轉(zhuǎn)換為子類的指針或者引用)由于沒有動態(tài)類型檢查,所以是不安全的

? ? 3-> 用于基本的數(shù)據(jù)類型之間的轉(zhuǎn)換。比如說Int轉(zhuǎn)換成為char,這種轉(zhuǎn)換的安全性也需要開發(fā)人員來保證

? ? 4-> 把void類型轉(zhuǎn)換為目標(biāo)類型的指針(不安全)

? ? 5-> 任何類型的表達(dá)式轉(zhuǎn)換為void類型,static_cast不能轉(zhuǎn)換掉expression中的const.volitale屬性

33? 再談C++四種顯示風(fēng)格轉(zhuǎn)換----dynamic_cast

? ? 1->dynamic_cast < type-id > ( expression ),該運(yùn)算符把expression類型轉(zhuǎn)換為type_id類型的對象,type-id必須是類的指針、類的引用或者void *,type_id和expression類型相同

? ? 2-> dynamic_cast主要用于類層次間的上下行轉(zhuǎn)換,還可以用于類之間的交叉轉(zhuǎn)換,在進(jìn)行上行轉(zhuǎn)換時其作用和static_cast的效果是一樣的,在進(jìn)行上行轉(zhuǎn)換時,dynamic_cast具有類型檢查的功能,比static_cast更安全

33 Smarter pointer 四大指針----auto->ptr

? ? ? https://blog.csdn.net/K346K346/article/details/81478223?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? BlogCommendFromMachineLearnPai2-1.nonecase

智能指針的作用是管理一個指針,智能指針就是一個類,當(dāng)超出了類的作用域時,類會自動調(diào)用析構(gòu)函數(shù),析構(gòu)函數(shù)會自動釋放資源,所以智能指針的作用原理就是在函數(shù)結(jié)束時自動釋放內(nèi)存空間

將基本類型指針封裝為類對象指針(這個對象肯定是個模板,以適應(yīng)不同類型的基本需求)并在析構(gòu)函數(shù)里編寫delete語句刪除指針指向的內(nèi)存空間

所有智能指針類都有一個explicit構(gòu)造函數(shù),以指針作為參數(shù),因此不能自動將指針轉(zhuǎn)化為智能指針對象,必須顯示調(diào)用

一般不用智能指針去指向非堆內(nèi)存的地址

? ? 1-> auto_ptr(C++)C++ 98的方案,C++11已經(jīng)拋棄,而且存在潛在的內(nèi)存崩潰問題

? ? 2->智能指針auto->ptr 在被賦值操作時,被賦值的取得其所有權(quán),去賦值的丟失其所有權(quán)

auto_ptr<string> films[5] =

{

? auto_ptr<string> (new string("Fowl Balls")),

? auto_ptr<string> (new string("Duck Walks")),

? auto_ptr<string> (new string("Chicken Runs")),

? auto_ptr<string> (new string("Turkey Errors")),

? auto_ptr<string> (new string("Goose Eggs"))

};

auto_ptr<string> pwin;

pwin = films[2];? // films[2] loses ownership. 將所有權(quán)從films[2]轉(zhuǎn)讓給pwin,此時films[2]不再引用該字符串從而變成空指針

for(int i = 0; i < 5; ++i)

? ? cout << *films[i] << endl;

? ? 3 auto->ptr不能夠作為函數(shù)的返回值和函數(shù)的參數(shù),也不能在容器中保存 auto->ptr

34: Smarter pointer 四大指針----shared->ptr

? ? 1->智能指針的構(gòu)造函數(shù)都有explicit關(guān)鍵詞修飾,所以不能隱式類型轉(zhuǎn)換

? ? 2-> 盡量使用make_sahred和make_unique而不使用new

? ? 3-> shared_ptr是一個標(biāo)準(zhǔn)的共享所有權(quán)的智能指針,允許多個指針指向同一個對象。

? ? 4-> shared_ptr對象除了包括一個所擁有的對象的指針外,還必須包括一個引用計數(shù)代理對象的指針

? ? 5 ->引用計數(shù),為了防止內(nèi)存泄漏而產(chǎn)生的,每當(dāng)增加一次對同一個對象的引用,那么引用對象的引用計數(shù)就會增加一次,每刪除一次引用,引用計數(shù)就會減一,當(dāng)一個對象的引用計數(shù)遞減為0,就自動刪除指向的堆內(nèi)存。

  6->shared_ptr使用引用計數(shù),每一個shared_ptr的拷貝都指向相同的內(nèi)存。每使用他一次,內(nèi)部的引用計數(shù)加1,每析構(gòu)一次,內(nèi)部的引用計數(shù)減1,減為0時,刪除所指向的堆內(nèi)存。shared_ptr內(nèi)部的引用計數(shù)是安全的,但是對象的讀取需要加鎖。

35: Smarter Pointer四大指針 unique_ptr

? ? 1->std::unique_ptr 是一種獨(dú)占的智能指針,它禁止其他智能指針與其共享同一個對象,從而保證了代碼的安全:

? ? 2-> 無法進(jìn)行復(fù)制構(gòu)造,無法進(jìn)行復(fù)制賦值操作,既無法使用兩個unique_ptr指向同一個對象,但是可以進(jìn)行移動構(gòu)造和移動賦值操作

36:? Smarter Pointer四大指針weak_ptr

? ? 1-> weak_ptr是用來解決shared_ptr相互引用時的死鎖問題,如果說兩個shared_ptr互相引用,那么這兩個指針的引用計數(shù)永遠(yuǎn)不會降為0,資源永遠(yuǎn)不會釋放,它是對對象的一種弱引用,不會增加對象的引用計數(shù),和shared_ptr之間可以互相轉(zhuǎn)化。

? ? 2-> std::weak_ptr 被管理的對象存在非擁有性(弱引用),在訪問所引用的對象指針前,必須先轉(zhuǎn)換為shared_ptr.

? ? 3 ->更像是shared_ptr的一個助手

37 :智能指針存不存在內(nèi)存泄漏,如果存在該如何解決?

? ? 1 ->當(dāng)兩個對象互相使用一個shaed_ptr成員變量指向?qū)Ψ?,會造成循環(huán)引用,使引用計數(shù)失效,從而導(dǎo)致內(nèi)存泄漏

? ? 2 -> 解決的話使用弱引用智能指針weak_ptr。

38:? 回答一下析構(gòu)函數(shù)需不需要為虛函數(shù)?為什么C++默認(rèn)的析構(gòu)函數(shù)不是虛函數(shù)

? ? 1-> 析構(gòu)函數(shù)不一定必須是虛函數(shù),是否為虛函數(shù)取決于該類的使用,一般為基類產(chǎn)生繼承和多態(tài)時,才會是虛函數(shù),單獨(dú)使用時可以不是虛函數(shù)。

? ? 2-> 之所以在繼承和多態(tài)時設(shè)計為虛函數(shù)是因為當(dāng)new 派生類,并且用基類指針指向這一個派生類時,在銷毀基類指針時只會調(diào)用基類的析構(gòu)函數(shù),不會調(diào)用派生類的析構(gòu)函數(shù),因為基類無法操作派生類中的非繼承的成員,這樣就造成派生類智能new 無法delete

? ? 3->默認(rèn)不是析構(gòu)函數(shù)是因為如果析構(gòu)函數(shù)為虛函數(shù)的話,就需要編譯器在類中增加虛函數(shù)表來實現(xiàn)虛函數(shù)機(jī)制,這樣所需要的內(nèi)存空間就更大了,因此沒有必要默認(rèn)為析構(gòu)函數(shù)。

39 :講講函數(shù)的多態(tài)和類的多態(tài)吧

? ? 1-> 多態(tài)性是一個接口多種實現(xiàn),函數(shù)的多態(tài)性(重載)是指一個函數(shù)被定義為多個不同參數(shù)的函數(shù),它們一般不存在頭文件中,當(dāng)你調(diào)用這個函數(shù),針對不同的參數(shù),就會調(diào)用不同的同名函數(shù)

? ? 2-> 類的多態(tài)性用一句話概括是:在基類的函數(shù)前加上virtual關(guān)鍵字,然后聲明基類的指針,利用該指針指向任意一個子類對象,調(diào)用相應(yīng)的虛函數(shù),可以根據(jù)指向的子類不同而調(diào)用不同的函數(shù)

40: TCP狀態(tài)控制碼

TCP狀態(tài)控制碼,占6個比特,含義如下

? ? 1-> URG :緊急比特,當(dāng)URG = 1時,表明緊急指針字段有效,代表該封包為緊急封包,也就是說報文內(nèi)有緊急數(shù)據(jù),應(yīng)當(dāng)盡快傳送

? ? 2-> ACK::確認(rèn)比特,只有當(dāng)ACK=1時,確認(rèn)字段號才有效,代表這個封包為確認(rèn)封包,當(dāng)ACK=0時,確認(rèn)號無效

? ? 3 ->PSH: PSH若為1時,代表要求對方立即傳送緩沖區(qū)內(nèi)其他對應(yīng)的封包,而無需等緩沖滿了才送

? ? 4-> RST復(fù)位比特,當(dāng)RST=1時,表明tcp連接中出現(xiàn)嚴(yán)重差錯,必須釋放連接,然后再重新建立運(yùn)輸連接

? ? 5-> SYN 同步比特,SYN置為1時,就是表示這是一個連接請求或者連接接受報文,通常有SYN標(biāo)志的包表示要主動連接到對方的意思

? ? 6-> FIN:終止比特,用來釋放一個連接,當(dāng)FIN=1時,表明此報文段的發(fā)送端數(shù)據(jù)已經(jīng)發(fā)送完畢,并要求釋放運(yùn)輸連接。

41? 再來一次TCP和UDP的區(qū)別

? ? 1-> TCP是面向連接的,UDP是無連接的

? ? 2-> TCP提供可靠的服務(wù),也就是說,通過TCP連接傳送的數(shù)據(jù),無差錯,不丟失,不重復(fù),而且按序到達(dá),UDP盡最大努力交付,既不保證可靠交付。

? ? 3-> TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道。

? ? 4-> TCP面向字節(jié)流,可能出現(xiàn)黏包問題,實際上是TCP把數(shù)據(jù)看成一串無結(jié)構(gòu)的字節(jié)流,UDP是面向報文的(不會出現(xiàn)黏包問題)

? ? 5-> UDP沒有擁塞控制,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會使源主機(jī)的發(fā)送速率降低(對實時應(yīng)有很有用,如IP電話,實時視頻會議)

? ? 6-> 每一條TCP連接只是點對點的,UDP支持一對一,一對多,多對一,多對多的交互通信

? ? 7-> TCP首部開銷20字節(jié),UDP首部開銷小只有8字節(jié)。

42 SCTP協(xié)議

? ? 1-> SCTP是一種傳輸層協(xié)議,和UDP,TCP類似。

? ? 2-> SCTP是后來引入的一種新型協(xié)議,提供了和TCP一樣可靠,有序的數(shù)據(jù)傳輸功能,同時卻能和UDP一樣面對消息的方式來進(jìn)行操作,保護(hù)消息邊界。

? ? 3-> SCTP可以在一個聯(lián)合中支持多流機(jī)制,每個流(stream)是獨(dú)立的

? ? 4->SCTP在設(shè)計時就充分考慮了TCP的不足。為防止攻擊者發(fā)送偽裝的SCTP數(shù)據(jù)包到現(xiàn)有的連接中, SCTP的兩端都使用一個稱為“認(rèn)證標(biāo)記”的32bit數(shù)據(jù)來確保數(shù)據(jù)包真正屬于現(xiàn)有的連接

43 :TCP三次握手建立連接

? ? 1-> 客戶端發(fā)送SYN到服務(wù)端,說明客戶端請求建立連接

? ? 2-> 服務(wù)端收到客戶端的SYN,并回復(fù)SYN + ACK到客戶端,表示同意建立連接

? ? 3-> 客戶端收到服務(wù)端的SYN + ACK后,回復(fù)ACK給服務(wù)端(表示客戶端收到了服務(wù)端發(fā)的同意報文)

? ? 4-> 服務(wù)端收到客戶端的ACK后,連接就已經(jīng)建立,可以進(jìn)行數(shù)據(jù)傳輸

44 :TCP為什么要進(jìn)行三次握手

? ? 1->因為信道不可靠,而TCP如果想在不可靠的信道上建立可靠的傳輸,那么三次通信是理論上的最小值

? ? 2-> 因為雙方都需要確認(rèn)對方收到了自己的序列號,確認(rèn)過程最少需要進(jìn)行三次通信

? ? 3-> 為了防止已經(jīng)失效的連接請求報文突然又傳送到了服務(wù)端,因而產(chǎn)生了錯誤

45:TCP四次揮手

? ? 1-> 客戶端發(fā)送FIN給服務(wù)端,說明客戶端不必發(fā)送數(shù)據(jù)給服務(wù)器了(請求釋放出客戶端)

? ? 2-> 服務(wù)器收到客戶端發(fā)的FIN,并回復(fù)ACK給客戶端(統(tǒng)一釋放從客戶端到服務(wù)端的連接)

? ? 3-> 客戶端收到服務(wù)端回復(fù)的ACK,此時從客戶端到服務(wù)端的連接已經(jīng)釋放(但服務(wù)端 到客戶端的連接沒有釋放,客戶還可以接收數(shù)據(jù))

? ? 4 -> 服務(wù)端繼續(xù)發(fā)送之前沒有發(fā)送完的數(shù)據(jù)

? ? 5-> 服務(wù)端發(fā)送FIN 給客戶端,表示服務(wù)端發(fā)送完了數(shù)據(jù)(請求釋放從服務(wù)端到客戶端的連接,就算沒收到客戶端的回復(fù),過一段時間也會自動釋放)

? ? 6-> 客戶端收到服務(wù)端的FIN,回復(fù)ACK給客戶端(同意釋放從服務(wù)端到客戶端的連接)

? ? 7-> 服務(wù)端收到了客戶端的ACK后,釋放從服務(wù)端到客戶端的連接。

46? :TCP為什么要進(jìn)行四次揮手

? ? 1-> 因為TCP是全雙工模式,客戶端請求關(guān)閉連接后,客戶端向服務(wù)端的連接關(guān)閉后(一,二次揮手),服務(wù)端繼續(xù)傳輸之前沒傳完的數(shù)據(jù)到客戶端,服務(wù)端向客戶端的連接關(guān)閉三,四次揮手),所以TCP釋放連接時服務(wù)器的ACK和FIN是分開發(fā)的(中間隔著數(shù)據(jù)傳輸),而TCP建立連接時服務(wù)器的ACK和SYN是一起發(fā)送的,所以TCP建立連接需要3次,而釋放連接則需要4次.

? ? 2->客戶端請求釋放時,服務(wù)器可能還有數(shù)據(jù)需要傳輸給客戶端,因此服務(wù)器需要響應(yīng)客戶端FIN請求(服務(wù)端發(fā)送ACK),然后進(jìn)行數(shù)據(jù)傳輸,傳輸完成后,服務(wù)端在提出FIN請求(服務(wù)端發(fā)送SN)而連接時則沒有數(shù)據(jù)傳輸,因此SYN和ACK可以一起發(fā)送。

47 : 為什么客戶端釋放最后需要TIME_WAIT等待2MS呢

? ? 1-> 為了保證客戶端發(fā)送的最后一個ACK報文能夠到達(dá)服務(wù)端,若未成功到達(dá),則服務(wù)端超時重傳FIN + ACK報文,并重新計時

? ? 2-> 防止已失效的連接請求報文出現(xiàn)在本鏈接中。持續(xù)2MS可使本連接持續(xù)的時間內(nèi)所產(chǎn)生的所有報文網(wǎng)段都從網(wǎng)絡(luò)中消失,下次連接中不會出現(xiàn)舊的報文段。

48 :TCP擁塞控制

TCP擁塞控制由4個核心算法組成:

? ? 1->慢啟動算法:TCP源端一開始不知道網(wǎng)絡(luò)資源當(dāng)前狀況,因此新建立的TCP連接不能一開始就發(fā)送大量數(shù)據(jù),而只能逐步增加每次發(fā)送的數(shù)據(jù)量

? ? 2->擁塞避免:算法讓擁塞窗口緩慢增長,即每經(jīng)過一個往返時間RTT就把發(fā)送方的擁塞窗口CWND加1,而不是加倍,這樣擁塞窗口按線性規(guī)律緩慢增長

? ? 3->快重傳和快恢復(fù):接收方在收到一個亂序的報文后就立即發(fā)出重復(fù)確認(rèn),快重傳算法規(guī)定,發(fā)送方只要一連收到三個重復(fù)確認(rèn)就應(yīng)當(dāng)立即重傳對方尚未收到的報文段,而不必繼續(xù)等待設(shè)置的重傳計時器時間到期

49: C/C++中sizeof(),strlen()的區(qū)別

? ? 1-> sizeof是一個操作符,而strlen是一個庫函數(shù)

? ? 2-> sizeof的參數(shù)可以是數(shù)據(jù)的類型,也可以是變量,而strlen只能以結(jié)尾為‘\0’的字符串作為參數(shù),也就是只能用char *作為參數(shù)

? ? 3-> 編譯器在編譯時計算出sizeof的結(jié)果,而strlen必須在運(yùn)行時才能計算出來

? ? 4-> sizeof計算數(shù)據(jù)類型占內(nèi)存的大小,strlen計算字符串實際長度

50: 棧和隊列

? ? 1-> 棧是限定僅在表尾進(jìn)行插入和刪除操作的線性表,我們把允許插入和刪除的一端稱為棧頂,另一端稱為棧底,不包含任何數(shù)據(jù)元素的棧稱為空棧

? ? 2->棧的特殊之處在于限定了這個線性表的插入和刪除位置,它始終只在棧頂進(jìn)行,這也就使得棧底是固定的,最先進(jìn)棧的只能在棧底

? ? 3-> 隊列與棧不同,他是一種FIFO,先進(jìn)先出的結(jié)構(gòu)

queue 和 stack 有一些成員函數(shù)相似,但在一些情況下,工作方式有些不同:

front():返回 queue 中第一個元素的引用。如果 queue 是常量,就返回一個常引用;如果 queue 為空,返回值是未定義的。

back():返回 queue 中最后一個元素的引用。如果 queue 是常量,就返回一個常引用;如果 queue 為空,返回值是未定義的。

push(const T& obj):在 queue 的尾部添加一個元素的副本。這是通過調(diào)用底層容器的成員函數(shù) push_back() 來完成的。

push(T&& obj):以移動的方式在 queue 的尾部添加元素。這是通過調(diào)用底層容器的具有右值引用參數(shù)的成員函數(shù) push_back() 來完成的。

pop():刪除 queue 中的第一個元素。

size():返回 queue 中元素的個數(shù)。

empty():如果 queue 中沒有元素的話,返回 true。

emplace():用傳給 emplace() 的參數(shù)調(diào)用 T 的構(gòu)造函數(shù),在 queue 的尾部生成對象。

swap(queue<T> &other_q):將當(dāng)前 queue 中的元素和參數(shù) queue 中的元素交換。它們需要包含相同類型的元素。也可以調(diào)用全局函數(shù)模板 swap() 來完成同樣的操作。

51 :volatile

? ? 1-> volatile關(guān)鍵字是一種類型修飾符,它聲明的類型變量可以不可以被某些編譯器未知的因素更改,所以volatile告訴編譯器不應(yīng)該對這樣的對象進(jìn)行優(yōu)化。

? ? 2-> vloatile關(guān)鍵字聲明的變量,每次訪問時都必須從內(nèi)存中取出值,沒有被volatile修飾的變量,可能由于編譯器的優(yōu)化,從CPU寄存器中取值

? ? 3-> const可以是volatile

? ? 4-> 指針可以是volatile變量

52 :assert()

1-> 斷言是宏,而不是函數(shù),如果它的條件返回錯誤,則終止程序運(yùn)行

2-> 可以通過NDEBUG來關(guān)閉assert

53: union聯(lián)合

? ? 1-> union是一種節(jié)省空間的特殊的類,一個uninon可以有多個數(shù)據(jù)成員,但是任意時刻只有一個數(shù)據(jù)成員可以有值,當(dāng)某個成員被賦值后,其他成員定義為未定義狀態(tài);

? ? 2-> 默認(rèn)訪問控制符為public,可以有構(gòu)造函數(shù)和析構(gòu)函數(shù)

? ? 3-> 不能含有引用類型的成員

? ? 4-> 不能繼承自其他類,不能作為基類,不能含有虛函數(shù)

54: this指針

? ? 1-> this指針是一個隱含與每一個非static成員函數(shù)的特殊指針,它指向調(diào)用該成員函數(shù)的對象

? ? 2-> 當(dāng)一個成員函數(shù)被調(diào)用時,自動向它傳遞一個隱含的參數(shù),該參數(shù)是一個指向這個成員函數(shù)所在對象的指針

? ? 3-> 當(dāng)對一個對象調(diào)用成員函數(shù)時,編譯程序現(xiàn)將對象的地址賦值給this指針,然后調(diào)用成員函數(shù),每次成員函數(shù)存取數(shù)據(jù)成員時,都隱式使用this指針

55 :虛函數(shù)和純虛函數(shù)的區(qū)別

1-> 類里面如果聲明了虛函數(shù),這個函數(shù)是實現(xiàn)的,哪怕是空實現(xiàn),它的作用就是為了能讓這個函數(shù)可以在它的子類里被覆蓋,這樣編譯器就可以使用后期綁定來實現(xiàn)多態(tài)。純虛函數(shù)只是一個接口,是個函數(shù)的聲明而已,他要到子類里去實現(xiàn)。

2-> 虛函數(shù)在子類里可以不重寫,但純虛函數(shù)必須在子類才可以實例化子類

3-> 帶純虛函數(shù)的類叫做抽象類,這種類不能直接生成對象,而只有被繼承,并重寫虛函數(shù)后,才能使用,抽象類被繼承后,子類可以繼續(xù)是抽象類,也可以是普通類。

56 :虛函數(shù)表

? ? 1-> 擁有虛函數(shù)的類才有虛函數(shù)表

? ? 2-> 虛函數(shù)表屬于類,然后類的所有對象通過虛函數(shù)表指針共享類的虛函數(shù)表

? ? 3-> 虛函數(shù)表的作用:當(dāng)使用父類指針來操作子類對象時,虛函數(shù)表像一個地圖一樣,指明了實際該調(diào)用的函數(shù)

? ? 4-> C++編譯器保證虛函數(shù)表的指針存在于對象實例中的最前面的位置,這意味著我們可以通過對象實例的地址得到虛函數(shù)表,然后可以遍歷其中的虛函數(shù)指針,并且調(diào)用相應(yīng)的虛函數(shù)。

? ? 5-> 虛函數(shù)表詳解:https://zhuanlan.zhihu.com/p/75172640

57:std::move

? ? 1-> std::move函數(shù)可以非常簡單的方式將左值引用轉(zhuǎn)換為右值引用,通過std::move可以避免不必要的拷貝操作

? ? 2-> std::move是為性能而生,是將對象的狀態(tài)或者所有權(quán)從一個對象轉(zhuǎn)移到另外一個對象,只是轉(zhuǎn)移,沒有內(nèi)存的搬遷或者拷貝

58:進(jìn)程間的通信有哪些,各有什么優(yōu)缺點:

? ? 1-> 管道:管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動,而且只能在具有親緣關(guān)系的進(jìn)程之間進(jìn)行使用。具有親緣的關(guān)系通常是指父子進(jìn)程關(guān)系

? ? 2-> 有名管道FIFO:有名管道也是半雙工的通信方式,但是允許在沒有親緣關(guān)系中的進(jìn)程間使用,有名管道是先進(jìn)先出的通信方式

? ? 3-> 信號量:信號量是一個計數(shù)器,可以用來控制多個進(jìn)程對共享資源的訪問,作為一個鎖機(jī)制,防止某進(jìn)程正在訪問共享資源時,其他進(jìn)程也訪問該資源,因此主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不線程之間的同步手段

? ? 4-> 消息隊列:消息隊列是有消息的鏈表,存放在內(nèi)核中并由消息隊列標(biāo)識符來確定。消息隊列克服了信號傳遞信息少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等特點。

? ? 5-> 信號signal:信號是一種比較復(fù)雜的通信方式,用于通知接受進(jìn)程某個事件已經(jīng)發(fā)生

? ? 6-> 共享內(nèi)存:共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問的內(nèi)存,這段共享內(nèi)存由一個進(jìn)程創(chuàng)建,但很多進(jìn)程都將可以訪問,共享內(nèi)存是最快的IPC方式,它是針對其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計的,它往往與其他通信機(jī)制,如信號量配合使用,來實現(xiàn)進(jìn)程間的同步

? ? 7-> 套接字socket:套接字也是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是,它可用于不同機(jī)器間的進(jìn)程通信

59:socket包含哪幾樣?xùn)|西

? ? 1-> IP地址:也就是某臺主機(jī)的邏輯地址,按照TCP/ip協(xié)議分配給本地主機(jī)的網(wǎng)絡(luò)地址,兩個進(jìn)程要通訊,任意進(jìn)程首先要知道通訊對方的位置,即對方的IP地址

? ? 2-> 端口號:用來辨別本地通訊進(jìn)程,一個本地的進(jìn)程在通訊時俊輝占用一個端口號,不同的進(jìn)程端口號不同,因此在通訊前必須要分配一個沒有訪問的端口號;

? ? 3-> 連接:指兩個進(jìn)程間的通訊鏈路

? ? 4-> 半相關(guān):網(wǎng)絡(luò)中用一個三元組可以在全局唯一標(biāo)志一個進(jìn)程(協(xié)議,本地地址,端口號)

? ? 5-> 全相關(guān):一個完整的網(wǎng)間進(jìn)程通信需要由兩個進(jìn)程組成,并且只能使用同一種高層協(xié)議,也就是說完整的網(wǎng)間通信需要一個五元組來標(biāo)識(協(xié)議,本地地址,本地端口號,遠(yuǎn)地地址,遠(yuǎn)地端口號)

60:socket相關(guān)的函數(shù)

? ? 1-> 創(chuàng)建套接字,int socket(int domain,int type,int protocol),該函數(shù)用于打開一個網(wǎng)絡(luò)通訊接口,出錯則返回-1,成功返回一個socket文件描述符,應(yīng)用進(jìn)程就可以像讀寫文件一樣調(diào)用

read/write在網(wǎng)絡(luò)上收發(fā)數(shù)據(jù)

? ? 2-> 綁定 int bind(int sockfd,const struct sockaddr*addr,socklen_t addrlen);將參數(shù)sockfd和addr綁定在一起,是sockfd這個用于網(wǎng)絡(luò)通訊的文件描述符監(jiān)聽addr所描述的地址和端口號

? ? 3-> 監(jiān)聽 int listen(int sockfd,int backlog);該函數(shù)僅被服務(wù)端使用,listen聲明sockfd處于監(jiān)聽狀態(tài),并且最多允許有backlog個客戶端處于連接等待狀態(tài),如果收到更多的連接請求就忽略。listen成功返回0,失敗返回-1

? ? 4->接收連接? int accept(int sockfd,struct sockaddr* addr,socklen_t* addrlen):當(dāng)有客戶端發(fā)起連接時,服務(wù)器就調(diào)用accept返回并接受這個連接;

? ? 5-> 請求連接:這個函數(shù)只需要客戶端程序來調(diào)用,調(diào)用該函數(shù)后表明連接服務(wù)器,這里的參數(shù)是對方的地址

61: socket的使用中服務(wù)端和客戶端的流程

? ? 服務(wù)器端工作流程:

? ? 1-> 使用WSAStartup()函數(shù)檢查系統(tǒng)協(xié)議棧安裝情況

? ? 2-> 使用socket()函數(shù)創(chuàng)建服務(wù)器端通信套接口

? ? 3-> 使用bind()函數(shù)將創(chuàng)建的套接口與服務(wù)器地址綁定

? ? 4-> 使用listen()函數(shù)使服務(wù)器套接口做好接收連接請求準(zhǔn)備

? ? 5-> 使用accept()接收來自客戶端由connect()函數(shù)發(fā)出的連接請求

? ? 6-> 根據(jù)連接請求建立鏈接后,使用send()還念書發(fā)送數(shù)據(jù),或者使用recv()函數(shù)接收數(shù)據(jù)

? ? 7-> 使用closesocket()函數(shù)關(guān)閉套接口(可以先用shutdown()函數(shù)吸納關(guān)閉讀寫通道)

? ? 8-> 最后調(diào)用WSACleanup()函數(shù)結(jié)束Winsock Sockets API

? ? 客戶端工作流程:

? ? 1-> 使用WSAStartup()函數(shù)檢查系統(tǒng)協(xié)議棧安裝情況

? ? 2-> 用socket()函數(shù)創(chuàng)建客戶端套接口

? ? 3-> 使用connect()函數(shù)發(fā)出與服務(wù)器建立連接的請求(調(diào)用前可以不用bind()端口號,由系統(tǒng)自動完成)

? ? 4-> 連接建立后使用send()函數(shù)發(fā)送數(shù)據(jù),或使用recv()函數(shù)接收數(shù)據(jù)

? ? 5-> 使用closesocket()函數(shù)關(guān)閉套接口

? ? 6->最后調(diào)用WSACleanup()函數(shù),結(jié)束Winsock Sockets API

62:HTTP與HTTPS的區(qū)別

? ? 1-> HTTP的URL以http://開頭,而HTTPS的URL以https://開頭

? ? 2-> HTTP是不安全的,HTTPS是安全的

? ? 3-> HTTP標(biāo)準(zhǔn)端口號是80,而HTTPS的標(biāo)準(zhǔn)端口是443

? ? 4-> 在OSI網(wǎng)絡(luò)模型中,HTTP工作于應(yīng)用層,而HTTPSd的安全傳輸機(jī)制工作在傳輸層

? ? 5-> HTTP無法加密,而HTTPS對傳輸?shù)臄?shù)據(jù)進(jìn)行加密

? ? 6-> HTTP無需證書,而HTTPS需要CA機(jī)構(gòu)wosign的頒發(fā)SSL證書

63:簡述HTTP請求的7個步驟

? ? 1-> 建立TCP連接:在HTTP工作開始之前,Web瀏覽器首先要通過網(wǎng)絡(luò)與Web服務(wù)器建立連接,該連接是通過TCP來完成的,該協(xié)議與IP協(xié)議共同構(gòu)建 Internet,即著名的TCP/IP協(xié)議族,因此Internet又被稱作是TCP/IP網(wǎng)絡(luò)。HTTP是比TCP更高層次的應(yīng)用層協(xié)議,根據(jù)規(guī)則, 只有低層協(xié)議建立之后才能,才能進(jìn)行更層協(xié)議的連接,因此,首先要建立TCP連接,一般TCP連接的端口號是80。

? ? 2-> web瀏覽器發(fā)送請求命令,一旦建立了TCP連接,web瀏覽器就會向web服務(wù)器發(fā)送請求命令

? ? 3-> web瀏覽器發(fā)送請求頭信息,瀏覽器發(fā)送請求命令之后,還要以頭的形式向web服務(wù)器發(fā)送一些別的信息,之后瀏覽器發(fā)送了一空白行來通知服務(wù)器,它已經(jīng)結(jié)束了該頭信息的發(fā)送

? ? 4-> web服務(wù)器應(yīng)答:客戶機(jī)向服務(wù)器發(fā)出請求后,服務(wù)器會向客戶機(jī)回送應(yīng)答,HTTP/1.1 200 OK,應(yīng)答的第一部分是一協(xié)議的版本號和應(yīng)答狀態(tài)碼

? ? 5-> web服務(wù)器發(fā)送應(yīng)答頭:正如客戶端會隨同請求發(fā)送關(guān)于自身的信息一樣,服務(wù)器也會隨同應(yīng)答向用戶發(fā)送關(guān)于它自己的數(shù)據(jù)及被請求的文檔。

? ? 6-> web服務(wù)器向瀏覽器發(fā)送數(shù)據(jù):Web服務(wù)器向瀏覽器發(fā)送頭信息后,它會發(fā)送一個空白行來表示頭信息的發(fā)送到此為結(jié)束,接著,它就以Content-Type應(yīng)答頭信息所描述的格式發(fā)送用戶所請求的實際數(shù)據(jù)。

? ? 7->web服務(wù)器關(guān)閉TCP連接:一般情況下,一旦Web服務(wù)器向瀏覽器發(fā)送了請求數(shù)據(jù),它就要關(guān)閉TCP連接,然后如果瀏覽器或者服務(wù)器在其頭信息加入了這行代碼

64:gdb常用命令

? ? 1-> gdb + 可執(zhí)行文件名:啟動gdb調(diào)試

? ? 2-> thread apply all bt: 查看所有線程調(diào)用棧,thread x進(jìn)入所需要的線程

? ? 3-> start:開始執(zhí)行程序,停在main函數(shù)第一句語句前面等待命令

? ? 4-> step/s:執(zhí)行下一行語句,如果有函數(shù)調(diào)用則進(jìn)入到函數(shù)中

? ? 5-> r: 重頭開始運(yùn)行到斷點

? ? 6-> c: 繼續(xù)運(yùn)行直到下一個斷點

? ? 7->? p/x/d + 變量:以十六進(jìn)制,十進(jìn)制打印變量

? ? 8-> finish:連續(xù)運(yùn)行到當(dāng)前函數(shù)返回為止,然后停下來等待命令

? ? 9-> info/locals:查看當(dāng)前棧幀局部變量的值

? ? 10-> list/l :列出源代碼,接著上次的位置往下列,每次列100行

? ? 11-> list + 行號:列出從第幾行開始的源代碼

? ? 12-> next/n: 執(zhí)行下一行語句

? ? 13-> print/p:打印表達(dá)式的值,通過表達(dá)式可以修改變量的值或者調(diào)用函數(shù)

? ? 14-> quit/q:退出gdb調(diào)試環(huán)境

? ? 15-> set var:修改變量的值

? ? 16-> attach pid:跟蹤并掛起某個已經(jīng)起來的進(jìn)程

? ? 17-> call + 函數(shù)名/參數(shù):手動調(diào)用對應(yīng)函數(shù),可以用來檢查函數(shù)功能

? ? 18-> b + main.c:11:給main.c文件的11行打斷點

? ? 19-> i d: 顯示所有斷點信息

? ? 20-> d + 對應(yīng)斷點:刪除對應(yīng)斷點

? ? 21-> info local:查看局部變量

? ? 22-> until:結(jié)束當(dāng)前循環(huán)

? ? 23-> signal:將一個信號發(fā)給正在運(yùn)行的函數(shù)

? ? 24->backtrace:查看各級函數(shù)調(diào)用棧及參數(shù)

? ? 25->frame或f + 幀編號:選擇棧幀

? ? 26->up/down:上移/下移棧幀,使得其他函數(shù)變成當(dāng)前的函數(shù)

? ? 27->watch:監(jiān)控一個變量當(dāng)該變量改變時停止程序

? ? 28->jump: 程序跳到指定位置

? ? 29->register:查看寄存器

? ? 30->x? + addr: 查看指定內(nèi)存

65 :linux下動態(tài)庫 .so和靜態(tài)庫.a的區(qū)別

? ? 1-> 兩者的不同點在于代碼被載入的時刻不同

? ? 2->靜態(tài)庫的代碼在編譯過程中已經(jīng)被載入可執(zhí)行程序,因此體積比較大,而且程序運(yùn)行時不在需要該靜態(tài)庫

? ? 3-> 動態(tài)庫(共享庫)的代碼在可執(zhí)行程序運(yùn)行時才載入內(nèi)存,在編譯過程中僅簡單的引用,因此代碼體積比較小,在程序運(yùn)行時還需要運(yùn)行

66: map中以class作為類的key需要怎么做

? ? 1-> map內(nèi)部存儲機(jī)制實際是以紅黑樹為基礎(chǔ),紅黑樹在插入節(jié)點時,必須依照大小比對之后在一個合適的位置上執(zhí)行插入動作。所以作為關(guān)鍵字,起碼必須有“<”這個比較操作符。我們知道,int,float,enum,size_t等等簡單關(guān)鍵字,都有內(nèi)置的比較函數(shù),與map搭配無論是插入還是查找,都沒什么問題。但是作為復(fù)雜數(shù)據(jù)類型,如果沒有明確定義“<”比較操作符,就不能與map直接搭配使用,除非我們自己定義第三個參數(shù)。

67:聊一下HTTP的狀態(tài)碼有哪些

? ? 1->2XX 成功

? ? ? ? 200 OK,表示從客戶端發(fā)來的請求在服務(wù)器端被正確處理 ?

? ? ? ? 201 Created 請求已經(jīng)被實現(xiàn),而且有一個新的資源已經(jīng)依據(jù)請求的需要而建立

? ? ? ? 202 Accepted 請求已接受,但是還沒執(zhí)行,不保證完成請求

? ? ? ? 204 No content,表示請求成功,但響應(yīng)報文不含實體的主體部分

? ? ? ? 206 Partial Content,進(jìn)行范圍請求 ?

? 2->3XX 重定向

? ? ? ? 301 moved permanently,永久性重定向,表示資源已被分配了新的 URL

? ? ? ? 302 found,臨時性重定向,表示資源臨時被分配了新的 URL ?

? ? ? ? 303 see other,表示資源存在著另一個 URL,應(yīng)使用 GET 方法定向獲取資源

? ? ? ? 304 not modified,表示服務(wù)器允許訪問資源,但因發(fā)生請求未滿足條件的情況

? ? ? ? 307 temporary redirect,臨時重定向,和302含義相同

? ? 4XX 客戶端錯誤

? ? ? ? 400 bad request,請求報文存在語法錯誤 ?

? ? ? ? 401 unauthorized,表示發(fā)送的請求需要有通過 HTTP 認(rèn)證的認(rèn)證信息 ?

? ? ? ? 403 forbidden,表示對請求資源的訪問被服務(wù)器拒絕 ?

? ? ? ? 404 not found,表示在服務(wù)器上沒有找到請求的資源 ?

? ? ? ? 408 Request timeout, 客戶端請求超時

? ? ? ? 409 Confict, 請求的資源可能引起沖突

? ? 5XX 服務(wù)器錯誤

? ? ? ? 500 internal sever error,表示服務(wù)器端在執(zhí)行請求時發(fā)生了錯誤 ?

? ? ? ? 501 Not Implemented 請求超出服務(wù)器能力范圍,例如服務(wù)器不支持當(dāng)前請求所需要的某個功能,或者請求是服務(wù)器不支持的某個方法

? ? ? ? 503 service unavailable,表明服務(wù)器暫時處于超負(fù)載或正在停機(jī)維護(hù),無法處理請求

? ? ? ? 505 http version not supported 服務(wù)器不支持,或者拒絕支持在請求中使用的 HTTP 版本

68 說說為什么有了HTTP還要有HTTPS

? ? 1-> https是安全版的http,因為http協(xié)議的數(shù)據(jù)都是明文進(jìn)行傳輸?shù)?,所以對于一些敏感信息的傳輸就很不安全,HTTPS就是為了解決HTTP的安全而生的。

69 為什么會發(fā)生TCP黏包、拆包?

? ? 1-> 要發(fā)送的數(shù)據(jù)大于TCP發(fā)送緩沖剩余空間的大小,將會發(fā)生拆包;

? ? 2->待發(fā)送的數(shù)據(jù)大于最大報文長度,將會發(fā)生拆包;

? ? 3->要發(fā)送的數(shù)據(jù)小于TCP發(fā)送緩沖區(qū)的大小,但TCP講多次寫入緩沖區(qū)的數(shù)據(jù)一次性發(fā)送出去,將會發(fā)送粘包;

? ? 4-> 接收數(shù)據(jù)端的應(yīng)用層沒有及時讀取緩存區(qū)中的數(shù)據(jù),將發(fā)生黏包;

70 黏包拆包的解決方法?

? ? 1-> 消息定長:發(fā)送端將每個數(shù)據(jù)包裝為固定長度(不夠的可以通過填0補(bǔ)充),這樣接收端每次接收緩沖區(qū)中讀取固定的長度的數(shù)據(jù)就自然而然的可以把每個數(shù)據(jù)包拆分出來;

? ? 2-> 設(shè)置消息邊界:服務(wù)端從網(wǎng)絡(luò)流中按照消息邊界劃分出消息內(nèi)容,比如說像FTP協(xié)議一樣,在包尾增加回車換行符進(jìn)行分割;

? ? 3-> 將消息分為消息頭和消息體:消息頭中包含表示消息總長度(或者消息體長度)的字段;

71:什么是TCP流量控制:

? ? 1-> 流量控制是為了控制發(fā)送方發(fā)送速率,保證接收方來得及接收;

? ? 2-> 接收方發(fā)送的確認(rèn)報文中的窗口字段可以用來控制發(fā)送方窗口大小,從而影響發(fā)送方的發(fā)送速率,將窗口值設(shè)為0,則發(fā)送方不能發(fā)送數(shù)據(jù)。

72: 什么是野指針?怎么產(chǎn)生的,怎么避免?

? ? 1-> 野指針就是指指向的位置是隨機(jī)的,不可知的,沒有明確限制的,與空指針是不同的。比如指針變量在定義時未初始化,其值是隨機(jī)的,指針變量的值是別的變量地址,意味著指針指向了一個地址是不確定的變量。此時去解引用就是去訪問了一個不確定的地址,所以結(jié)果是不可知的;

2 -> 指向不可訪問的地址,比如內(nèi)核空間,指向了一個可用的空間,但這個空間的程序正在被使用,指向一個可用但是沒有特別意義的空間。

3-> 避免:在定義指針時初始化為NULL,在指針解引用之前先判斷這個指針是不是NULL,在指針使用完之后將指針賦值為NULL,在指針使用之前將其賦值為一個可用的內(nèi)存空間。

73:C++中map 和 set的使用及區(qū)別

? ? 1-> set是一種關(guān)聯(lián)式容器,其以RBtree作為底層容器

? ? 2-> set所得元素只有key沒有value,value就是key, set不允許出現(xiàn)鍵值重復(fù)

? ? 3-> 所有元素都會被自動排序, 不能通過迭代器來改變set的值,因為set的值就是鍵

? ? 4-> map和set一樣時關(guān)聯(lián)式容器。它們的底層都是紅黑樹,所有元素都是鍵 + 值存在的,所有的元素是通過鍵進(jìn)行自動排序的,map的鍵是不能修改的,但是鍵對應(yīng)的值是能修改的。

74:C++如何阻止一個類被實例化

? ? 1-> 將類定位抽象基類(就是類里面定義了純虛函數(shù)的類)或者將構(gòu)造函數(shù)聲明為private

? ? 2-> 不允許類外部創(chuàng)建類對象,只能在類內(nèi)部創(chuàng)建對象

75: 在瀏覽器輸入一個網(wǎng)址后的流程

? 1->解析域名的IP地址(在瀏覽器緩存或hosts或DNS服務(wù)器查找)

? 2->發(fā)起連接請求,TCP三次握手

? 3->發(fā)送HTTP請求信息

? 4->接受服務(wù)器返回的數(shù)據(jù)并渲染到頁面

? 5->斷開TCP連接,四次揮手

https://blog.csdn.net/weixin_30376083/article/details/95320106

76: get和post的方法區(qū)別

? ? 1->GET在瀏覽器回退時是無害的,而POST會再次提交請求。

? ? 2->GET產(chǎn)生的URL地址可以被Bookmark,而POST不可以。

? ? 3->GET請求會被瀏覽器主動cache,而POST不會,除非手動設(shè)置。

? ? 4->GET請求只能進(jìn)行url編碼,而POST支持多種編碼方式。

? ? 5->GET請求參數(shù)會被完整保留在瀏覽器歷史記錄里,而POST中的參數(shù)不會被保留。

? ? 6->GET請求在URL中傳送的參數(shù)是有長度限制的,而POST么有。

? ? 7->對參數(shù)的數(shù)據(jù)類型,GET只接受ASCII字符,而POST沒有限制。

? ? 8->GET比POST更不安全,因為參數(shù)直接暴露在URL上,所以不能用來傳遞敏感信息。

? ? 9->GET參數(shù)通過URL傳遞,POST放在Request body中。

? ? https://blog.nowcoder.net/n/91a9334cbabf4c24893aef3f96e51303

? ? https://zhuanlan.zhihu.com/p/110546080

77 數(shù)據(jù)庫的四大特性

? ? 1->原子性, 是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾,因此事務(wù)的操作如果成功就必須要完全應(yīng)用到數(shù)據(jù)庫,如果操作失敗則不能對數(shù)據(jù)庫有任何影響。

? ? 2->一致性, 一致性是指事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài),也就是說一個事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。拿轉(zhuǎn)賬來說,假設(shè)用戶A和用戶B兩者的錢加起來一共是5000,那么不管A和B之間如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個用戶的錢相加起來應(yīng)該還得是5000,這就是事務(wù)的一致性。

? ? 3->隔離性, 隔離性是當(dāng)多個用戶并發(fā)訪問數(shù)據(jù)庫時,比如操作同一張表時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個并發(fā)事務(wù)之間要相互隔離。即要達(dá)到這么一種效果:對于任意兩個并發(fā)的事務(wù)T1和T2,在事務(wù)T1看來,T2要么在T1開始之前就已經(jīng)結(jié)束,要么在T1結(jié)束之后才開始,這樣每個事務(wù)都感覺不到有其他事務(wù)在并發(fā)地執(zhí)行。

? ? 4->持久性, 持久性是指一個事務(wù)一旦被提交了,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務(wù)的操作。

78 微信紅包功能怎么測試

? ? 1->功能

? ? 在紅包錢數(shù),和紅包個數(shù)的輸入框中只能輸入數(shù)字

? ? 紅包里最多和最少可以輸入的錢數(shù) 200 0.01

? ? 拼手氣紅包最多可以發(fā)多少個紅包 100、超過最大拼手氣紅包的個數(shù)是否有提醒

? ? 當(dāng)紅包錢數(shù)超過最大范圍是不是有對應(yīng)的提示

? ? 當(dāng)發(fā)送的紅包個數(shù)超過最大范圍是不是有提示

? ? 當(dāng)余額不足時,紅包發(fā)送失敗

? ? 在紅包描述里是否可以輸入漢字,英文,符號,表情,純數(shù)字,漢字英語符號,是否可以輸入它們的混合搭配

? ? 輸入紅包錢數(shù)是不是只能輸入數(shù)字

? ? 紅包描述里許多能有多少個字符 10個

? ? 紅包描述,金額,紅包個數(shù)框里是否支持復(fù)制粘貼操作

? ? 紅包描述里的表情可以刪除

? ? 發(fā)送的紅包別人是否可以領(lǐng)取、發(fā)的紅包自己可不可以領(lǐng)取 2人

? ? 24小時內(nèi)沒有領(lǐng)取的紅包是否可以退回到原來的賬戶、超過24小時沒有領(lǐng)取的紅包,是否還可以領(lǐng)取

? ? 用戶是否可以多次搶一個紅包

? ? 發(fā)紅包的人是否還可以搶紅包 多人

? ? 紅包的金額里的小數(shù)位數(shù)是否有限制

? ? 可以按返回鍵,取消發(fā)紅包

? ? 斷網(wǎng)時,無法搶紅包

? ? 可不可以自己選擇支付方式

? ? 余額不足時,會不會自動匹配支付方式

? ? 在發(fā)紅包界面能否看到以前的收發(fā)紅包的記錄

? ? 紅包記錄里的信息與實際收發(fā)紅包記錄是否匹配

? ? 支付時可以密碼支付也可以指紋支付

? ? 如果直接輸入小數(shù)點,那么小數(shù)點之前應(yīng)該有個0

? ? 支付成功后,退回聊天界面

? ? 發(fā)紅包金額和收到的紅包金額應(yīng)該匹配

? ? 是否可以連續(xù)多次發(fā)紅包

? ? 輸入錢數(shù)為0,"塞錢進(jìn)紅包"置灰

? ? 2->性能

? ? 弱網(wǎng)時搶紅包,發(fā)紅包時間

? ? 不同網(wǎng)速時搶紅包,發(fā)紅包的時間

? ? 發(fā)紅包和收紅包成功后的跳轉(zhuǎn)時間

? ? 收發(fā)紅包的耗電量

? ? 退款到賬的時間

? ? 3-> 兼容

? ? 蘋果,安卓是否都可以發(fā)送紅包

? ? 電腦端可以搶微信紅包

4 界面

? ? 發(fā)紅包界面沒有錯別字

? ? 搶完紅包界面沒有錯別字

? ? 發(fā)紅包和收紅包界面排版合理,

? ? 發(fā)紅包和收到紅包界面顏色搭配合理

5->? 安全

? ? 對方微信號異地登錄,是否會有提醒 2人

? ? 紅包被領(lǐng)取以后,發(fā)送紅包人的金額會減少,收紅包金額會增加

? ? 發(fā)送紅包失敗,余額和銀行卡里的錢數(shù)不會少

? ? 紅包發(fā)送成功,是否會收到微信支付的通知

6-> 易用性(有點重復(fù))

? ? 紅包描述,可以通過語音輸入

? ? 可以指紋支付也可以密碼支付

79 ARP地址解析協(xié)議工作原理:

? ? 1->首先,每個主機(jī)都會在自己的ARP緩沖區(qū)中建立一個ARP列表,以表示IP地址和MAC地址之間的對應(yīng)關(guān)系。

? ? 2->當(dāng)源主機(jī)要發(fā)送數(shù)據(jù)時,首先檢查ARP列表中是否有對應(yīng)IP地址的目的主機(jī)的MAC地址,如果有,則直接發(fā)送數(shù)據(jù),如果沒有,就向本網(wǎng)段的所有主機(jī)發(fā)送ARP數(shù)據(jù)包,該數(shù)據(jù)包包括的內(nèi)容有:源主機(jī) IP地址,源主機(jī)MAC地址,目的主機(jī)的IP 地址。

? ? 3->當(dāng)本網(wǎng)絡(luò)的所有主機(jī)收到該ARP數(shù)據(jù)包時,首先檢查數(shù)據(jù)包中的IP地址是否是自己的IP地址,如果不是,則忽略該數(shù)據(jù)包,如果是,則首先從數(shù)據(jù)包中取出源主機(jī)的IP和MAC地址寫入到ARP列表中,如果已經(jīng)存在,則覆蓋,然后將自己的MAC地址寫入ARP響應(yīng)包中,告訴源主機(jī)自己是它想要找的MAC地址。

? ? 4->源主機(jī)收到ARP響應(yīng)包后。將目的主機(jī)的IP和MAC地址寫入ARP列表,并利用此信息發(fā)送數(shù)據(jù)。如果源主機(jī)一直沒有收到ARP響應(yīng)數(shù)據(jù)包,表示ARP查詢失敗。

廣播發(fā)送ARP請求,單播發(fā)送ARP響應(yīng)

80? 為什么要使用ARP協(xié)議

1->? OSI模型把網(wǎng)絡(luò)工作分為七層,彼此不直接打交道,只通過接口(layer interface)。IP地址工作在第三層,MAC地址工作在第二層。當(dāng)協(xié)議在發(fā)送數(shù)據(jù)包時,需要先封裝第三層IP地址,第二層MAC地址的報頭,但協(xié)議只知道目的節(jié)點的IP地址,不知道目的節(jié)點的MAC地址,又不能跨第二、三層,所以得用ARP協(xié)議服務(wù),來幫助獲取到目的節(jié)點的MAC地址。

ARP協(xié)議是第幾層協(xié)議 ,在網(wǎng)絡(luò)層

81 ARP在生成環(huán)境產(chǎn)生的問題及解決辦法:

1->ARP病毒,ARP欺騙。

2>高可用服務(wù)器對之間切換時要考慮ARP緩存的問題。

3->路由器等設(shè)備無縫遷移時要考慮ARP緩存的問題,例如:更換辦公室的路由器。

82? linux查看文件前幾行和后幾行的命令

1 -> 查看/etc/profile的前10行內(nèi)容,應(yīng)該是:# head -n 10 /etc/profile

查看/etc/profile的最后5行內(nèi)容,應(yīng)該是:# tail? -n 5 /etc/profile,帶數(shù)字表示從打幾行,帶+號表示從第幾行開始

2 -> 從第3000行開始,顯示1000行。即顯示3000~3999行

? ? cat filename | tail -n +3000 | head -n 1000

3-> 顯示1000行到3000行

? ? cat filename | head -n 3000 | tail -n +1000

4->,使用sed命令,sed -n '5, 10p' filename

83 having 和 where的區(qū)別

1-> having是在分組后對數(shù)據(jù)進(jìn)行過濾

2-> where是在分組前對數(shù)據(jù)進(jìn)行過濾

3-> having后面可以使用聚合函數(shù)

4-> where后面不可以使用聚合

5-> 在查詢過程中執(zhí)行順序:from>where>group(含聚合)>having>order>select。

6->聚合語句(sum,min,max,avg,count)要比having子句優(yōu)先執(zhí)行,所有having后面可以使用聚合函數(shù)。而where子句在查詢過程中執(zhí)行優(yōu)先級別優(yōu)先于聚合語句(sum,min,max,avg,count),所有where條件中不能使用聚合函數(shù)。

84 數(shù)組和鏈表的區(qū)別(轉(zhuǎn)http://www.itdecent.cn/p/5233f2a2d523)

數(shù)組和鏈表是兩種基本的數(shù)據(jù)結(jié)構(gòu),他們在內(nèi)存存儲上的表現(xiàn)不一樣,所以也有各自的特點。

大致總結(jié)一下特點和區(qū)別,拿幾個人一起去看電影時坐座位為例。

1-> 數(shù)組的特點

在內(nèi)存中,數(shù)組是一塊連續(xù)的區(qū)域。 拿上面的看電影來說,這幾個人在電影院必須坐在一起。

數(shù)組需要預(yù)留空間,在使用前要先申請占內(nèi)存的大小,可能會浪費(fèi)內(nèi)存空間。 比如看電影時,為了保證10個人能坐在一起,必須提前訂好10個連續(xù)的位置。這樣的好處就是能保證10個人可以在一起。但是這樣的缺點是,如果來的人不夠10個,那么剩下的位置就浪費(fèi)了。如果臨時有多來了個人,那么10個就不夠用了,這時可能需要將第11個位置上的人挪走,或者是他們11個人重新去找一個11連坐的位置,效率都很低。如果沒有找到符合要求的作為,那么就沒法坐了。

插入數(shù)據(jù)和刪除數(shù)據(jù)效率低,插入數(shù)據(jù)時,這個位置后面的數(shù)據(jù)在內(nèi)存中都要向后移。刪除數(shù)據(jù)時,這個數(shù)據(jù)后面的數(shù)據(jù)都要往前移動。 比如原來去了5個人,然后后來又去了一個人要坐在第三個位置上,那么第三個到第五個都要往后移動一個位子,將第三個位置留給新來的人。 當(dāng)這個人走了的時候,因為他們要連在一起的,所以他后面幾個人要往前移動一個位置,把這個空位補(bǔ)上。

隨機(jī)讀取效率很高。因為數(shù)組是連續(xù)的,知道每一個數(shù)據(jù)的內(nèi)存地址,可以直接找到給地址的數(shù)據(jù)。

并且不利于擴(kuò)展,數(shù)組定義的空間不夠時要重新定義數(shù)組。

2->鏈表的特點

在內(nèi)存中可以存在任何地方,不要求連續(xù)。? 在電影院幾個人可以隨便坐。

每一個數(shù)據(jù)都保存了下一個數(shù)據(jù)的內(nèi)存地址,通過這個地址找到下一個數(shù)據(jù)。 第一個人知道第二個人的座位號,第二個人知道第三個人的座位號……

增加數(shù)據(jù)和刪除數(shù)據(jù)很容易。 再來個人可以隨便坐,比如來了個人要做到第三個位置,那他只需要把自己的位置告訴第二個人,然后問第二個人拿到原來第三個人的位置就行了。其他人都不用動。

查找數(shù)據(jù)時效率低,因為不具有隨機(jī)訪問性,所以訪問某個位置的數(shù)據(jù)都要從第一個數(shù)據(jù)開始訪問,然后根據(jù)第一個數(shù)據(jù)保存的下一個數(shù)據(jù)的地址找到第二個數(shù)據(jù),以此類推。 要找到第三個人,必須從第一個人開始問起。

不指定大小,擴(kuò)展方便。鏈表大小不用定義,數(shù)據(jù)隨意增刪。

3-> 各自的優(yōu)缺點

數(shù)組的優(yōu)點: 隨機(jī)訪問性強(qiáng),查找速度快,

數(shù)組的缺點: 插入和刪除效率低, 可能浪費(fèi)內(nèi)存, 內(nèi)存空間要求高,必須有足夠的連續(xù)內(nèi)存空間。

數(shù)組大小固定,不能動態(tài)拓展

鏈表的優(yōu)點: 插入刪除速度快, 內(nèi)存利用率高,不會浪費(fèi)內(nèi)存 ,大小沒有固定,拓展很靈活。

鏈表的缺點 :不能隨機(jī)查找,必須從第一個開始遍歷,查找效率低

-數(shù)組? 鏈表

讀取O(1)O(n)

插入O(n)O(1)

刪除O(n)O(1)

83 網(wǎng)頁突然變慢怎么搞

1->top、iostat查看cpu、內(nèi)存及io占用情況

2-> 內(nèi)核、程序參數(shù)設(shè)置不合理:查看有沒有報內(nèi)核錯誤,連接數(shù)用戶打開文件數(shù)這些有沒有達(dá)到上限等等

3->? 鏈路本身慢:是否跨運(yùn)營商、用戶上下行帶寬不夠、dns解析慢、服務(wù)器內(nèi)網(wǎng)廣播風(fēng)暴什么的

4-> 程序設(shè)計不合理:是否程序本身算法設(shè)計太差,數(shù)據(jù)庫語句太過復(fù)雜或者剛上線了什么功能引起的

5-> 其它關(guān)聯(lián)的程序引起的:如果要訪問數(shù)據(jù)庫,檢查一下是否數(shù)據(jù)庫訪問慢

6-> 是否被攻擊了:查看服務(wù)器是否被DDos了等等

7-> 硬件故障 這個一般直接服務(wù)器就掛了,而不是訪問慢

84 DNS解析域名地址流程

1-> 發(fā)起基于域名的請求后,首先檢查本地緩存(瀏覽器緩存-->操作系統(tǒng)的hosts文件)

2-> 如果本地緩存中有,直接返回目標(biāo)IP地址,否則將域名解析請求發(fā)送給本地DNS服務(wù)器

3-> 如果本地DNS服務(wù)器中有,直接返回目標(biāo)IP地址,到這一步基本能解析80%的域名。如果沒有,本地DNS服務(wù)器將解析請求發(fā)送給根DNS服務(wù)器

4->? 根DNS服務(wù)器會返回給本地DNS服務(wù)器一個所查詢的TLD服務(wù)器地址列表

5 -> 本地DNS服務(wù)器再向上一步返回的TLD服務(wù)器發(fā)送請求,TLD服務(wù)器查詢并返回域名對應(yīng)的權(quán)威域名服務(wù)器的地址

6->? 本地DNS服務(wù)器再向上一步返回的權(quán)威域名服務(wù)器發(fā)送請求,權(quán)威域名服務(wù)器會查詢存儲的域名和IP的映射關(guān)系表,將IP連同一個TTL(過期時間)值返回給本地DNS服務(wù)器

7-> 本地DNS服務(wù)器會將IP和主機(jī)名的映射保存起來,保存時間由TTL來控制

8-> 本地DNS服務(wù)器把解析的結(jié)果返回給用戶,用戶根據(jù)TTL值緩存在本地系統(tǒng)緩存中,域名解析過程結(jié)束

85 啥是無效鏈接

1 死鏈接(Dead Links)指的是無效鏈接,也就是那些不可到達(dá)的鏈接。通俗地理解是以前可以通過點擊這個鏈接到達(dá)網(wǎng)站頁面,后續(xù)可能由于網(wǎng)站遷移、改版或操作不當(dāng)?shù)仍颍沟面溄又赶虻哪繕?biāo)頁面不存在而無法訪問所遺留的鏈接,即稱為死鏈接。

訪問死鏈接時,一般會出現(xiàn)“抱歉,您所訪問的頁面不存在”的提示信息或者 404 狀態(tài)頁面。

86 HTTP劫持,DNS劫持 (轉(zhuǎn)自http://www.itdecent.cn/p/1e3c98275cb3)

1->? HTTP 劫持的原理就是在服務(wù)器和用戶之間的信息傳輸之中添油加醋,這是由于信息沒有被加密而造成的。用戶請求了網(wǎng)站服務(wù)器,服務(wù)器返還網(wǎng)頁給用戶,在傳輸過程中就給了他人加料的機(jī)會。就算DNS服務(wù)器可靠,也無法防止HTTP劫持。

2->一般來說HTTP劫持主要通過下面幾個步驟來做:標(biāo)識HTTP連接。在天上飛的很多連接中,有許多種協(xié)議,第一步做的就是在TCP連接中,找出應(yīng)用層采用了HTTP協(xié)議的連接,進(jìn)行標(biāo)識;篡改HTTP響應(yīng)體,可以通過網(wǎng)關(guān)來獲取數(shù)據(jù)包進(jìn)行內(nèi)容的篡改;搶先回包,將篡改后的數(shù)據(jù)包搶先正常站點返回的數(shù)據(jù)包先到達(dá)用戶側(cè),這樣后面正常的數(shù)據(jù)包在到達(dá)之后會被直接丟棄。

3-> DNS劫持:在DNS服務(wù)器中,將www.xxx.com的域名對應(yīng)的IP地址進(jìn)行了變化。解析出來的域名對應(yīng)的IP,在劫持前后不一樣;HTTP劫持:DNS解析的域名的IP地址不變。在和網(wǎng)站交互過程中的劫持了你的請求。在網(wǎng)站發(fā)給你信息前就給你返回了請求。

4-> HTTPS不僅可以防止HTTP劫持,也能夠較好地防止DNS劫持,這是由于HTTPS的安全是由SSL來保證的,需要正確的證書,連接才會成立。如果DNS把域名解析到了不對應(yīng)的IP,是無法通過證書認(rèn)證的,連接會被終止

87 source、sh、bash ./sh的區(qū)別

1-> source在當(dāng)前shell內(nèi)去讀取、執(zhí)行a.sh,而a.sh不需要執(zhí)行權(quán)限

2-> sh,bash都是打開一個subshell去讀取、執(zhí)行a.sh,而a.sh不需要有"執(zhí)行權(quán)限"

3-> ./打開一個subshell,打開一個subshell去讀取、執(zhí)行a.sh,但a.sh需要有"執(zhí)行權(quán)限",可以用chmod +x添加執(zhí)行權(quán)限

88? 軟件開發(fā)的生命周期

1->分析階段:軟件開發(fā)首先需要進(jìn)行需求調(diào)研和分析完善的需求是軟件開發(fā)項目成敗的重要因素, 提煉所收集的用戶需求,建立完整的分析模型,把他編寫成軟件開發(fā)過程中需求,規(guī)格說明和初步的用戶手冊。

2->設(shè)計階段:軟件設(shè)計可以分為兩個階段概要設(shè)計和詳細(xì)設(shè)計,實際上軟件設(shè)計的主要任務(wù)就是把軟件分解成模塊是指實現(xiàn)某個功能的數(shù)據(jù)和程序的說明,概要設(shè)計就是結(jié)構(gòu)設(shè)計,其主要目標(biāo)就是給出軟件模塊結(jié)構(gòu),用軟件結(jié)構(gòu)圖表示,詳細(xì)設(shè)計的首要任務(wù)是設(shè)計模塊的程序流程,算法和數(shù)據(jù)結(jié)構(gòu),設(shè)計人員依據(jù)軟件需求規(guī)格說明文檔,確定軟件的體系結(jié)構(gòu),進(jìn)而確定每個模塊實現(xiàn)算法,數(shù)據(jù)結(jié)構(gòu)和接口等,編寫設(shè)計說明書,組織設(shè)計評審。

3->實現(xiàn)階段:軟件編碼是指把軟件設(shè)計轉(zhuǎn)換成計算機(jī)可以接受的程序,即寫成以某一段程序設(shè)計語言表示的“源程序清單”。充分了解軟件開發(fā)語言,工具的特性和編程風(fēng)格,有助于開發(fā)工具的選擇 保證開發(fā)產(chǎn)品的開發(fā)質(zhì)量。

4->測試階段:在設(shè)計測試用例的基礎(chǔ)上,測試軟件的各個組成模塊,然后,在把各個模塊集成起來,測試整個產(chǎn)品的功能和性能是否能夠滿足已有的規(guī)格說明。

5->維護(hù)階段:維護(hù)是指已經(jīng)完成對軟件的研制工作并交付使用后,對軟件產(chǎn)品所進(jìn)行的錯誤改正,適應(yīng)環(huán)境變化和增強(qiáng)功能等軟件工程修訂,做好軟件維護(hù)工作,不僅能排除障礙,使軟件能正常工作,而且還可以擴(kuò)展軟件功能,提高性能,為用戶帶來明顯的經(jīng)濟(jì)效益,

89 linux df,du的區(qū)別

1 du estimates and displays the disk space used by files.可知du基于文件計算和顯示磁盤占用情況,du:(disk use)顯示每個文件和目錄的磁盤使用空間。

2 df:(disk free)顯示磁盤分區(qū)上可以使用的磁盤空間。The df command reports the amount of available diskspace being used byfile systems. 基于文件系統(tǒng),意味著不會根據(jù)文件是否存在判斷當(dāng)前目錄的磁盤占用

90 DNS解析地址的流程(轉(zhuǎn)自在瀏覽器地址欄輸入一個URL后回車,背后會進(jìn)行哪些技術(shù)步驟? - 譚慶波的回答 - 知乎https://www.zhihu.com/question/34873227/answer/441492470)

查詢DNS,獲取域名對應(yīng)的IP。

1->檢查本地hosts文件是否有這個網(wǎng)址的映射,如果有,就調(diào)用這個IP地址映射,解析完成。

2->如果沒有,則查找本地DNS解析器緩存是否有這個網(wǎng)址的映射,如果有,返回映射,解析完成。

3->如果沒有,則查找填寫或分配的首選DNS服務(wù)器,稱為本地DNS服務(wù)器。服務(wù)器接收到查詢時:

如果要查詢的域名包含在本地配置區(qū)域資源中,返回解析結(jié)果,查詢結(jié)束,此解析具有權(quán)威性。

如果要查詢的域名不由本地DNS服務(wù)器區(qū)域解析,但服務(wù)器緩存了此網(wǎng)址的映射關(guān)系,返回解析結(jié)果,查詢結(jié)束,此解析不具有權(quán)威性。

4-> 如果本地DNS服務(wù)器也失效:

如果未采用轉(zhuǎn)發(fā)模式(迭代),本地DNS就把請求發(fā)至13臺根DNS,根DNS服務(wù)器收到請求后,會判斷這個域名(如.com)是誰來授權(quán)管理,并返回一個負(fù)責(zé)該頂級域名服務(wù)器的IP,本地DNS服務(wù)器收到頂級域名服務(wù)器IP信息后,繼續(xù)向該頂級域名服務(wù)器IP發(fā)送請求,該服務(wù)器如果無法解析,則會找到負(fù)責(zé)這個域名的下一級DNS服務(wù)器(如http://baidu.com)的IP給本地DNS服務(wù)器,循環(huán)往復(fù)直至查詢到映射,將解析結(jié)果返回本地DNS服務(wù)器,再由本地DNS服務(wù)器返回解析結(jié)果,查詢完成。

如果采用轉(zhuǎn)發(fā)模式(遞歸),則此DNS服務(wù)器就會把請求轉(zhuǎn)發(fā)至上一級DNS服務(wù)器,如果上一級DNS服務(wù)器不能解析,則繼續(xù)向上請求。最終將解析結(jié)果依次返回本地DNS服務(wù)器,本地DNS服務(wù)器再返回給客戶機(jī),查詢完成

90 app閃退的原因

1-> 弱網(wǎng)絡(luò)情況下,服務(wù)端響應(yīng)不及時,可能倒是閃退。(網(wǎng)絡(luò)異常引起的)

2-> 應(yīng)用版本太低,會導(dǎo)致不兼容,造成閃退。(有些API在老版本中有,在新版本中沒有,造成對象為空引起閃退)

3-> APP的SDK和手機(jī)的系統(tǒng)不兼容。

4-> 緩存垃圾過多:由于安卓系統(tǒng)的特性,如果長時間不清理垃圾文件。會導(dǎo)致越來越卡,也會出現(xiàn)閃退情況。

5-> 設(shè)計不合理,1個接口,拉取的數(shù)據(jù)量太大,請求結(jié)果會很慢,且占用大量內(nèi)存,APP會閃退(比如,我們現(xiàn)在做的記錄儀,進(jìn)入相冊列表時候,要拉取所有圖片,拉取太慢了,就閃退了)

6-> 不同APP間切換,交互測試,可能會出現(xiàn)閃退。

7-> 權(quán)限問題。

91 網(wǎng)頁很卡的原因

1-> 帶寬不足、硬件配置低、CPU或者是內(nèi)存被占滿。

2-> http請求次數(shù)太多。

3-> 接收數(shù)據(jù)時間過長,如下載資源過大。

4-> JS腳本過大,阻塞了頁面的加載。

5-> 網(wǎng)頁資源過多、接受數(shù)據(jù)時間長、加載某個資源慢。

6-> DNS解析速度慢

92 軟件測試流程

1->測試需求分析階段:閱讀需求,理解需求,主要就是對業(yè)務(wù)的學(xué)習(xí),分析需求點,參與需求評審會議

2-> 測試計劃階段:主要任務(wù)就是編寫測試計劃,參考軟件需求規(guī)格說明書,項目總體計劃,內(nèi)容包括測試范圍(來自需求文檔),進(jìn)度安排,人力物力的分配,整體測試策略的制定。風(fēng)險評估與規(guī)避措施有一個制定。

3- 測試設(shè)計階段:主要是編寫測試用例,會參考需求文檔(原型圖),概要設(shè)計,詳細(xì)設(shè)計等文檔,用例編寫完成之后會進(jìn)行評審。

4-> 測試執(zhí)行階段:搭建環(huán)境,執(zhí)行冒煙測試(預(yù)測試)-然后進(jìn)入正式測試,bug管理直到測試結(jié)束

5-> 測試評估階段:出測試報告,確認(rèn)是否可以上線

測試流程:了解用戶需求-->參考需求規(guī)格說明書-->測試計劃(人力物力時間進(jìn)度的安排)-->編寫測試用例-->評審用例-->搭建環(huán)境-->測試包安排預(yù)測(冒煙測試)-正式測試-bug-測試結(jié)束出報告-->版本上線-->面向用戶

93 http請求方法(轉(zhuǎn)自https://zhuanlan.zhihu.com/p/25441947)

1->get方法請求指定的頁面信息,返回實體主體。該請求是向服務(wù)器請求信息,請求參數(shù)會跟在url后面,因此,對傳參長度有限制的,而且不同瀏覽器的上限是不同的(2k, 7~8k及其他)。由于get請求直接將參數(shù)暴露在url中,因此對于一些帶有重要信息的請求可能并不完全合適。

2->post請求是向指定資源提交數(shù)據(jù)進(jìn)行處理請求,例如提交表單或者上傳文件等。數(shù)據(jù)被包含在請求體中,POST請求可能會導(dǎo)致新的資源的建立和/或已有資源的修改。post方法沒有對傳遞資源的大小進(jìn)行限制,往往是取決于服務(wù)器端的接受能力,而且,該方法傳參安全性稍高些

3-> put方法是從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容。PUT方法的本質(zhì)是idempotent的方法,通過服務(wù)是否是idempotent來判斷用PUT 還是 POST更合理,通常情況下這兩種方法并沒有刻意區(qū)分,根據(jù)語義使用即可

4.->delete請求服務(wù)器刪除指定的頁面,DELETE請求一般會返回3種狀態(tài)碼:

200 (OK) - 刪除成功,同時返回已經(jīng)刪除的資源

202 (Accepted) - 刪除請求已經(jīng)接受,但沒有被立即執(zhí)行(資源也許已經(jīng)被轉(zhuǎn)移到了待刪除區(qū)域)

204 (No Content) - 刪除請求已經(jīng)被執(zhí)行,但是沒有返回資源(也許是請求刪除不存在的資源造成的)

5->options 允許客戶端查看服務(wù)器的性能。(常見的是跨域預(yù)檢Preflighted Reqeusts方法會采用該方法)。一般來說,開發(fā)中用到該方法是用來獲取服務(wù)器支持的請求類型或者查看服務(wù)器類型,來確保接下來發(fā)送的請求夠安全。該請求方法的響應(yīng)不能緩存。如果該URI是一個星號(“*”),OPTIONS請求將試圖應(yīng)用于服務(wù)器,而不是某個指定資源;如果該URI不是星號,則只能用來獲取該資源通信中可用的選項。

6->head 類似于get請求,只不過返回的響應(yīng)中沒有具體的內(nèi)容,用于獲取報頭

7->connect方法HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器

8->trace方法回顯服務(wù)器收到的請求,主要用于測試或診斷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容