某日二師兄參加XXX科技公司的C++工程師開發崗位第30面:
面試官:什么是空指標?
二師兄:一般我們將等于
0/NULL/nullptr的指標稱為空指標,空指標不能被解參考,但是可以對空指標取地址,
int* p = nullptr; //空指標
*p = 42; //空指標不可以解參考
int** pp = &p //空指標可以取地址
面試官:你知道
0/NULL/nullptr三者之間的區別嗎?二師兄:雖然三者都能定義空指標,但三者型別不同,
二師兄:
0是int型別,NULL在g++下是一個宏定義,而nullptr是有型別的;
#define NULL ((void *)0)
typedef decltype(nullptr) nullptr_t;
sizeof(0);// 4
sizeof(NULL);//8
sizeof(nullptr);//8
二師兄:在函式多載時,會根據實參的型別選擇多載函式:
#include <iostream>
void fun(int) {std::cout << "int" << std::endl;}
void fun(int*) {std::cout << "int*" << std::endl;}
void fun(nullptr_t) {std::cout << "nullptr_t" << std::endl;}
int main(int argc, char const *argv[])
{
fun(0); //編譯通過,匹配fun(int)
fun(NULL); //編譯失敗,可以匹配 fun(int) fun(int*) fun(nullptr_t)
fun(nullptr); //編譯成功,匹配fun(nullptr_t)
return 0;
}
二師兄:在C++11之后,建議使用
nullptr定義空指標,因為它時有型別的,編譯器能夠對它進行型別檢查,面試官:什么是野指標?
二師兄:野指標突出一個野字,這個野就是狀態未知的,它可能指向一塊未知的區域:
int* p; //野指標,指標未初始化
*p = 42; //對野指標解參考,未定義的操作
面試官:什么是垂懸指標?
二師兄:垂懸指標是指指標指向的內容已被釋放,指標指向的物件的生命周期已結束,
int* p = new int(42);
delete p;
*p = 1024; //垂懸指標,指標指向的物件已被釋放
int* p = nullptr;
{
int i = 42;
p = &i;
}
*p = 1024; //垂懸指標,指向的物件的生命周期已結束
面試官:如何解決空指標、野指標、垂懸指標帶來的問題?
二師兄:主要可以從有以下幾點入手:
1.在解參考指標之前,要判斷指標是否為空,(解決空指標解參考問題)
2.對于定義的指標,一定要進行初始化(
=nullptr),(解決野指標問題)3.對于釋放過內容的指標,立即將指標置為
nullptr,(解決垂懸指標、指標二次釋放問題)4.要注意長生命周期的指標不能指向短生命周期的物件,(解決垂懸指標問題)
5.C++11之后使用智能指標,
面試官:好的,那你知道什么是記憶體泄漏(
memory leak)嗎?二師兄:記憶體泄漏是指分配的記憶體空間沒有被正確釋放的情況,常見的情況有
malloc沒有free,new沒有delete,new[]和delete混用,面試官:如何防范記憶體泄漏問題?
二師兄:最簡單的辦法是使用資源獲取即初始化(
RAII)技術將資源放在類中管理,在類構造時獲取資源(malloc/new),在類的解構式中釋放資源(free/delete),使用C++的構造和析構機制保證資源的正確申請和釋放,二師兄:我們常用的
std::shared_ptr和std::unique_ptr及std::lock_guard就是采用這種技術管理資源,面試官:最后一個問題,如何查找程式中是否出現了記憶體泄漏?
二師兄:只要有兩種方法:
1.自己動手:把所有使用
malloc/free的地方改成new/delete,多載全域的new和delete,并加入申請和釋放記憶體容量的統計邏輯,2.采用工具:可以使用諸如
Valgrind(在Linux上)或Dr. Memory(在Windows上)等記憶體除錯工具來檢測記憶體泄漏,這些工具可以在運行程式時檢測記憶體泄漏,并提供詳細的報告和除錯資訊,面試官:好的,今天的面試結束,請等訊息,
今天的面試到這里就結束了,祝大家周末愉快~
關注我,帶你21天“精通”C++!(狗頭)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/556403.html
標籤:其他
上一篇:String決議及其方法
下一篇:返回列表
