[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,另一方面我们在写代码时可以添加内存申请和释放的统计功能,统计当前申请和释放的内存是否一致,以此来判断内存是否泄露。

3.C++文件Core文件的调试手段