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 = & ...
随机推荐
- KubeSphere 高可用集群搭建并启用所有插件
介绍 大多数情况下,单主节点集群大致足以供开发和测试环境使用.但是,对于生产环境,您需要考虑集群的高可用性.如果关键组件(例如 kube-apiserver.kube-scheduler 和 kube ...
- [数据结构]二叉搜索树(BST) VS 平衡二叉排序树(AVL) VS B树(平衡多路搜索树) VS B+树 VS 红黑树(平衡二叉B树)
1 二叉排序树/二叉查找树/Binary Sort Tree 1种对排序和查找都很有用的特殊二叉树 叉排序树的弊端的解决方案:平衡二叉树 二叉排序树必须满足的3条性质(或是具有如下特征的二叉树) 若它 ...
- python中的类继承
""" """ class Animal(object): def __init__(self,name,food): self.name ...
- scikit-learn 中 Boston Housing 数据集问题解决方案
scikit-learn 中 Boston Housing 数据集问题解决方案 在部分旧教程或教材中是 sklearn,现在[2023]已经变更为 scikit-learn 作用:开源机器学习库,支持 ...
- Go语言核心知识回顾(反射)
有时要求写一个函数有能力统一处理各种值类型的函数,而这些类型可能无法共享同一个接口,也可能布局未知,也有可能这个类型在设计函数时并不存在,当我们无法透视一个未知类型的布局时,这段代码就无法继续,这是就 ...
- devops-5:从0开始构建一条完成的CI CD流水线
从0开始构建一条完成的CI CD流水线 前文中已经讲述了静态.动态增加agent节点,以动态的k8s cloud为例,下面就以Maven构建Java程序为例,开始构建出一条完整的CI CD流水线. 实 ...
- java指定时间失效Calendar
获取第二天的1:30的毫秒数 public static Long getEveryDayTime() { Calendar calendar = Calendar.getInstance(); ca ...
- 获取电脑的网络连接状态(四)IPHost
网络连接判断,使用IPHost测试获取: 1 public static bool IsIPHostConnected() 2 { 3 try 4 { 5 System.Net.IPHostEntry ...
- 快速求popcount的和
前置知识 \(\text{popcount}(n)\) 表示将 \(n\) 转为二进制后的数中 \(1\) 的个数. 结论 \[\sum_{i=1}^{n} \text{ popcount}(i)=\ ...
- CS144 计算机网络 Lab4:TCP Connection
前言 经过前面几个实验的铺垫,终于到了将他们组合起来的时候了.Lab4 将实现 TCP Connection 功能,内部含有 TCPReceiver 和 TCPSender,可以与 TCP 连接的另一 ...