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

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. pysimplegui之窗口大小,位子,主题等属性修改

    重点 1finalize()或Window参数finalize=True 调用以强制窗口通过初始化的最后阶段.这将导致 tkinter 资源被分配,以便它们可以被修改.这也会导致您的窗口出现.如果您不 ...

  2. [MAUI 项目实战] 手势控制音乐播放器(四):圆形进度条

    @ 目录 关于图形绘制 创建自定义控件 使用控件 创建专辑封面 项目地址 我们将绘制一个圆形的音乐播放控件,它包含一个圆形的进度条.专辑页面和播放按钮. 关于图形绘制 使用MAUI的绘制功能,需要Mi ...

  3. 补五月五号java基础知识点

    1.容器类:容器类是java以类库的形式供有用户开发程序时可直接使用的各种数据结构.2.java容器框架中有两个名称分别为Collection和Set的接口,为防止名称的冲突,本书将Collectio ...

  4. Junit5 pom依赖

    <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter- ...

  5. SQL优化(一)

    1.什么是SQL优化 SQL语句的优化是将性能低下的SQL语句转换成目的相同但是性能优异的SQL语句. 2.为什么需要学习SQL优化 SQL语句是对数据库进行操作的惟一途径,对数据库系统的性能起着决定 ...

  6. 使用CodeArts发布OBS,函数工作流刷新CDN缓存

    摘要:上次通过OBS和CDN部署来Hexo网站,但是每次我们不可能都自己编译然后在上传到OBS,不然太麻烦了,所以我们需要构建流水线,通过PUSH Markdown来发布文章. 本文分享自华为云社区& ...

  7. mysql查询表中一个字段第三个字母为A第五个字母为R的sql

    select id ,name, age from user where name like ' _ _A_R%';

  8. C 语言版线程池

    一.初始线程池 1.1 何为线程池? 我们先来打个比方,线程池就好像一个工具箱,我们每次需要拧螺丝的时候都要从工具箱里面取出一个螺丝刀来.有时候需要取出一个来拧,有时候螺丝多的时候需要多个人取出多个来 ...

  9. Auto-GPT测评:自信、努力、不合格

    这两天,Auto-GPT 爆火 https://github.com/Torantulino/Auto-GPT 它是一款让最强语言模型GPT-4能够自主完成任务的模型,让整个AI圈疯了.它的嘴大突破是 ...

  10. 学习C语言的第一天

    今天学习C语言学习了三个部分: 第一个部分是软件环境的搭建,如何搭建一个项目 使用工具:visual studio 2010 搭建过程:新建项目.配置设置(主要是解决运行后一闪而过的问题) 第二部分是 ...