C++面试八股文:什么是空指针/野指针/悬垂指针?
某日二师兄参加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++的空指针、野指针和指针赋值NULL.md
1.空指针和野指针 http://blog.csdn.net/fu_zk/article/details/21030607 空指针常量 一个表示0值的整数常量,叫做空指针常量.例如:0.0L.1-1( ...
- Rust语言——无虚拟机、无垃圾收集器、无运行时、无空指针/野指针/内存越界/缓冲区溢出/段错误、无数据竞争
2006年,编程语言工程师Graydon Hoare利用业余时间启动了Rust语言项目.该项目充分借鉴了C/C++/Java/Python等语言的经验,试图在保持良好性能的同时,克服以往编程语言所存在 ...
- 《面试八股文》之 JVM 20卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. <面试八股 ...
- 野指针(Wild pointer)和悬垂指针(dangling pointer)
详细参考如下: Dangling pointer(悬垂指针.迷途指针)和 Wild pointer(野指针) 迷途指针经常出现在混杂使用malloc() 和 free() 库调用: 当指针指向的内存释 ...
- 《面试八股文》之kafka21卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是moon,最新一篇面试八股文系 ...
- 《面试八股文》之 Redis 16卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. redis 作为 ...
- 指针的指针&指向指针数组的指针
一.指针的指针 指针的指针看上去有些令人费解.它们的声明有两个星号.例如: char ** cp; 如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针的指针 ...
- 通过数组初始化链表的两种方法:指向指针的引用node *&tail和指向指针的指针(二维指针)node **tail
面试高频题:单链表的逆置操作/链表逆序相关文章 点击打开 void init_node(node *tail,char *init_array) 这样声明函数是不正确的,函数的原意是通过数组初始化链表 ...
- c/c++ 复习基础要点01-const指针、指针函数 函数指针、new/delete与malloc/free区别与联系
1. 引用本身是有指针实现的:引用为只读指针 例子: int d=123; int& e=d; //引用 int * const e=d; //只读指针,e指向d,不可修改e指 ...
- 承诺c指针 (1)指针是地址
(1)是地址 首先明白一个观点:指针就是地址.这是理解指针的起始一步. 直观感受下.变量的地址 int main() { int foo; int *foo_p; foo = 5; foo_p = & ...
随机推荐
- Unity学习笔记01 —— 编辑器
场景Scene 基本操作 按下鼠标滚轮拖动场景,滑动滚轮缩放场景. 鼠标右键旋转场景,点击""后,通过左键移动场景. 点击右键同时按下W/S/A/D/Q/E键可实现场景漫游. 在S ...
- Schillace法则:使用LLM创建软件的最佳实践
LLM(大语言模型)的发展正在改变软件开发的方式. 以前,开发人员需要编写大量的代码来实现其意图,但现在,随着语言模型的发展,开发人员可以使用自然语言来表达他们的意图,而无需编写大量的代码.这使得软件 ...
- 五月十三号Java基础知识点
1.getFields()和getMethods()方法获得权限为public的本类的以及父类继承的成员变量和成员方法2.getDeclaredFields()和getDeclaredMethods( ...
- 阿里云OSS服务 — 上传失败
问题重现 使用PicGo + 阿里云对象存储搭建图床,一直都能够正常使用,在没有修改任何配置的情况下,上传图片一直失败. 出现如下错误: StatusCodeError: 403 - "&l ...
- ASP.NET Core - 缓存之内存缓存(下)
话接上篇 [ASP.NET Core - 缓存之内存缓存(上)],所以这里的目录从 2.4 开始. 2.4 MemoryCacheEntryOptions MemoryCacheEntryOption ...
- Python爬取pexels图片
研究Python爬虫,网上很多爬取pexels图片的案例,我下载下来运行没有成功,总量有各种各样的问题. 作为菜鸟初学者,网上的各个案例代码对我还是有不少启发作用,我用搜索引擎+chatGPT逐步对代 ...
- OpenCv单模版多目标匹配
OpenCv单模版多目标匹配 单模版匹配出现的问题 一. 关于单模版匹配,我一开始用的是光线较暗的图,结果根据模版匹配到的位置并不正确. 我后来想用阈值把图形的特征提取出来,在把模版的特征和原图的特征 ...
- RTSP Server(LIVE555)源码分析(一)-重要关系类
live项目包括四个基本的库,程序入口类(在mediaServer中),各种测试代码(测试代码在testProgs里面). 四个基本的库分别是: UsageEnvironment&TaskSc ...
- (数据科学学习手札152)geopandas 0.13版本更新内容一览
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,昨天晚上geopandas正式 ...
- Python工具箱系列(三十)
PostgreSQL MySQL的口号是"世界上最流行的开源关系型数据库",而PostgreSQL的Slogan则是"世界上最先进的开源关系型数据库(PostgreSQL ...