设为首页 收藏本站
查看: 147|回复: 0

[经验分享] C++面试八股文:什么是空指针/野指针/悬垂指针?

[复制链接]
累计签到:50 天
连续签到:1 天
发表于 2025-2-10 13:22:36 | 显示全部楼层 |阅读模式
某日二师兄参加XXX科技公司的C++工程师开发岗位第30面:
面试官:什么是空指针?
二师兄:一般我们将等于0/NULL/nullptr的指针称为空指针。空指针不能被解引用,但是可以对空指针取地址。

[C++] 纯文本查看 复制代码
int* p = nullptr;        //空指针
*p = 42;        //空指针不可以解引用
int** pp = &p        //空指针可以取地址
面试官:你知道0/NULL/nullptr三者之间的区别吗?
二师兄:虽然三者都能定义空指针,但三者类型不同。
二师兄:0是int类型,NULL在g++下是一个宏定义,而nullptr是有类型的;

[C++] 纯文本查看 复制代码
#define NULL ((void *)0)

typedef decltype(nullptr) nullptr_t;

sizeof(0);// 4
sizeof(NULL);//8
sizeof(nullptr);//8
二师兄:在函数重载时,会根据实参的类型选择重载函数:
[C++] 纯文本查看 复制代码
#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定义空指针,因为它时有类型的,编译器能够对它进行类型检查。
面试官:什么是野指针?
二师兄:野指针突出一个野字,这个野就是状态未知的。它可能指向一块未知的区域:

[C#] 纯文本查看 复制代码
int* p;                //野指针,指针未初始化
*p = 42;        //对野指针解引用,未定义的操作
面试官:什么是垂悬指针?
二师兄:垂悬指针是指指针指向的内容已被释放,指针指向的对象的生命周期已结束。

[C++] 纯文本查看 复制代码
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上)等内存调试工具来检测内存泄漏。这些工具可以在运行程序时检测内存泄漏,并提供详细的报告和调试信息。
面试官:好的。今天的面试结束,请等消息。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-1005678-1-1.html 上篇帖子: C++面试八股文:什么是构造函数? 下篇帖子: C++面试八股文:如何实现一个strncpy函数?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表