乐趣区

关于c++:C面试八股文什么是空指针野指针悬垂指针

某日二师兄加入 XXX 科技公司的 C ++ 工程师开发岗位第 30 面:

面试官:什么是空指针?

二师兄:个别咱们将等于 0/NULL/nullptr 的指针称为空指针。空指针不能被解援用,然而能够对空指针取地址。

int* p = nullptr;    // 空指针
*p = 42;    // 空指针不能够解援用
int** pp = &p    // 空指针能够取地址

面试官:你晓得 0/NULL/nullptr 三者之间的区别吗?

二师兄:尽管三者都能定义空指针,但三者类型不同。

二师兄:0int 类型,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 没有 freenew 没有 deletenew[]delete混用。

面试官:如何防备内存透露问题?

二师兄:最简略的方法是应用资源获取即初始化(RAII)技术将资源放在类中治理,在类结构时获取资源(malloc/new), 在类的析构函数中开释资源(free/delete),应用 C ++ 的结构和析构机制保障资源的正确申请和开释。

二师兄:咱们罕用的 std::shared_ptrstd::unique_ptrstd::lock_guard 就是采纳这种技术治理资源。

面试官:最初一个问题,如何查找程序中是否呈现了内存透露?

二师兄:只有有两种办法:

1. 本人入手:把所有应用 malloc/free 的中央改成 new/delete,重载全局的newdelete,并退出申请和开释内存容量的统计逻辑。

2. 采纳工具:能够应用诸如Valgrind(在 Linux 上)或Dr. Memory(在 Windows 上)等内存调试工具来检测内存透露。这些工具能够在运行程序时检测内存透露,并提供具体的报告和调试信息。

面试官:好的。明天的面试完结,请等音讯。

明天的面试到这里就完结了,祝大家周末欢快~

关注我,带你 21 天“精通”C++!(狗头)

退出移动版