1 C++11的新特性有哪些?

  • long long 类型
  • 列表初始化(花括号)
  • nullptr常量
  • auto类型指示符
  • 类内初始化
  • 范围for语句
  • 智能指针——自动释放所指向的对象。

    2 智能指针

    2.1 shared_ptr

    多个智能指针可以共享同一个对象,当指向对象的最后一个 shared_ptr 被销毁时,shared_ptr 类就会通过析构函数自动销毁这个对象。shared_ptr 还会自动释放所关联的内存。

    2.2 unique_ptr

    在异常时,可以帮助避免资源泄露的智能指针,独占所指向的对象。拥有者被销毁或指向其他对象,之前的对象就会被销毁,相应的资源也会被释放。

    2.3 wake_ptr

    是一种弱引用,指向shared_ptr所管理的对象,但不拥有某对象,一旦最后一个拥有该对象的智能指针失去所有权,wake_ptr 就会自动变成空。

    3 多态

    C++多态意味着调用成员函数时,可以根据对象的类型执行不同的函数。多态以封装和继承为基础。
  1. 重载多态(Ad-hoc Polymorphism,编译期):函数重载、运算符重载
  2. 子类型多态(Subtype Polymorphism,运行期):虚函数
  3. 参数多态(Parametric Polymorphism,编译期):类模板、函数模板
  4. 强制多态(Coercion Polymorphism,编译期/运行期):基本类型转换、自定义类型转换

    4 析构函数

    4.1 什么时候调用析构函数

    delete一个对象的时候,先调用析构函数清理资源,然后底层调用free释放空间。

    5 内存泄漏2

    申请了内存不释放

    5.1 什么情况会内存泄漏

  • 指针重新赋值
  • 错误的内存释放
  • 返回值的不正确处理

    5.2 如何解决

  • 确保没有在访问空指针。

  • 每个内存分配函数都有一个 free 与之对应,alloca 函数除外。
  • 分配内存后及时初始化(可以结合 memset 函数进行初始化,calloc 函数除外。)
  • 对指针赋值前,确保没有内存位置会孤立。
  • 每当释放结构化的元素(而该元素又包含指向动态分配的内存位置的指针)时,都应先遍历子内存位置并从那里开始释放,然后再遍历回父节点。
  • 始终正确处理返回动态分配的内存引用的函数返回值

    6 C++和别的语言相比有什么不同

    7 虚函数[3,4]

    7.1 作用

    允许用基类的指针来调用子类的函数

    7.2 案例

    ```cpp

    include

using namespace std;

class A { public: void foo() { cout << “A::foo() is called” << endl; } };

class B : public A { public: void foo() { cout << “B::foo() is called” << endl; } };

int main() { A a = new A(); a->foo(); B b = new B(); b->foo(); A* c = new B(); c->foo(); return 0; }

  1. 以上代码的输出为

A::foo() is called B::foo() is called A::foo() is called

  1. 前两行的输出容易理解,但是第三行中 c 应该是 class B的对象,但是却调用了 class A 的函数。为了让第三行也输出 B::foo(),需要将 class A 中的 foo() 写成虚函数
  2. ```cpp
  3. class A {
  4. public:
  5. virtual void foo() {
  6. cout << "A::foo() is called" << endl;
  7. }
  8. };

8 声明和定义的区别

  • 声明是让名字被程序知道,定义负责创建与名字关联的实体
  • 声明和定义都规定了变量的名字和类型,但定义还申请了存储空间
  • 只声明不定义,要在变量名前加 extern 且不能显示初始化变量
  • 变量只能被定义一次,但可以被声明多次

    参考

  1. https://gitee.com/vict0r/interview#%E5%A4%9A%E6%80%81
  2. https://blog.csdn.net/weixin_44718794/article/details/107071169
  3. https://www.runoob.com/w3cnote/cpp-virtual-functions.html
  4. https://baike.baidu.com/item/%E8%99%9A%E5%87%BD%E6%95%B0/2912832?fr=aladdin

持续更新