C++面试题大全
[TOC]
概述
文章参考:https://blog.csdn.net/qq_31442743/article/details/116119490
文章参考:https://www.zhihu.com/question/60911582
文章参考:https://developer.aliyun.com/article/709155
C++内存模型
1.C/C++内存有哪几种类型
C中,内存分为5个区:堆(malloc)、栈(如局部变量、函数参数)、程序代码区(存放二进制代码)、全局/静态存储区(全局变量、static变量)和常量存储区(常量)。此外,C++中有自由存储区(new)一说。
2.C++堆和栈的区别?
1)堆存放动态分配的对象——即那些在程序运行时动态分配的对象,比如 new 出来的对象,其生存期由程序控制;
2)栈用来保存定义在函数内的非static对象,如局部变量,仅在其定义的程序块运行时才存在;
3)静态内存用来保存static对象,类static数据成员以及定义在任何函数外部的变量,static对象在使用之前分配,程序结束时销毁;
4)栈和静态内存的对象由编译器自动创建和销毁。
3.堆和自由存储区的区别?
总的来说,堆是C语言和操作系统的术语,是操作系统维护的一块动态分配内存;自由存储是C++中通过new与delete动态分配和释放对象的抽象概念。他们并不是完全一样。
从技术上来说,堆(heap)是C语言和操作系统的术语。堆是操作系统所维护的一块特殊内存,它提供了动态分配的功能,当运行程序调用malloc()时就会从中分配,稍后调用free可把内存交还。而自由存储是C++中通过new和delete动态分配和释放对象的抽象概念,通过new来申请的内存区域可称为自由存储区。基本上,所有的C++编译器默认使用堆来实现自由存储,也即是缺省的全局运算符new和delete也许会按照malloc和free的方式来被实现,这时藉由new运算符分配的对象,说它在堆上也对,说它在自由存储区上也正确。
C++面向对象
1.简述一下C++中的多态实现的原理。
答案:C++多态的实现基础学习
2.构造函数和移动构造函数的区别
3.构造函数是否可以是虚函数?
不可以,虚表是在构造函数执行时才建立的
4.构造函数是否可以抛出异常?
可以,但是如果有动态内存需要进行释放
5.什么情况下必须使用构造函数初始化而不能进行赋值?
成员变量存在常类、引用或者默认构造函数被禁用时
6.什么构造函数会在main函数之前运行?
全局变量的构造函数
7.怎么防止类对象被拷贝和赋值,
8.什么是虚函数,虚函数的实现原理是什么?
答案:C++虚函数的实现原理
C++语法
1. const关键字的作用
2. C++是否是类型安全的语言?
3. static关键字的用法和作用
4. typedef和define有什么区别
C++指针相关
1.C/C++引用和指针的区别?
2.C++的智能指针的分类?
(1)std::auto_ptr,有很多问题。 不支持复制(拷贝构造函数)和赋值(operator =),但复制或赋值的时候不会提示出错。因为不能被复制,所以不能被放入容器中。
(2) C++11引入的unique_ptr, 也不支持复制和赋值,但比auto_ptr好,直接赋值会编译出错。实在想赋值的话,需要使用:std::move。
(3) C++11或boost的shared_ptr,基于引用计数的智能指针。可随意赋值,直到内存的引用计数为0的时候这个内存会被释放。
(4)C++11或boost的weak_ptr,弱引用。 引用计数有一个问题就是互相引用形成环,这样两个指针指向的内存都无法释放。需要手动打破循环引用或使用weak_ptr。顾名思义,weak_ptr是一个弱引用,只引用,不计数。如果一块内存被shared_ptr和weak_ptr同时引用,当所有shared_ptr析构了之后,不管还有没有weak_ptr引用该内存,内存也会被释放。所以weak_ptr不保证它指向的内存一定是有效的,在使用之前需要检查weak_ptr是否为空指针。
C++数据结构
1.C++的链表和数组有什么区别?
2.简述C++简述队列和栈的异同
C++性能优化
1.什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法?你通常采用哪些方法来避免和减少这类错误?
- 堆内存泄漏。使用了new,没有delete。或者使用了malloc 没有free。
- 系统资源泄漏。例如使用了socket,用完后没有关闭。
- 没有将基类的析构函数定义为虚函数。这会造成子类资源不能释放。
2.如何判断内存泄露
内存泄漏通常是由于调用了malloc/new等内存申请的操作,但是缺少了对应的free/delete。为了判断内存是否泄露,我们一方面可以使用linux环境下的内存泄漏检查工具Valgrind,另一方面我们在写代码时可以添加内存申请和释放的统计功能,统计当前申请和释放的内存是否一致,以此来判断内存是否泄露。