您的位置:首页 > 编程语言 > C语言/C++

【个人纪录】C++面试总结之一(多态)

2020-12-18 10:36 1436 查看

不严谨之处较多,欢迎大佬指正,在学习的路上不断狂奔
比如面试官问了一个多态问题,然后就可以针对多态这个问题适当展开,不至于问你一个就回答这一个问题,无法完全展示自己技能,适当的展开可以为面试加分哟
开始:
多态分为静态多态、动态多态。静态多态,重载,就是在同一作用域内,函数名相同,参数不同,根据参数来确定调用。动态多态,重写,主要是虚函数,父类指针指向子类对象,接着再用指针调用被重写函数。一个类有虚函数,就有虚函数表,虚函数表里存放的就是每个虚函数的地址,若子类未重写虚函数,那么虚函数表中的虚函数的地址就还是父类的虚函数的地址,一旦子类重写了,那么这个地址就会变成重写之后的虚函数的地址。
说到虚函数,如果 一个类要子类,那么它的析构函数一定要声明为虚函数,不然会造成内存泄漏,原因在于,如果父类的析构函数不是虚函数,那么在销毁对象时,只会调用父类析构函数,子类对象无法释放,导致内存泄露;如果父类析构函数是虚函数。那么在释放时,首先调用子类析构,使得子类对象得以释放,接着进入父类析构,释放父类对象,这样父类子类都得以完全释放。这就是为什么父类析构必须是虚函数的原因。
再讲到内存泄漏,内存泄漏是C++开发中比较容易出现的现象,往轻的说,一个项目运行速度及效率会降低,慢慢变卡,体验会急剧下降,严重的话可能会导致机器崩溃和死机,所以在开发过程中内存泄漏需要尤为重视。动态分配内存比较常用,比较容易出现未释放或者释放不完全的情况,也很难发现哪块造成内存泄漏了,可以通过一些内存泄漏检测工具来定位防止,这个后面讲。这里着重说一下C++令一个有效防止内存泄漏的方法—智能指针!
智能指针有自动指针、共享指针、唯一指针、弱指针。
若使用智能指针,则不需程序员自己释放,智能指针机制就是自动释放已申请的内存。auto_ptr在C++11当中虽然已标为弃用,但还可以用,在C++17中就完全移除了。原因在于auto_ptr在释放的时候使用delete而不使用delete[],这样就会造成内存泄漏,故不再使用。还有唯一指针、弱指针、共享指针。这里说一下比较重要的共享指针,只说核心:多个指针指向同一块内存,在这块内存上每多一个指针指向它,那么它的引用计数就会+1,在释放的时候,每释放一个指针,那么它的引用计数就会-1,直到它的引用计数减到0,才会得到完全释放。
通过检测工具来排查内存泄漏事件是一个非常有效的手段。上面提到了VLD内存泄漏检测工具,该工具运行起来后可直接在项目中看到那一块造成内存泄漏了,甚至可以具体看到哪一行有问题,定位出来之后可以针对性避免,可以大大提高产品的健硕性。
提到内存泄漏就难以不提到内存溢出,内存泄漏基本就是未释放或者释放不完全导致,那么内存溢出呢,举个很简单的例子:比如现在需要开辟10个字节的内存,但是系统只剩5个字节的大小了,这个时候就会造成内存溢出;再有就是数组溢出也是内存溢出的典型示例。这样就可以很清楚的搞明白泄漏和溢出是怎么回事了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: