gpt4 book ai didi

C++面试八股文:什么是空指针/野指针/悬垂指针?

转载 作者:我是一只小鸟 更新时间:2023-07-01 06:31:23 26 4
gpt4 key购买 nike

某日二师兄参加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++!(狗头) 。

最后此篇关于C++面试八股文:什么是空指针/野指针/悬垂指针?的文章就讲到这里了,如果你想了解更多关于C++面试八股文:什么是空指针/野指针/悬垂指针?的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com