主要介紹C++常見面試題
1、說一下你理解的C++中的四種智能指針
常用接口
T* get();
T& operator*();
T* operator->();
T& operator=(const T& val);
T* release(); 將 封裝在內部的指針置為nullptr, 但并不會破壞指針所指向的內容, 函
數返回的是內部指針置空之前的值;
void reset (T* ptr = nullptr);直接釋放封裝的內部指針所指向的內存, 如果指定了 ptr 的值, 則將內部指針初始化為該值 (否則將其設置為nullptr)
weak_ptr(弱引?)
解決shared_ptr循環引用導致內存泄漏問題。 2層shared_ptr
2、C++ 中內存分配情況
棧:由編譯器管理分配和回收,存放局部變量和函數參數。
堆:由程序員管理,需要?動 new malloc delete free 進?分配和回收,空間較?,但可能會
出現內存泄漏和空閑碎?的情況。
全局/靜態存儲區:分為初始化和未初始化兩個相鄰區域,存儲初始化和未初始化的全局變量
和靜態變量。
常量存儲區:存儲常量,?般不允許修改。
代碼區:存放程序的?進制代碼。
3、C++ 中的指針參數傳遞和引?參數傳遞
指針傳遞是值傳遞
引用是別名,共享內存。傳引?的實質是傳地址,傳遞的是變量的地址。
4、說?下 C++ ?是怎么定義常量的?常量存放在內存的哪個位置?
對于局部常量,存放在棧區;
對于全局常量,編譯期?般不分配內存,放在符號表中以提?訪問效率;
字?值常量,?如字符串,放在常量區。
5、?參數構造函數什么時候生成
?參數構造函數:即默認構造函數,無任何構造函數,編譯器會自動生成。
6、 野指針與懸空指針有什么區別?
野指針(wild pointer):就是沒有被初始化過的指針。
懸空指針:是指針最初指向的內存已經被釋放了的?種指針。
7、 函數傳遞參數的?種?式
值傳遞:形參是實參的拷?,函數內部對形參的操作并不會影響到外部的實參。
指針傳遞:也是值傳遞的?種?式,形參是指向實參地址的指針,當對形參的指向操作時,就
相當于對實參本身進?操作。
引?傳遞:實際上就是把引?對象的地址放在了開辟的棧空間中,函數內部對形參的任何操作
可以直接映射到外部的實參上?。
8、new / delete ,malloc / free 區別
都可以?來在堆上分配和回收空間。new /delete 是操作符,malloc/free 是庫函數。
執? new 實際上執?兩個過程:1.分配未初始化的內存空間(malloc);2.使?對象的構造
函數對空間進?初始化;返回空間的?地址。如果在第?步分配空間中出現問題,則拋出
std::bad_alloc 異常,或被某個設定的異常處理函數捕獲處理;如果在第?步構造對象時出現
異常,則?動調? delete 釋放內存。
執? delete 實際上也有兩個過程:1. 使?析構函數對對象進?析構;2.回收內存空間
(free)。
new 得到的是經過初始化的空間,? malloc 得到的是未初始化的空間。
9、多態分類,有哪幾種
靜態多態,編譯時多態主要通過函數重載和模板實現。
運行時多態主要通過虛函數和繼承實現,其優點是靈活性高,可以在運行時根據實際對象類型來決定調用哪個函數。