晋江文学城
下一章 上一章  目录  设置

24、9.03&&9.04 手撕排序& ...

  •   一直对c++的一些基础知识不太懂,修勾利用周末下午填鸭式教学,我就可以不用死记硬背了,大概都过一遍,也对很多知识点有了更深刻的理解
      重点是修勾还带着我手撕了几大排序算法,太开心了吧
      又是爱修勾的一天呢
      对一些智能指针,野指针,哈希冲突,内存泄漏等等都有了很清晰的了解
      后序可能会补上部分c++整理的知识点

      c++中的多态
      分为静态多态和动态多态。
      静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合适的函数就调用,没有的话就会发出警告或者报错。静态多态有函数重载、运算符重载、泛型编程等。
      动态多态是在程序运行时根据基类的引用(指针)指向的对象来确定自己具体该调用哪一个类的虚函数。当父类指针(引用)指向父类对象时,就调用父类中定义的虚函数;即当父类指针(引用)指向子类对象时,就调用子类中定义的虚函数。

      说说 C++ 中智能指针和指针的区别是什么?
      智能指针和普通指针的区别智能指针和普通指针的区别在于智能指针实际上是对普通指针加了一层封装机制,区别是它负责自动释放所指的对象,这样的一层封装机制的目的是为了使得智能指针可以方便的管理一个对象的生命期。指针是一种数据类型,用于保存内存地址,而智能指针是类模板。

      简述一下 C++ 的重载和重写
      重载:函数名相同,参数列表不同,存在于不同函数中,平行关系
      重写:函数名相同,参数列表相同,函数体不同,且必需修饰为虚函数,存在继承关系中,将原有的覆盖,是垂直关系。
      重载实现使用命名倾轧技术,编译时会根据某种规则生成不同的函数或方法名重写:用于实现多态,虚函数表,vfptr

      C/C++中的new和malloc有什么区别?
      new和malloc主要有以下三方面的区别:
      1. malloc和free是标准库函数,支持覆盖;new和delete是运算符,支持重载。
      2. malloc仅仅分配内存空间,free仅仅回收空间,不具备调用构造函数和析构函数功能,用malloc分配空间存储类的对象存在风险;new和delete除了分配回收功能外,还会调用构造函数和析构函数。
      3. malloc和free返回的是void类型指针(必须进行类型转换),new和delete返回的是具体类型指针。

      请你说说 delete 和 free 的区别
      1. delete 是运算符,是关键字需要编译器,free是库函数,需要头文件。
      2. delete 用于释放 new 分配的空间,free 有用释放 malloc 分配的空间;
      3. free 会不会调用对象的析构函数,而 delete 会调用对象的析构函数;
      4. 调用 free 之前需要检查要释放的指针是否为 NULL,使用 delete 释放内存则不需要检查指针是否为 NULL;

      说一说 C++ 和 C 中 struct 的区别以及和 class 的区别
      struct是描述一个数据结构的集合,像一周有七天,你可以把一周看成是一个结构体,然后在结构体里面定义一个数组来存放这个七天。在C语言中,定义结构体后,如果要使用该结构体定义结构体变量的话,需要在定义的前面加上struct关键字,或者通过typedef取别名,再用结构体名称进行变量定义。而在C++语言中可以直接通过结构体名称对结构体变量进行定义。在C++中包含了三种访问权限,包含public、private、protected,在C语言中只有public权限,默认没设置权限访问时是为public权限。
      class类是描述对一个对象进行封装,例如一个人,他有鼻子、眼睛、嘴巴等等属性,并且他会说话、走路、眨眼睛等等方法,将这些属性全部封装成一个框,这个框叫做类。类有利于我们程序的开发和后期的维护。在C语言中没有类的概念,C++才有类,对类的定义如下代码,类包含了三种访问权限,分别是public、private、protected。默认的属性是private权限

      请你说说 unique_ptr 的实现原理及使用场景
      实现原理建立所有权(ownership)概念,对于特定的对象,只能有一个智能指针可拥有它,这样只有拥有对象的智能指针的析构函数会删除该对象。然后,让赋值操作转让所有权,这就是用于 unique_ptr 的策略。 unique_ptr 中把拷贝构造函数和拷贝赋值声明为 private 或 delete,这样就不可以对指针指向进行拷贝了,也就不能产生指向同一个对象的指针。
      使用场景如果程序不需要多个指向同一个对象的指针,则可以使用 unique_ptr; 如果使用 new [] 分配内存,应该选择 unique_ptr; 如果函数使用 new 分配内存,并返回指向该内存的指针,将其返回类型声明为 unique_ptr 是不错的选择。

      shared_ptr 怎么知道跟它共享对象的指针释放了
      share_ptr 底层是采用引用计数的方式实现的。简单的理解,智能指针在申请堆内存空间的同时,会为其配备一个整形值(初始值为 1),每当有新对象使用此堆内存时,该整形值 +1;反之,每当使用此堆内存的对象被释放时,该整形值减 1。当堆空间对应的整形值为 0 时,即表明不再有对象使用它,该堆空间就会被释放掉。仅当最后一个指针过期时,才调用 delete。
      (后续可能会问智能指针有没有内存泄露的情况,也是关于share_ptr 的)

      weak_ptr 如何解决 shared_ptr 的循环引用问题?
      weak_ptr 是为了配合 shared_ptr 而引入的一种智能指针,它指向一个由 shared_ptr 管理的对象而不影响所指对象的生命周期,也就是将一个 weak_ptr 绑定到一个 shared_ptr 不会改变 shared_ptr 的引用计数,依此特性可以解决 shared_ptr 的循环引用问题。 weak_ptr 没有解引用 * 和获取指针 -> 运算符,它只能通过 lock 成员函数去获取对应的 shared_ptr 智能指针对象,从而获取对应的地址和内容。不论是否有 weak_ptr 指向,一旦最后一个指向对象的 shared_ptr 被销毁,对象就会被释放。

      请你回答一下智能指针有没有内存泄露的情况
      智能指针有内存泄露的情况:当两个类对象中各自有一个 shared_ptr 指向对方时,会造成循环引用,使引用计数失效,从而导致内存泄露。为了解决循环引用导致的内存泄漏,引入了弱指针weak_ptr,weak_ptr的构造函数不会修改引用计数的值,从而不会对对象的内存进行管理,其类似一个普通指针,但是不会指向引用计数的共享内存,但是可以检测到所管理的对象是否已经被释放,从而避免非法访问。

      请你说说写时拷贝
      子进程,在读时不额外复制父进程的资源,当进行写操作时,才将父进程的资源进行复制。

      请你说说什么情况会调用拷贝构造,什么时候会调用赋值操作
      拷贝构造函数的调用时机 - 用一个对象初始化另外一个对象 - 对象以值传递的方式传递给函数参数 - 函数局部对象以值传递的方式从函数返回
      赋值操作的调用时机 - 将一个对象赋值给另外一个对象

      请你说说各数据类型 sizeof 是多少,sizeof 指针是多少,sizeof 原理
      bool 1 char 1 short 2 int 4 long4 longlong8 float4 double8
      对指针变量进行 sizeof 运算,获得的是指针变量的大小,而无论是什么类型的指针,在同一平台下结果都是一样的。在 32 位平台下是 4 个字节,在 64 位平台下是 8 个字节。
      sizeof 的原理:sizeof 是在编译的时候,查找符号表,判断类型,然后根据基础类型来取值。如果 sizeof 运算符的参数是一个不定长数组,则该需要在运行时计算数组长度。

  • 昵称:
  • 评分: 2分|鲜花一捧 1分|一朵小花 0分|交流灌水 0分|别字捉虫 -1分|一块小砖 -2分|砖头一堆
  • 内容:
  •             注:1.评论时输入br/即可换行分段。
  •                 2.发布负分评论消耗的月石并不会给作者。
  •             查看评论规则>>