某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第30面:
面試官:什么是空指針?
二師兄:一般我們將等于
0
/NULL
/nullptr
的指針稱為空指針。空指針不能被解引用,但是可以對空指針取地址。
int* p = nullptr; //空指針
*p = 42; //空指針不可以解引用
int** pp = &p //空指針可以取地址
面試官:你知道
0/NULL/nullptr
三者之間的區(qū)別嗎?二師兄:雖然三者都能定義空指針,但三者類型不同。
二師兄:
0
是int
類型,NULL
在g++下是一個宏定義,而nullptr
是有類型的;
#define NULL ((void *)0)
typedef decltype(nullptr) nullptr_t;
sizeof(0);// 4
sizeof(NULL);//8
sizeof(nullptr);//8
二師兄:在函數(shù)重載時,會根據(jù)實參的類型選擇重載函數(shù):
#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
定義空指針,因為它時有類型的,編譯器能夠對它進行類型檢查。面試官:什么是野指針?
二師兄:野指針突出一個野字,這個野就是狀態(tài)未知的。它可能指向一塊未知的區(qū)域:
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
),在類的析構函數(shù)中釋放資源(free/delete
),使用C++的構造和析構機制保證資源的正確申請和釋放。二師兄:我們常用的
std::shared_ptr
和std::unique_ptr
及std::lock_guard
就是采用這種技術管理資源。面試官:最后一個問題,如何查找程序中是否出現(xiàn)了內存泄漏?
二師兄:只要有兩種方法:
1.自己動手:把所有使用
malloc/free
的地方改成new/delete
,重載全局的new
和delete
,并加入申請和釋放內存容量的統(tǒng)計邏輯。2.采用工具:可以使用諸如
Valgrind
(在Linux上)或Dr. Memory
(在Windows上)等內存調試工具來檢測內存泄漏。這些工具可以在運行程序時檢測內存泄漏,并提供詳細的報告和調試信息。面試官:好的。今天的面試結束,請等消息。
今天的面試到這里就結束了,祝大家周末愉快~文章來源:http://www.zghlxwxcb.cn/news/detail-511914.html
關注我,帶你21天“精通”C++?。ü奉^)文章來源地址http://www.zghlxwxcb.cn/news/detail-511914.html
到了這里,關于C++面試八股文:什么是空指針/野指針/懸垂指針?的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!