某日二师兄参加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++面试八股文:什么是空指针/野指针/悬垂指针?的更多相关文章

  1. C++的空指针、野指针和指针赋值NULL.md

    1.空指针和野指针 http://blog.csdn.net/fu_zk/article/details/21030607 空指针常量 一个表示0值的整数常量,叫做空指针常量.例如:0.0L.1-1( ...

  2. Rust语言——无虚拟机、无垃圾收集器、无运行时、无空指针/野指针/内存越界/缓冲区溢出/段错误、无数据竞争

    2006年,编程语言工程师Graydon Hoare利用业余时间启动了Rust语言项目.该项目充分借鉴了C/C++/Java/Python等语言的经验,试图在保持良好性能的同时,克服以往编程语言所存在 ...

  3. 《面试八股文》之 JVM 20卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. <面试八股 ...

  4. 野指针(Wild pointer)和悬垂指针(dangling pointer)

    详细参考如下: Dangling pointer(悬垂指针.迷途指针)和 Wild pointer(野指针) 迷途指针经常出现在混杂使用malloc() 和 free() 库调用: 当指针指向的内存释 ...

  5. 《面试八股文》之kafka21卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是moon,最新一篇面试八股文系 ...

  6. 《面试八股文》之 Redis 16卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. redis 作为 ...

  7. 指针的指针&指向指针数组的指针

    一.指针的指针    指针的指针看上去有些令人费解.它们的声明有两个星号.例如:        char ** cp;    如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针的指针 ...

  8. 通过数组初始化链表的两种方法:指向指针的引用node *&tail和指向指针的指针(二维指针)node **tail

    面试高频题:单链表的逆置操作/链表逆序相关文章 点击打开 void init_node(node *tail,char *init_array) 这样声明函数是不正确的,函数的原意是通过数组初始化链表 ...

  9. c/c++ 复习基础要点01-const指针、指针函数 函数指针、new/delete与malloc/free区别与联系

    1.      引用本身是有指针实现的:引用为只读指针 例子: int d=123; int& e=d;    //引用 int * const e=d; //只读指针,e指向d,不可修改e指 ...

  10. 承诺c指针 (1)指针是地址

    (1)是地址 首先明白一个观点:指针就是地址.这是理解指针的起始一步. 直观感受下.变量的地址 int main() { int foo; int *foo_p; foo = 5; foo_p = & ...

随机推荐

  1. mysql迁移:xtrabackup迁移mysql5.7.32

    问题描述:利用外部xtrabackup工具来做迁移mysql数据库,或者恢复数据库 xtrabackup迁移mysql 1.环境 mysql源库 mysql目标迁移库 IP 192.168.163.3 ...

  2. 用 hexo 结合 github 从0到1开始搭建属于你的blog

    前言 github pages服务搭建博客的好处有: 全是静态文件,访问速度快: 免费方便,不用花一分钱就可以搭建一个自由的个人博客,不需要服务器不需要后台: 可以随意绑定自己的域名,不仔细看的话根本 ...

  3. 【FAQ】统一扫码服务常见问题及解答

    1.隐私政策是怎么样的?收集哪些信息? 关于Scan Kit的隐私政策及收集的信息,请查看SDK隐私安全说明. Android:SDK隐私安全说明 iOS:SDK隐私安全说明 2.如何使用多码识别?多 ...

  4. Python 字典嵌套

    字典嵌套 含义:将一系列字典存储在列表中,或将列表作为值存储在字典中 在列表中嵌套字典.在字典中嵌套列表.在字典中嵌套字典 字典列表 创建多个字典,将字典存放在列表中 使用range()自动生成多个字 ...

  5. Android JetPack~LiveData(二) 数据倒灌问题

    Android数据绑定技术一,企业级开发 Android数据绑定技术二,企业级开发 Android  JetPack~ DataBinding(数据绑定)(一)    集成与使用 Android  J ...

  6. oracle异常处理

    序言 最近在工作中遇到这么一个场景: 在同一网段内存在着A库和B库,需要将A库下某些表的数据同步到B库 B库跑着定时任务,定时调用存储过程将A库下的数据同步到B库. B库和A库是通过建立dblink建 ...

  7. 2020-11-26:go中,map的创建流程是什么?

    福哥答案2020-11-26: [答案来自此链接:](https://www.bilibili.com/video/BV1Nr4y1w7aa?p=10)源码位于runtime/map.go文件中的ma ...

  8. 2022-04-03:k8s安装srs,yaml如何写?

    2022-04-03:k8s安装srs,yaml如何写? 答案2022-04-03: yaml如下: apiVersion: apps/v1 kind: Deployment metadata: la ...

  9. Pycharm的Available Packages为空问题

    问题描述:可用软件包为空,Pycharm的Available Packages为空问题 打开软件包仓库设置画面 新建软件包仓库 输入软件包仓库 完成,可用软件包 Available Packages正 ...

  10. 使用增强版 singleflight 合并事件推送,效果炸裂!

    hello,大家好啊,我是小楼. 最近在工作中对 Go 的 singleflight 包做了下增强,解决了一个性能问题,这里记录下,希望对你也有所帮助. singleflight 是什么 single ...